基于DGCNN和概率图的轻量级信息抽取模型
作者丨蘇劍林
單位丨追一科技
研究方向丨NLP,神經(jīng)網(wǎng)絡(luò)
個(gè)人主頁(yè)丨kexue.fm
前幾個(gè)月,百度舉辦了“2019語(yǔ)言與智能技術(shù)競(jìng)賽” [1],其中有三個(gè)賽道,而我對(duì)其中的“信息抽取”賽道頗感興趣,于是報(bào)名參加。經(jīng)過(guò)兩個(gè)多月的煎熬,比賽終于結(jié)束,并且最終結(jié)果已經(jīng)公布。筆者從最初的對(duì)信息抽取的一無(wú)所知,經(jīng)過(guò)這次比賽的學(xué)習(xí)和研究,最終探索出在監(jiān)督學(xué)習(xí)下做信息抽取的一些經(jīng)驗(yàn),遂在此與大家分享。
▲?信息抽取賽道:“科學(xué)空間隊(duì)”在最終測(cè)試結(jié)果上排名第七
筆者在最終的測(cè)試集上排名第七,指標(biāo) F1 為 0.8807(Precision 是 0.8939,Recall 是 0.8679),跟第一名相差 0.01 左右。從比賽角度這個(gè)成績(jī)不算突出,但自認(rèn)為模型有若干創(chuàng)新之處,比如自行設(shè)計(jì)的抽取結(jié)構(gòu)、CNN+Attention(所以足夠快速)、沒(méi)有用 Bert 等預(yù)訓(xùn)練模型,私以為這對(duì)于信息抽取的學(xué)術(shù)研究和工程應(yīng)用都有一定的參考價(jià)值。
基本分析
信息抽取(Information Extraction, IE)是從自然語(yǔ)言文本中抽取實(shí)體、屬性、關(guān)系及事件等事實(shí)類信息的文本處理技術(shù),是信息檢索、智能問(wèn)答、智能對(duì)話等人工智能應(yīng)用的重要基礎(chǔ),一直受到業(yè)界的廣泛關(guān)注。... 本次競(jìng)賽將提供業(yè)界規(guī)模最大的基于 schema 的中文信息抽取數(shù)據(jù)集(Schema based Knowledge Extraction, SKE),旨在為研究者提供學(xué)術(shù)交流平臺(tái),進(jìn)一步提升中文信息抽取技術(shù)的研究水平,推動(dòng)相關(guān)人工智能應(yīng)用的發(fā)展。?
——比賽官方網(wǎng)站介紹
?
任務(wù)介紹
本次的信息抽取任務(wù),更精確地說(shuō)是“三元組”抽取任務(wù),示例數(shù)據(jù)如下:?
??"spo_list":?[
????["九玄珠",?"連載網(wǎng)站",?"縱橫中文網(wǎng)"],
????["九玄珠",?"作者",?"龍馬"]
??]
}
就是輸入一個(gè)句子,然后輸出該句子包含的所有三元組。其中三元組是 (s, p, o) 的形式,它的 s 是 subject,即主實(shí)體,為 query 中的一個(gè)片段;而 o 是 object,即客實(shí)體,也是 query 中的一個(gè)片段;而 p 是 predicate,即兩個(gè)實(shí)體之間的關(guān)系,比賽事先給出了所有的候選 predicate 列表(schema,一共 50 個(gè)候選 predicate)??偟膩?lái)說(shuō),(s, p, o) 可以理解的“s 的 p 是 o”。?
比賽給出了將近 20 萬(wàn)的標(biāo)注數(shù)據(jù),標(biāo)注質(zhì)量也頗高,感謝百度(據(jù)說(shuō)數(shù)據(jù)集遲點(diǎn)會(huì)在http://ai.baidu.com/broad/download公開(kāi)發(fā)布,到時(shí)就可以下載了)。?
樣本特點(diǎn)
很顯然,這是一個(gè)“一對(duì)多”的抽取+分類任務(wù),通過(guò)對(duì)人工觀察樣本情況,發(fā)現(xiàn)其特點(diǎn)如下:?
1. s 和 o 未必是分詞工具分出來(lái)的詞,因此要對(duì) query 做標(biāo)注才能抽取出正確的 s、o,而考慮到分詞可能切錯(cuò)邊界,因此應(yīng)該使用基于字的輸入來(lái)標(biāo)注;?
2. 樣本中大多數(shù)的抽取結(jié)果是“一個(gè) s、多個(gè) (p, o)”的形式,比如“《戰(zhàn)狼》的主演包括吳京和余男”,那么要抽出“(戰(zhàn)狼, 主演, 吳京)”、“(戰(zhàn)狼, 主演, 余男)”;?
3. 抽取結(jié)果是“多個(gè) s、一個(gè) (p, o)”甚至是“多個(gè) s、多個(gè) (p, o)”的樣本也占有一定比例,比如“《戰(zhàn)狼》、《戰(zhàn)狼 2》的主演都是吳京”,那么要抽出“(戰(zhàn)狼, 主演, 吳京)”、“(戰(zhàn)狼 2, 主演, 吳京)”;?
4. 同一對(duì) (s, o) 也可能對(duì)應(yīng)多個(gè) p,比如“《戰(zhàn)狼》的主演和導(dǎo)演都是吳京”,那么要抽出“(戰(zhàn)狼, 主演, 吳京)”、“(戰(zhàn)狼, 導(dǎo)演, 吳京)”;?
5. 極端情況下,s、o 之間是可能重疊的,比如“《魯迅自傳》由江蘇文藝出版社出版”,嚴(yán)格上來(lái)講,除了要抽出“(魯迅自傳, 出版社, 江蘇文藝出版社)”外,還應(yīng)該抽取出“(魯迅自傳, 作者, 魯迅)”。
?
模型設(shè)計(jì)
在“樣本特點(diǎn)”一節(jié)我們列舉了 5 點(diǎn)基本的觀察結(jié)果,其中除了第 5 點(diǎn)略顯極端外,其余 4 點(diǎn)都是信息抽取任務(wù)的常見(jiàn)特點(diǎn)。在正式動(dòng)手之前,我簡(jiǎn)單調(diào)研了目前主要的信息抽取模型,發(fā)現(xiàn)竟然沒(méi)有一個(gè)模型能很好地覆蓋這 5 個(gè)特點(diǎn)。所以我放棄了已有的抽取思路,自行設(shè)計(jì)了一個(gè)基于概率圖思想的抽取方案,然后從效率出發(fā),利用 CNN+Attention 完成了這個(gè)模型。
概率圖思想
比如,一種比較基準(zhǔn)的思路是先進(jìn)行實(shí)體識(shí)別,然后對(duì)識(shí)別出的實(shí)體進(jìn)行關(guān)系分類,但這種思路無(wú)法很好地處理同一組 (s, o) 對(duì)應(yīng)多個(gè) p 的情況,同時(shí)會(huì)存在采樣效率地的問(wèn)題。
另一種思路是作為一個(gè)整體的序列標(biāo)注來(lái)搞,參考論文 Joint Extraction of Entities and Relations Based on a Novel Tagging Scheme [2],但這種設(shè)計(jì)不能很好地處理同時(shí)有多個(gè) s、多個(gè) o 的情況,需要非常丑陋的“就近原則”;還有“殺雞用牛刀”地動(dòng)用強(qiáng)化學(xué)習(xí)的方法...而無(wú)一例外地,這些方法都不能解決 s、o 有重疊的情況。?
信息抽取研究了這么多年,居然連上述幾個(gè)基本問(wèn)題都沒(méi)有解決,在我看來(lái)是十分不可思議的。而我自己的原則是:不優(yōu)雅的設(shè)計(jì)必須拋棄,所以我決定放棄我了解到的所有抽取思路,自行設(shè)計(jì)一個(gè)抽取方案。為此,我考慮到了類似 seq2seq 的概率圖思路。?
做過(guò) seq2seq 的朋友都知道,解碼器實(shí)際上在建模:
實(shí)際預(yù)測(cè)的時(shí)候,是先通過(guò) x 來(lái)預(yù)測(cè)第一個(gè)單詞,然后假設(shè)第一個(gè)單詞已知來(lái)預(yù)測(cè)第二個(gè)單詞,依此遞推,直到出現(xiàn)結(jié)束標(biāo)記。那抽取三元組為什么不參考這個(gè)思路呢?我們考慮:
也就是說(shuō),我們可以先預(yù)測(cè) s,然后傳入 s 來(lái)預(yù)測(cè)該 s 對(duì)應(yīng)的 o,然后傳入 s、o 來(lái)預(yù)測(cè)所傳入的 s、o 的關(guān)系 p,實(shí)際應(yīng)用中,我們還可以把 o、p 的預(yù)測(cè)合并為一步,所以總的步驟只需要兩步:先預(yù)測(cè) s,然后傳入 s 來(lái)預(yù)測(cè)該 s 所對(duì)應(yīng)的 o 及 p。
理論上,上述模型只能抽取單一一個(gè)三元組,而為了處理可能由多個(gè) s、多個(gè) o 甚至多個(gè) p 的情況,我們?nèi)渴褂谩鞍胫羔?半標(biāo)注”結(jié)構(gòu)(說(shuō)白了,將 softmx 換成 sigmoid,在基于CNN的閱讀理解式問(wèn)答模型:DGCNN一文中也介紹過(guò)),并且在關(guān)系分類的時(shí)候也使用 sigmoid 而不是 softmax 激活。
經(jīng)過(guò)這樣的設(shè)計(jì)后,最終的模型可以非常簡(jiǎn)單高效地解碼,并且完全覆蓋了“樣本特點(diǎn)”列舉的 5 個(gè)特點(diǎn)。
注 1:為什么不先預(yù)測(cè) o 然后再預(yù)測(cè) s 及對(duì)應(yīng)的 p??
那是因?yàn)橐朐诘诙筋A(yù)測(cè)的時(shí)候要采樣傳入第一步的結(jié)果(而且只采樣一個(gè)),而前面已經(jīng)分析了,多數(shù)樣本的 o 的數(shù)目比 s 的數(shù)目要多,所以我們先預(yù)測(cè) s,然后傳入 s 再預(yù)測(cè) o、p 的時(shí)候,對(duì) s 的采樣就很容易充分了(因?yàn)?s 少),反過(guò)來(lái)如果要對(duì) o 進(jìn)行采樣就不那么容易充分(因?yàn)?o 可能很多)。?
帶著這個(gè)問(wèn)題繼續(xù)讀下去,讀者會(huì)更清楚地認(rèn)識(shí)到這一點(diǎn)。?
注 2:刷到最近的 arXiv 論文,發(fā)現(xiàn)在思想上,本文的這種抽取設(shè)計(jì)與文章 Entity-Relation Extraction as Multi-Turn Question Answering?[3]類似。?
整體結(jié)構(gòu)
至此,我們已經(jīng)用相當(dāng)長(zhǎng)的篇幅說(shuō)明了模型的抽取思想,即先識(shí)別 s,然后傳入 s 來(lái)同時(shí)識(shí)別 p 和 o。現(xiàn)在來(lái)介紹本文模型整體結(jié)構(gòu)。?
為了保證效率,模型使用了 CNN+Attention 的結(jié)構(gòu)(外加了一個(gè)短序列的 LSTM,由于序列很短,所以即使是 LSTM 也不影響效率),沒(méi)有用以慢著稱的 Bert 之類的預(yù)訓(xùn)練模型。其中 CNN 沿用了之前介紹過(guò)的 DGCNN,Attention 是用了 Google 力推的 Self Attention,整體結(jié)構(gòu)示意圖如下圖。
▲?本文的信息抽取模型示意圖。這里輸入句子是“《戰(zhàn)狼2》的主演吳京生于1974年”,而要抽出的三元組是“(戰(zhàn)狼2, 主演, 吳京)”和“(吳京, 出生日期, 1974年)”
具體來(lái)說(shuō),模型的處理流程為:?
1. 輸入字 id 序列,然后通過(guò)字詞混合 Embedding(具體的混合方式后面再介紹)得到對(duì)應(yīng)的字向量序列,然后加上 Position Embedding;?
2. 將得到“字-詞-位置 Embedding”輸入到 12 層 DGCNN 中進(jìn)行編碼,得到編碼后的序列(記為 H);?
3. 將 H 傳入一層 Self Attention 后,將輸出結(jié)果與先驗(yàn)特征進(jìn)行拼接(先驗(yàn)特征可加可不加,構(gòu)建方式后面再詳細(xì)介紹);?
4. 將拼接后的結(jié)果傳入 CNN、Dense,用“半指針-半標(biāo)注”結(jié)構(gòu)預(yù)測(cè) s 的首、尾位置;?
5. 訓(xùn)練時(shí)隨機(jī)采樣一個(gè)標(biāo)注的 s(預(yù)測(cè)時(shí)逐一遍歷所有的 s),然后將 H 對(duì)應(yīng)此 s 的子序列傳入到一個(gè)雙向 LSTM 中,得到 s 的編碼向量,然后加上相對(duì)位置的 Position Embedding,得到一個(gè)與輸入序列等長(zhǎng)的向量序列;?
6. 將 H 傳入另一層 Self Attention 后,將輸出結(jié)果與第 5 步輸出的向量序列、先驗(yàn)特征進(jìn)行拼接(先驗(yàn)特征可加可不加,構(gòu)建方式后面再詳細(xì)介紹);?
7. 將拼接后的結(jié)果傳入 CNN、Dense,對(duì)于每一種 p,都構(gòu)建一個(gè)“半指針-半標(biāo)注”結(jié)構(gòu)來(lái)預(yù)測(cè)對(duì)應(yīng)的 o 的首、尾位置,這樣就同時(shí)把 o、p 都預(yù)測(cè)出來(lái)了。?
該模型與我早期開(kāi)源的一個(gè) baseline 模型(https://github.com/bojone/kg-2019-baseline)已有較大區(qū)別,望讀者知悉。?
另外,關(guān)于讀者的可能有的兩個(gè)疑惑,在此先回答好了。第一是“為什么第 5 步只采樣一個(gè) s?”,這個(gè)問(wèn)題的答案很簡(jiǎn)單,一是因?yàn)椴蓸右粋€(gè)就夠了(采樣多個(gè)等效增大 batch size),二是因?yàn)椴蓸右粋€(gè)比較好操作,我建議不明白的讀者好好想明白這一步再來(lái)讀下去。
第二是“為什么要不用Bert?”,這個(gè)問(wèn)題其實(shí)很無(wú)聊,為什么要問(wèn)這個(gè)問(wèn)題呢,我不愛(ài)用不行嗎?具體的原因是我一直以來(lái)就對(duì) Bert 沒(méi)什么好感,所以我也沒(méi)怎么琢磨 Bert 的 fine tune,直到前不久我才上手了 Bert 的 fine tune,所以比賽中也就沒(méi)用了。而且基于 Bert 的 fine tune 實(shí)在是沒(méi)有什么意思,效率又低,又體現(xiàn)不了個(gè)人的價(jià)值,如無(wú)必要,實(shí)在是不想使用。關(guān)于 Bert 的做法,在比賽截止前幾天也嘗試了一下,后面另寫(xiě)文章分享吧。
模型細(xì)節(jié)
前面我們已經(jīng)介紹了模型的設(shè)計(jì)思想與整體結(jié)構(gòu),現(xiàn)在我們來(lái)看模型的實(shí)現(xiàn)細(xì)節(jié)。?
字詞混合Embedding
開(kāi)頭部分我們已經(jīng)說(shuō)了,為了最大程度上避免邊界切分出錯(cuò),我們應(yīng)當(dāng)選擇字標(biāo)注的方式,即以字為基本單位進(jìn)行輸入。不過(guò),單純的字 Embedding 難以儲(chǔ)存有效的語(yǔ)義信息,換句話說(shuō),單個(gè)字基本上是沒(méi)有語(yǔ)義的,更為有效地融入語(yǔ)義信息的方案應(yīng)該是“字詞混合 Embedding”。?
在本次比賽的模型中,筆者使用了一種自行設(shè)計(jì)的字詞混合方式。
首先,我們輸入以字為單位的文本序列,經(jīng)過(guò)一個(gè)字 Embedding 層后得到字向量序列;然后將文本分詞,通過(guò)一個(gè)預(yù)訓(xùn)練好的 Word2Vec 模型來(lái)提取對(duì)應(yīng)的詞向量,為了得到跟字向量對(duì)齊的詞向量序列,我們可以將每個(gè)詞的詞向量重復(fù)“詞的字?jǐn)?shù)”那么多次;得到對(duì)齊的詞向量序列后,我們將詞向量序列經(jīng)過(guò)一個(gè)矩陣變換到跟字向量一樣的維度,并將兩者。整個(gè)過(guò)程如下圖:
▲?本模型所使用的字詞混合Embedding方式圖示
實(shí)現(xiàn)上,筆者使用 pyhanlp 作為分詞工具,用 1000 萬(wàn)條百度百科詞條訓(xùn)練了一個(gè) Word2Vec 模型(Skip Gram + 負(fù)采樣),而字向量則使用隨機(jī)初始化的字 Embedding 層。
在模型訓(xùn)練過(guò)程中,固定 Word2Vec 詞向量不變,只優(yōu)化變換矩陣和字向量,從另一個(gè)角度看也可以認(rèn)為是我們是通過(guò)字向量和變換矩陣對(duì) Word2Vec 的詞向量進(jìn)行微調(diào)。這樣一來(lái),我們既融合了預(yù)訓(xùn)練詞向量模型所帶來(lái)的先驗(yàn)語(yǔ)義信息,又保留了字向量的靈活性。?
根據(jù)筆者自己的目測(cè),相比單純使用字向量,這種字詞混合的方式能提升最終的效果約 1%~2%,提升是可觀的,并且我在其他任務(wù)上也實(shí)驗(yàn)過(guò)這個(gè)方案,均有差不多幅度的提升,證明了這種混合方式的有效性。不同的預(yù)訓(xùn)練詞向量模型對(duì)效果會(huì)有一定的影響,但不會(huì)特別大(千分之五以下),我也試過(guò)直接使用騰訊 AI LAB 所提供的詞向量 [4](但只用了前 100 萬(wàn)個(gè)詞),結(jié)果差不多。?
Position Embedding
由于主要使用 CNN+Attention 進(jìn)行編碼,所以編碼出的向量序列“位置感”不夠強(qiáng),但就本次比賽的數(shù)據(jù)而言,位置信息是有一定的價(jià)值的,比如 s 通常出現(xiàn)在句子開(kāi)頭部分,又比如 o 通常出現(xiàn)在 s 附近。加入位置信息的一個(gè)有效信息是 Position Embedding,而不同于之前所介紹的由公式直接計(jì)算而來(lái)的 Position Embedding,本次模型使用了可優(yōu)化的 Position Embedding。?
具體做法是設(shè)定一個(gè)最大長(zhǎng)度為 512(印象中所有樣本的句子長(zhǎng)度不超過(guò) 300),然后全零初始化一個(gè)新的 Embedding 層(維度跟字向量維度一樣),傳入位置 ID 后輸出對(duì)應(yīng)的 Position Embedding,并把這個(gè) Position Embedding 加到前面的字詞混合 Embedding 中,作為完整的 Embedding 結(jié)果,傳入到下述 DGCNN 編碼中。?
模型另一處用到了 Position Embedding 是在編碼 s 的時(shí)候,采樣得到的 s 經(jīng)過(guò) BiLSTM 進(jìn)行編碼后,得到一個(gè)固定大小的向量,然后我們將它復(fù)制拼接到原來(lái)的編碼序列中,作為預(yù)測(cè) o、p 的條件之一。
不過(guò)考慮到 o 更可能是 s 附近的詞,所以筆者并非直接統(tǒng)一復(fù)制,而是復(fù)制同時(shí)還加上了當(dāng)前位置相對(duì)于 s 所謂位置的“相對(duì)位置向量”(如果對(duì)此描述還感覺(jué)模糊,請(qǐng)直接閱讀源碼),它跟開(kāi)頭的輸入共用同一個(gè) Embedding 層。?
DGCNN?
DGCNN 在之前的基于CNN的閱讀理解式問(wèn)答模型:DGCNN一文已經(jīng)介紹過(guò),是筆者之前做閱讀理解模型時(shí)所提出的設(shè)計(jì),它其實(shí)就是“膨脹門卷積”,其中門卷積的概念來(lái)自 Convolutional Sequence to Sequence Learning [5],在那論文中被稱為 GLU (Gated Linear Units),然后筆者通過(guò)把普通卷積換成了膨脹卷積來(lái)增加感受野。類似的做法出現(xiàn)在論文 Fast Reading Comprehension with ConvNets?[6]。
▲?殘差與門卷積的結(jié)合,達(dá)到多通道傳輸?shù)男Ч?/span>
當(dāng)輸入輸出維度一樣時(shí),DGCNN 可以加上殘差,而之前筆者就證明了加上殘差之后的 DGCNN 在數(shù)學(xué)上等價(jià)于 Highway 形式的膨脹卷積:
本次模型都是使用這種形式的 DGCNN,它體現(xiàn)了信息的選擇性多通道傳輸。
最后的模型共使用了 12 層 DGCNN,膨脹率依次為 [1,2,5,1,2,5,1,2,5,1,1,1],即 [1,2,5] 重復(fù)三次(顆粒度從細(xì)到粗反復(fù)學(xué)習(xí)),然后 [1,1,1](細(xì)顆粒度精調(diào))。?
遠(yuǎn)程監(jiān)督的先驗(yàn)特征
?
本次比賽不允許使用額外的三元組知識(shí)庫(kù),但是我們可以將訓(xùn)練集里邊所有的三元組整合成一個(gè)知識(shí)庫(kù),然后面對(duì)一個(gè)新句子時(shí),直接從這個(gè)知識(shí)庫(kù)中進(jìn)行遠(yuǎn)程監(jiān)督式的搜索,得到這個(gè)句子的一些候選三元組。
所謂遠(yuǎn)程監(jiān)督,就是指如果一個(gè)句子的某兩個(gè)實(shí)體剛好是知識(shí)庫(kù)的某個(gè)三元組的 s 和 o,那么就把這個(gè)三元組抽取出來(lái)作為候選三元組。這樣一來(lái),只要有一個(gè)知識(shí)庫(kù),那么我們可以用純粹檢索的方法來(lái)抽出任意一個(gè)句子的候選三元組。不過(guò)要注意的是,這僅僅是候選的三元組,而且有可能抽取出來(lái)的三元組全是錯(cuò)的。?
對(duì)于遠(yuǎn)程監(jiān)督的結(jié)果,筆者的使用方法是:將遠(yuǎn)程監(jiān)督的結(jié)果作為特征傳入到模型中。首先,將所有遠(yuǎn)程監(jiān)督得到的 s 構(gòu)成一個(gè)跟標(biāo)注結(jié)構(gòu)類似的 0/1 向量,然后拼接到編碼向量序列,然后再進(jìn)行 s 的預(yù)測(cè);然后將所有遠(yuǎn)程監(jiān)督得到的 o 及對(duì)應(yīng)的 p 也構(gòu)成一個(gè)跟標(biāo)注結(jié)構(gòu)類似的 0/1 向量,拼接到編碼向量序列后再進(jìn)行 o、p 的預(yù)測(cè)。具體實(shí)現(xiàn)方法請(qǐng)參考開(kāi)源代碼。
要提醒的是,在訓(xùn)練的時(shí)候,構(gòu)建遠(yuǎn)程監(jiān)督特征時(shí)要先排除當(dāng)前訓(xùn)練樣本自身的三元組,即只能借助其他樣本的三元組來(lái)生成當(dāng)前樣本的遠(yuǎn)程監(jiān)督結(jié)果,這樣才能模擬測(cè)試集的使用情況。?
效果上,加入遠(yuǎn)程監(jiān)督的先驗(yàn)特征后,模型在線下驗(yàn)證集的提升非??捎^,達(dá)到了 2% 以上!并且已經(jīng)反復(fù)確認(rèn),代碼中不存在“使用未來(lái)信息”的漏洞,也就是說(shuō),這個(gè)線下結(jié)果是合理的。但是非常遺憾,線上測(cè)試集的結(jié)果卻跟沒(méi)有加先驗(yàn)特征差不多,也就是幾乎沒(méi)有提升。但是通過(guò)觀測(cè)發(fā)現(xiàn)加不加先驗(yàn)特征給出來(lái)的結(jié)果差異是比較大的,所以最后將兩者的結(jié)果進(jìn)行融合了。?
其他補(bǔ)充內(nèi)容
在我的代碼實(shí)現(xiàn)中,還包括了一些額外的輔助模塊,包括代碼中的變量 pn1、pn2、pc、po,這些模塊從理論上提供了一些“全局信息”,pn1、pn2 可以認(rèn)為是全局的實(shí)體識(shí)別模塊,而 pc 可以認(rèn)為是全局的關(guān)系檢測(cè)模塊,po 可以認(rèn)為是全局的關(guān)系存在性判斷,這些模塊都不單獨(dú)訓(xùn)練,而是直接乘到 s、o 的預(yù)測(cè)結(jié)果上。?
這些模型基本上不會(huì)影響最終的效果,但能起到加速訓(xùn)練的作用,而且個(gè)人直覺(jué)上感覺(jué)加上這些模塊可能會(huì)更合理一些。?
此外,還有前面提到隨機(jī)采樣 s 后,將 s 對(duì)應(yīng)的向量序列傳入到 BiLSTM 中編碼,實(shí)現(xiàn)的時(shí)候有所差別,是通過(guò) s 的首尾 id 均勻插值后取出 s 的固定數(shù)目個(gè)(模型選了 6 個(gè))向量來(lái)構(gòu)成一個(gè)定長(zhǎng)向量序列傳入到 BiLSTM 中編碼,這樣做主要是為了避免處理 s 不定長(zhǎng)的問(wèn)題。
實(shí)驗(yàn)煉丹
最后,介紹一些模型訓(xùn)練過(guò)程中的細(xì)節(jié)問(wèn)題。?
模型代碼:https://github.com/bojone/kg-2019?
代碼測(cè)試環(huán)境是 Python 2.7 + Keras 2.2.4 + Tensorflow 1.8。?
如果本文的模型對(duì)你的后續(xù)工作有幫助,煩請(qǐng)注明一下(其實(shí)也不是太奢望):?
??jianlin2019bdkgf,
??title={A?Hierachical?Relation?Extraction?Model?with?Pointer-Tagging?Hybrid?Structure},
??author={Jianlin?Su},
??year={2019},
??publisher={GitHub},
??howpublished={\url{https://github.com/bojone/kg-2019}},
}
基本的訓(xùn)練過(guò)程
首先是損失函數(shù)的選擇,由于“半指針-半標(biāo)注”實(shí)際上就是兩個(gè)二分類,所以損失函數(shù)依然用二分類交叉熵。注意 s 的預(yù)測(cè)只有兩個(gè) 2 分類,而預(yù)測(cè) o 的同時(shí)還預(yù)測(cè)了 p,所以 o 的預(yù)測(cè)實(shí)際上有 100=50×2 個(gè) 2 分類,但它們的損失函數(shù)依然按照 1:1 相加。
換句話說(shuō),按照 loss 的絕對(duì)值來(lái)看,o 的 loss 是 s 的 loss 的 50 倍。乍看之下有點(diǎn)反直覺(jué),因?yàn)橄阮A(yù)測(cè) s 然后再預(yù)測(cè) o,似乎 s 的權(quán)重應(yīng)該更大(因?yàn)槿绻?s 錯(cuò)了那么預(yù)測(cè)結(jié)果肯定錯(cuò)),但實(shí)驗(yàn)結(jié)果表明 s、o 同樣重要。此外,諸如 focal loss 之類的交叉熵變種對(duì)最終結(jié)果的提升并沒(méi)有幫助。
模型使用 Adam 優(yōu)化器進(jìn)行訓(xùn)練,先用的學(xué)習(xí)率訓(xùn)練不超過(guò) 50 個(gè) epoch,然后加載訓(xùn)練的最優(yōu)結(jié)果,再用的學(xué)習(xí)率繼續(xù)訓(xùn)練到最優(yōu)。第一個(gè) epoch 用來(lái) WarmUp,如果不進(jìn)行 WarmUp 可能不收斂。?
為了保證訓(xùn)練結(jié)果穩(wěn)定提升,模型用到了 EMA(Exponential Moving Average),衰減率為 0.9999。
解碼過(guò)程調(diào)優(yōu)
模型的解碼過(guò)程有比較大的調(diào)優(yōu)空間。“半指針-半編碼結(jié)構(gòu)”用兩個(gè) sigmoid 激活的標(biāo)注方式來(lái)分別標(biāo)注實(shí)體的首和尾,而為了解碼就需要一個(gè)閾值,即超過(guò)多少閾值就認(rèn)為此處出現(xiàn)了實(shí)體。一般來(lái)說(shuō)二分類的閾值為 0.5,但在本次模型中,發(fā)現(xiàn)將“首”的閾值設(shè)為 0.5,將“尾”的閾值設(shè)為 0.4,解碼結(jié)果的 F1 最佳。?
此外,這次比較的測(cè)試集有一個(gè)特點(diǎn),就是測(cè)試集的質(zhì)量非常高,即抽取結(jié)果錯(cuò)漏很少而且很規(guī)范。相比之下,訓(xùn)練集的錯(cuò)漏相對(duì)多一些,而且規(guī)范性可能也沒(méi)那么嚴(yán)格。所以,我們需要通過(guò)后期規(guī)則調(diào)整預(yù)測(cè)結(jié)果來(lái)滿足官方給出的一些規(guī)范性。
在比賽截止日期的前幾天,各個(gè)隊(duì)伍的提升都非常明顯,我估計(jì)大家都是在不斷地找規(guī)則來(lái)修正預(yù)測(cè)結(jié)果,從而提升的效果,筆者個(gè)人也是通過(guò)一些規(guī)則獲得了將近 1% 的提升!不過(guò)這些純粹是比賽的 trick,不在學(xué)術(shù)范圍內(nèi),不做過(guò)多討論。?
模型平均與融合
模型的 ensemble 是提升最終效果的有力方法,針對(duì)本次任務(wù),筆者使用了分層 ensemble 的方案。?
前面已經(jīng)說(shuō)過(guò),加不加先驗(yàn)特征的線上效果都差不多,但是結(jié)果文件差異性比較大,為此,可以將兩個(gè)模型的結(jié)果取并集,而在取并集之前,則通過(guò)模型平均的方法提高單一模型的準(zhǔn)確性。
具體來(lái)說(shuō),先不加先驗(yàn)特征,然后將所有數(shù)據(jù)隨機(jī)打亂并且分成 8 份,做 8 折的交叉驗(yàn)證,從而得到 8 個(gè)不加先驗(yàn)特征的模型;然后加上先驗(yàn)特征重做一次,得到另外 8 個(gè)加上先驗(yàn)特征的模型。?
得到這 16 個(gè)模型后,將不加先驗(yàn)特征的 8 個(gè)模型進(jìn)行平均融合(如下圖,即將輸出的概率進(jìn)行平均,然后再解碼出三元組),再將加了先驗(yàn)特征的 8 個(gè)模型進(jìn)行平均融合,這樣一共得到兩份結(jié)果文件,由于進(jìn)行了平均融合,可以認(rèn)為這兩份結(jié)果文件的精度都有了保證,最后,將這兩份結(jié)果文件取并集。
▲?基于交叉驗(yàn)證的單模型融合
知識(shí)蒸餾
前面已經(jīng)說(shuō)過(guò),測(cè)試集可以認(rèn)為是非常完美的,而訓(xùn)練集卻是有一定缺漏和不規(guī)范的(當(dāng)然大部分是好的),因此,我們使用了一種類似知識(shí)蒸餾的方式來(lái)重新整理訓(xùn)練集,改善訓(xùn)練集質(zhì)量。?
首先,我們使用原始訓(xùn)練集加交叉驗(yàn)證的方式,得到了 8 個(gè)模型(不加遠(yuǎn)程監(jiān)督特征),然后用這 8 個(gè)模型對(duì)訓(xùn)練集進(jìn)行預(yù)測(cè),得到關(guān)于訓(xùn)練集的 8 份預(yù)測(cè)結(jié)果。
如果某個(gè)樣本的某個(gè)三元組同時(shí)出現(xiàn)在 8 份預(yù)測(cè)結(jié)果中但沒(méi)有出現(xiàn)在訓(xùn)練集的標(biāo)注中,那么就將這個(gè)三元組補(bǔ)充到該樣本的標(biāo)注結(jié)果中;如果某個(gè)樣本的某個(gè)三元組在 8 份預(yù)測(cè)結(jié)果中都沒(méi)有出現(xiàn)但卻被訓(xùn)練集標(biāo)注了,那么將這個(gè)三元組從該樣本的標(biāo)注結(jié)果中去掉。?
這樣一增一減之后,訓(xùn)練集就會(huì)完善很多,用這個(gè)修正后的訓(xùn)練集重新訓(xùn)練和融合模型,能在線上的測(cè)試集上獲得將近 1% 的提升。當(dāng)然不排除刪減這一步會(huì)錯(cuò)誤地去掉一些困難樣本的標(biāo)注結(jié)果,但是也無(wú)妨了,知識(shí)蒸餾的意思就是集中火力攻克主要矛盾。?
提升效率的策略
“高效”是本模型的一個(gè)顯著特點(diǎn),哪怕是前述的共 16 個(gè)模型進(jìn)行 ensemble,完成最后測(cè)試集(共約 10 萬(wàn)個(gè)樣本)的預(yù)測(cè)只花了 4 個(gè)小時(shí)(如果服務(wù)器的 CPU 更好些,可以縮短到 2 小時(shí)左右),而在比賽群里討論知道,最后的測(cè)試集預(yù)測(cè)很多隊(duì)伍都花了十幾個(gè)小時(shí)以上,有些隊(duì)伍甚至花了幾天幾夜。?
當(dāng)然,效率的追求是無(wú)止境的,除了硬件上的升級(jí),在工程上很多時(shí)候我們還可以犧牲一點(diǎn)效果來(lái)?yè)Q取更高的速度。對(duì)于本模型,可以化簡(jiǎn)某些模塊,來(lái)?yè)Q取速度的大幅度提升。
比如,可以將 12 層 DGCNN 改為膨脹率依次為 [1,2,5,1,2,5] 的六層。還有,前面介紹編碼 s 用了 BiLSTM,其實(shí)也可以直接將 s 的首位和末位對(duì)應(yīng)的編碼向量拼接起來(lái)作為最終的編碼結(jié)果,省去了 BiLSTM 的計(jì)算量。
此外,還可以考慮減少 Word2Vec 模型的詞匯量,這也能提高生成詞向量序列的速度,如果愿意放棄更多的精度,那么也可以考慮去掉字詞混合 Embedding,直接單純使用字 Embedding。?
經(jīng)過(guò)這樣處理,模型的速度可以提升 5 倍以上,而性能下降大概是 2%~4% 左右,具體幅度取決于你怎么取舍了。
文章總結(jié)
文章用比較長(zhǎng)的篇幅記錄了筆者參加這次比賽的模型和煉丹經(jīng)歷。
在參加比賽之前,筆者對(duì)信息抽取乃至知識(shí)圖譜領(lǐng)域基本上是處于一無(wú)所知狀態(tài),所以參加這個(gè)比賽的時(shí)候,完全是憑著自己的直覺(jué)來(lái)設(shè)計(jì)模型且調(diào)參的(當(dāng)然也有一部分原因是經(jīng)過(guò)調(diào)研后發(fā)現(xiàn)主流的信息抽取模型都不能讓我滿意)。所以,最終交出的這份答卷和獲得的成績(jī),是我比較滿意的結(jié)果了。
當(dāng)然,本文的模型有不少“閉門造車”之處,如果讀者覺(jué)得有什么不妥的地方,歡迎大力吐槽。即便是在這個(gè)比賽之后,在信息抽取、知識(shí)圖譜這一塊,筆者依然還算是一個(gè)新手,望相關(guān)前輩們多多指教。
相關(guān)鏈接
[1]?http://lic2019.ccf.org.cn/
[2]?Suncong Zheng, Feng Wang, Hongyun Bao, Yuexing Hao, Peng Zhou, Bo Xu.?Joint Extraction of Entities and Relations Based on a Novel Tagging Scheme. ACL 2017.
[3]?Xiaoya Li, Fan Yin, Zijun Sun, Xiayu Li, Arianna Yuan, Duo Chai, Mingxin Zhou, Jiwei Li.?Entity-Relation Extraction as Multi-Turn Question Answering.?ACL 2019.
[4]?https://ai.tencent.com/ailab/nlp/embedding.html
[5]?Jonas Gehring, Michael Auli, David Grangier, Denis Yarats, Yann N. Dauphin.?Convolutional Sequence to Sequence Learning.?arXiv: 1705.03122.
[6]?Felix Wu, Ni Lao, John Blitzer, Guandao Yang, Kilian Weinberger.?Fast Reading Comprehension with ConvNets.?ICLR 2018.
點(diǎn)擊以下標(biāo)題查看作者其他文章:?
變分自編碼器VAE:原來(lái)是這么一回事 | 附源碼
再談變分自編碼器VAE:從貝葉斯觀點(diǎn)出發(fā)
變分自編碼器VAE:這樣做為什么能成?
簡(jiǎn)單修改,讓GAN的判別器秒變編碼器
深度學(xué)習(xí)中的互信息:無(wú)監(jiān)督提取特征
全新視角:用變分推斷統(tǒng)一理解生成模型
細(xì)水長(zhǎng)flow之NICE:流模型的基本概念與實(shí)現(xiàn)
細(xì)水長(zhǎng)flow之f-VAEs:Glow與VAEs的聯(lián)姻
深度學(xué)習(xí)中的Lipschitz約束:泛化與生成模型
#投 稿 通 道#
?讓你的論文被更多人看到?
如何才能讓更多的優(yōu)質(zhì)內(nèi)容以更短路徑到達(dá)讀者群體,縮短讀者尋找優(yōu)質(zhì)內(nèi)容的成本呢?答案就是:你不認(rèn)識(shí)的人。
總有一些你不認(rèn)識(shí)的人,知道你想知道的東西。PaperWeekly 或許可以成為一座橋梁,促使不同背景、不同方向的學(xué)者和學(xué)術(shù)靈感相互碰撞,迸發(fā)出更多的可能性。
PaperWeekly 鼓勵(lì)高校實(shí)驗(yàn)室或個(gè)人,在我們的平臺(tái)上分享各類優(yōu)質(zhì)內(nèi)容,可以是最新論文解讀,也可以是學(xué)習(xí)心得或技術(shù)干貨。我們的目的只有一個(gè),讓知識(shí)真正流動(dòng)起來(lái)。
??來(lái)稿標(biāo)準(zhǔn):
? 稿件確系個(gè)人原創(chuàng)作品,來(lái)稿需注明作者個(gè)人信息(姓名+學(xué)校/工作單位+學(xué)歷/職位+研究方向)?
? 如果文章并非首發(fā),請(qǐng)?jiān)谕陡鍟r(shí)提醒并附上所有已發(fā)布鏈接?
? PaperWeekly 默認(rèn)每篇文章都是首發(fā),均會(huì)添加“原創(chuàng)”標(biāo)志
? 投稿郵箱:
? 投稿郵箱:hr@paperweekly.site?
? 所有文章配圖,請(qǐng)單獨(dú)在附件中發(fā)送?
? 請(qǐng)留下即時(shí)聯(lián)系方式(微信或手機(jī)),以便我們?cè)诰庉嫲l(fā)布時(shí)和作者溝通
?
現(xiàn)在,在「知乎」也能找到我們了
進(jìn)入知乎首頁(yè)搜索「PaperWeekly」
點(diǎn)擊「關(guān)注」訂閱我們的專欄吧
關(guān)于PaperWeekly
PaperWeekly 是一個(gè)推薦、解讀、討論、報(bào)道人工智能前沿論文成果的學(xué)術(shù)平臺(tái)。如果你研究或從事 AI 領(lǐng)域,歡迎在公眾號(hào)后臺(tái)點(diǎn)擊「交流群」,小助手將把你帶入 PaperWeekly 的交流群里。
▽ 點(diǎn)擊 |?閱讀原文?| 查看作者博客
總結(jié)
以上是生活随笔為你收集整理的基于DGCNN和概率图的轻量级信息抽取模型的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 赠票福利 | 2019,GMIS归来!杨
- 下一篇: 会议邀请 | 中国中文信息学会暑期学校《