基于CNN的阅读理解式问答模型:DGCNN
作者丨蘇劍林
單位丨廣州火焰信息科技有限公司
研究方向丨NLP,神經(jīng)網(wǎng)絡(luò)
個(gè)人主頁丨kexue.fm
早在年初的一文讀懂「Attention is All You Need」| 附代碼實(shí)現(xiàn)中就已經(jīng)承諾過會(huì)分享 CNN 在 NLP 中的使用心得,然而一直不得其便。這幾天終于下定決心來整理一下相關(guān)的內(nèi)容了。
背景
事不宜遲,先來介紹一下模型的基本情況。
模型特點(diǎn)
本模型——我稱之為 DGCNN——是基于 CNN 和簡單的 Attention 的模型,由于沒有用到 RNN 結(jié)構(gòu),因此速度相當(dāng)快,而且是專門為這種 WebQA 式的任務(wù)定制的,因此也相當(dāng)輕量級。
SQUAD 排行榜前面的模型,如 AoA、R-Net 等,都用到了 RNN,并且還伴有比較復(fù)雜的注意力交互機(jī)制,而這些東西在 DGCNN 中基本都沒有出現(xiàn)。?
這是一個(gè)在 GTX1060 上都可以幾個(gè)小時(shí)訓(xùn)練完成的模型!
▲?截止到2018.04.14的排行榜
DGCNN,全名為 Dilate Gated Convolutional Neural Network,即“膨脹門卷積神經(jīng)網(wǎng)絡(luò)”,顧名思義,融合了兩個(gè)比較新的卷積用法:膨脹卷積、門卷積,并增加了一些人工特征和 trick,最終使得模型在輕、快的基礎(chǔ)上達(dá)到最佳的效果。
在本文撰寫之時(shí),本文要介紹的模型還位于榜首,得分(得分是準(zhǔn)確率與 F1 的平均)為 0.7583,而且是到目前為止唯一一個(gè)一直沒有跌出前三名、并且獲得周冠軍次數(shù)最多的模型。
比賽情況
其實(shí)這個(gè)模型是我代表“廣州火焰科技有限公司”參加 CIPS-SOGOU 問答比賽的產(chǎn)物。這個(gè)比賽在去年十月份開始,然而有點(diǎn)虎頭蛇尾,到現(xiàn)在依然還是不上不下的(沒有結(jié)束的跡象,也沒有繼續(xù)新任務(wù)的跡象)。?
其實(shí)剛開始的兩三個(gè)月,競爭還是蠻激烈的,很多公司和大學(xué)都提交了模型,排行榜一直不斷刷新。所以我覺得 SOGOU 這樣虎頭蛇尾未免有點(diǎn)對不起大家當(dāng)初提交的熱情。
最關(guān)鍵是,它究竟是有什么計(jì)劃、有什么變動(dòng),包括比賽的結(jié)束時(shí)間,一直都沒公開發(fā)出什么通知,就一直把選手晾在那里。我后來打聽到,截止時(shí)間是今年的 CIPS 舉辦前...一個(gè)比賽持續(xù)舉辦一年?
賽題簡述
到目前為止,SOGOU 的這個(gè)比賽只舉辦了事實(shí)類的部分,而事實(shí)類的部分基本上是跟百度之前開放的 WebQA 語料集 [1] 一樣的,即“一個(gè)問題 + 多段材料”的格式,希望從多段材料中共同決策出問題的精準(zhǔn)答案(一般是一個(gè)實(shí)體片段)。
相比 WebQA,搜狗提供的訓(xùn)練集噪聲大得多,這也使得預(yù)測難度加大。
此外,我認(rèn)為這種 WebQA 式的任務(wù)是偏向于檢索匹配以及初步的語義理解技術(shù),跟國外類似的任務(wù) SQUAD(一段長材料 + 多個(gè)問題)是有比較大的區(qū)別的,SQUAD 的語料中,部分問題還涉及到了比較復(fù)雜的推理,因此 SQUAD 排行榜前面的模型都比較復(fù)雜、龐大。?
模型
現(xiàn)在我們正式進(jìn)入模型的介紹中。
架構(gòu)總覽
先來看個(gè)模型總圖:
▲?DGCNN模型總圖
從示意圖可以看到,作為一個(gè)“閱讀理解”、“問答系統(tǒng)”模型,圖中的模型幾乎是簡單到不能再簡單了。?
模型的整體架構(gòu)源于 WebQA 的參考論文 Dataset and Neural Recurrent Sequence Labeling Model for Open-Domain Factoid Question [2]。這篇論文有幾個(gè)特點(diǎn):
1. 直接將問題用 LSTM 編碼后得到“問題編碼”,然后拼接到材料的每一個(gè)詞向量中;
2. 人工提取了 2 個(gè)共現(xiàn)特征;
3. 將最后的預(yù)測轉(zhuǎn)化為了一個(gè)序列標(biāo)注任務(wù),用 CRF 解決。
而 DGCNN 基本上就是沿著這個(gè)思路設(shè)計(jì)的,我們的不同點(diǎn)在于:
1. 把原模型中所有的 LSTM 部分都替換為 CNN;?
2. 提取了更豐富的共現(xiàn)特征(8 個(gè));
3. 去掉 CRF,改為“0/1 標(biāo)注”來分開識別答案的開始和終止位置,這可以看成一種“半指針半標(biāo)注”的結(jié)構(gòu)。
卷積結(jié)構(gòu)
這部分我們來對圖中的 Conv1D Block 進(jìn)行解析。
門機(jī)制
模型中采用的卷積結(jié)構(gòu),來自 FaceBook 的 Convolutional Sequence to Sequence Learning [3],而在《分享一個(gè) slide:花式自然語言處理》[4] 一文中也提到過。
假設(shè)我們要處理的向量序列是 X=[x1,x2,…,xn],那么我們可以給普通的一維卷積加個(gè)門:
注意這里的兩個(gè) Conv1D 形式一樣(比如卷積核數(shù)、窗口大小都一樣),但權(quán)值是不共享的,也就是說參數(shù)翻倍了,其中一個(gè)用 sigmoid 函數(shù)激活,另外一個(gè)不加激活函數(shù),然后將它們逐位相乘。
因?yàn)?sigmoid 函數(shù)的值域是 (0,1),所以直覺上來看,就是給 Conv1D 的每個(gè)輸出都加了一個(gè)“閥門”來控制流量。這就是 GCNN 的結(jié)構(gòu)了,或者可以將這種結(jié)構(gòu)看成一個(gè)激活函數(shù),稱為 GLU(Gated Linear Unit)。
除了有直觀的意義外,用 GCNN 的一個(gè)好處是它幾乎不用擔(dān)心梯度消失問題,因?yàn)橛幸粋€(gè)卷積是不加任意激活函數(shù)的,所以對這部分求導(dǎo)是個(gè)常數(shù)(乘以門),可以說梯度消失的概率非常小。如果輸入和輸出的維度大小一致,那么我們就把輸入也加到里邊,即使用殘差結(jié)構(gòu):
▲?殘差與門卷積的結(jié)合,達(dá)到多通道傳輸?shù)男Ч?/span>
值得一提的是,我們使用殘差結(jié)構(gòu),并不只是為了解決梯度消失,而是使得信息能夠在多通道傳輸。我們可以將上式改寫為更形象的等價(jià)形式,以便我們更清晰看到信息是如何流動(dòng)的:
從 (3) 式中我們能更清楚看到信息的流向:以 1?σ 的概率直接通過,以 σ 的概率經(jīng)過變換后才通過。這個(gè)形式非常像遞歸神經(jīng)網(wǎng)絡(luò)中的 GRU 模型。
補(bǔ)充推導(dǎo):
由于 Conv1D1 并沒有加激活函數(shù),所以它只是一個(gè)線性變換,從而 Conv1D1(X)?X 可以結(jié)合在一起,等效于單一一個(gè) Conv1D1。說白了,在訓(xùn)練過程中,Conv1D1(X)?X 能做到的事情,Conv1D1(X) 也能做到。從而 (2) 和 (3) 兩者是等價(jià)的。
膨脹卷積
接下來,為了使得 CNN 模型能夠捕捉更遠(yuǎn)的的距離,并且又不至于增加模型參數(shù),我們使用了膨脹卷積。?
普通卷積跟膨脹卷積的對比,可以用一張圖來演示:
▲?普通卷積 vs. 膨脹卷積
同樣是三層的卷積神經(jīng)網(wǎng)絡(luò)(第一層是輸入層),窗口大小為 3。普通卷積在第三層時(shí),每個(gè)節(jié)點(diǎn)只能捕捉到前后 3 個(gè)輸入,而跟其他輸入完全不沾邊。?
而膨脹卷積在第三層時(shí)則能夠捕捉到前后 7 個(gè)輸入,但參數(shù)量和速度都沒有變化。這是因?yàn)樵诘诙泳矸e時(shí),膨脹卷積跳過與中心直接相鄰的輸入,直接捕捉中心和次相鄰的輸入(膨脹率為 2),也可以看成是一個(gè)“窗口大小為 5 的、但被挖空了兩個(gè)格的卷積”,所以膨脹卷積也叫空洞卷積(Atrous Convolution)。
在第三層卷積時(shí),則連續(xù)跳過了三個(gè)輸入(膨脹率為 4),也可以看成一個(gè)“窗口大小為 9、但被挖空了 6 個(gè)格的卷積”。而如果在相關(guān)的輸入輸出連一條線,就會(huì)發(fā)現(xiàn)第三層的任意一個(gè)節(jié)點(diǎn),跟前后 7 個(gè)原始輸入都有聯(lián)系。?
按照“盡量不重不漏”的原則,膨脹卷積的卷積率一般是按照 1、2、4、8、...這樣的幾何級數(shù)增長。當(dāng)然,這里指明了是“盡量”,因?yàn)檫€是有些重復(fù)的。這個(gè)比例參考了 Google 的 wavenet 模型。?
Block
現(xiàn)在就可以解釋模型圖中的各個(gè) Conv1D Block 了,如果輸入跟輸出維度大小一致時(shí),那么就是膨脹卷積版的 (3) 式;如果輸出跟輸出維度大小不一致時(shí),就是簡單的 (1) 式,窗口大小和膨脹率在圖上都已經(jīng)注明。?
注意力
從模型示意圖可以看到,本文的 DGCNN 模型中,Attention 主要用于取代簡單的 Pooling 來完成對序列信息的整合,包括將問題的向量序列編碼為一個(gè)總的問題向量,將材料的序列編碼為一個(gè)總的材料向量。
這里使用的 Attention 稍微不同于 Attention is All You Need 中的 Attention,本文這種 Attention 可以認(rèn)為是一種“加性注意力”,形式為:
這里的 v,W 都為可訓(xùn)練參數(shù)。而 Act 為激活函數(shù),一般會(huì)取 tanh,也可以考慮 swish 函數(shù)。注意用 swish 時(shí),最好把偏置項(xiàng)也加上去,變?yōu)?#xff1a;
這種 Attention 的方案參考自 R-Net 模型(注:不一定是 R-Net 首創(chuàng),只是我是從 R-Net 中學(xué)來的)。?
位置向量
為了增強(qiáng) CNN 的位置感,我們還補(bǔ)充了位置向量,拼接到材料的每個(gè)詞向量中。位置向量的構(gòu)造方法直接沿用 Attention is All You Need 中的方案:
輸出設(shè)計(jì)
這部分是我們整個(gè)模型中頗具特色的地方。
思路分析
到現(xiàn)在,模型的整體結(jié)構(gòu)應(yīng)該已經(jīng)呈現(xiàn)出來了。首先我們通過卷積和注意力把問題編碼為一個(gè)固定的向量,這個(gè)向量拼接到材料的每個(gè)詞向量中,并且還拼接了位置向量、人工特征。
這時(shí)候我們得到了一個(gè)混合了問題、材料信息的特征序列,直接對這個(gè)序列進(jìn)行處理即可,所以后面接了幾層卷積進(jìn)行編碼處理,然后直接對序列進(jìn)行標(biāo)注,而不需要再對問題進(jìn)行交互了。?
在 SQUAD 的評測中,材料是肯定有答案的,并且答案所在的位置也做好了標(biāo)注,所以 SQUAD 的模型一般是對整個(gè)序列做兩次 softmax,來預(yù)測答案的開始位置和終止位置,我們一般稱之為“指針網(wǎng)絡(luò)”。
然而我們這里的 WebQA 式問答,材料中不一定有答案,所以我們不用 softmax,而是對整個(gè)序列都用 sigmoid,這樣既允許了材料中沒有答案,也允許答案在材料中多次出現(xiàn)。?
雙標(biāo)注輸出
既然用到標(biāo)注,那么理論上最簡單的方案是輸出一個(gè) 0/1 序列:直接標(biāo)注出材料中的每個(gè)詞“是(1)”或“否(0)”答案。
然而,這樣的效果并不好,因?yàn)橐粋€(gè)答案可能由連續(xù)多個(gè)不同的詞組成,要讓模型將這些不同的詞都有同樣的標(biāo)注結(jié)果,有可能“強(qiáng)模型所難”。于是我們還是用兩次標(biāo)注的方式,來分別標(biāo)注答案的開始位置和終止位置。
這樣一來,模型的輸出設(shè)計(jì)跟指針方式和純序列標(biāo)注都不一樣,或者說是兩者的簡化及融合。?
大局觀
最后,為了增加模型的“大局觀”,我們將材料的序列編碼為一個(gè)整體的向量,然后接一個(gè)全連接層來得到一個(gè)全局的打分,并把這個(gè)打分的結(jié)果乘到前面的標(biāo)注中,即變成:
這個(gè)全局打分對模型的收斂和效果具有重要的意義,它的作用是更好地判斷材料中是否存在答案,一旦材料中沒有答案,直接讓即可,不用“煞費(fèi)苦心”讓每個(gè)詞的標(biāo)注都為 0。
人工特征
文章的前面部分,我們已經(jīng)多次提到過人工特征,那么這些人工特征的作用有多大呢?簡單目測的話,這幾個(gè)人工特征對于模型效果的提升可能超過 2%。可見設(shè)計(jì)好的特征對模型效果的特征、模型復(fù)雜度的降低,都有著重要的作用。?
人工特征是針對材料中的詞來設(shè)計(jì)的,列舉如下(Q 即 question,代表問題;E 即 evidence,代表材料)。?
Q-E全匹配
也就是判斷材料中的詞是否在問題出現(xiàn)過,出現(xiàn)過則為 1,沒出現(xiàn)過則為 0。這個(gè)特征的思路是直接告訴模型問題中的詞在材料中什么地方出現(xiàn)了,那些地方附近就很有可能有答案。這跟我們?nèi)祟愖鲩喿x理解的思路是吻合的。?
E-E共現(xiàn)
這個(gè)特征是計(jì)算某個(gè)材料中的詞在其他材料中的出現(xiàn)比例。比如有 10 段材料,第一段材料有一個(gè)詞 w,在其余九段材料中,有 4 段都包含了這個(gè)詞,那么第一段材料的詞 w 就獲得一個(gè)人工特征 4/10。?
這個(gè)特征的思路是一個(gè)詞出現(xiàn)在的材料越多,這個(gè)詞越有可能是答案。?
Q-E軟匹配
以問題大小為窗口來對材料的每個(gè)窗口算 Jaccard 相似度、相對編輯距離。?
比如問題“白云山 的 海拔 是 多少 ?”,材料“白云山 坐落 在 廣州 , 主峰 海拔 3 8 2 米”。問題有 6 個(gè)詞,那么窗口大小就為 6,將材料拆分為:
其中 X 代表占位符。有了這個(gè)拆分,我就可以算每一塊與問題的 Jaccard 相似度了,將相似度的結(jié)果作為當(dāng)前詞(也就是紅色詞)的一個(gè)特征,上述例子算得 [0.13, 0.11, 0.1, 0.09, 0.09, 0.09, 0.09, 0.09, 0.09, 0.1, 0]。?
同樣地,我們還可以算每一塊與問題的編輯距離,然后除以窗口大小,就得到一個(gè) 0~1 之間的數(shù),我稱之為“相對編輯距離”,上述例子算得 [0.83, 0.83, 0.83, 0.83, 1, 1, 1, 0.83, 1, 1, 1]。?
Jaccard 相似度是無序的,而編輯距離是有序的,因此這兩個(gè)做法相對于從有序和無序兩個(gè)角度來衡量問題和材料之間的相似度。這兩個(gè)特征的思路跟第一個(gè)特征一樣,都是告訴模型材料中哪部分會(huì)跟問題相似,那部分的附近就有可能有答案。?
這兩個(gè)特征的主要思路來自 Keras 群中的 Yin 神,感謝~
字符特征
SQUAD 排名靠前的模型中,基本都是以詞向量和字符向量共同輸入到模型中的,而為了提升效果,我們似乎也要把字向量和詞向量同時(shí)輸入。但我們并不想將模型做得太龐大,于是我們在人工特征這里,加入了字符級特征。?
其實(shí)思路也很簡單,前面介紹的 4 個(gè)特征,都是以詞為基本單位來計(jì)算的,事實(shí)上也可以以字為基本單位算一次,然后把每個(gè)詞內(nèi)的字的結(jié)果平均一下,作為詞的特征就行了。
比如在“Q-E 全匹配”特征中,假設(shè)問題只有“演”這個(gè)詞,而材料則有“合演”這個(gè)詞,如果按照詞來看,“合演”這個(gè)詞沒有在問題出現(xiàn)過,所以共現(xiàn)特征為 0,而如果考慮字的話,“合演”就被拆開為兩個(gè)字“合”和“演”,按照同樣的方式算共現(xiàn)特征,“合”得到 0、“演”得到 1,將兩者平均一下,得到 0.5,作為“合演”這個(gè)詞的字符級“Q-E 全匹配”特征。?
其他三個(gè)特征也同樣處理,這樣我們就得到了另外 4 個(gè)特征,一定得到 8 個(gè)人工特征。
實(shí)現(xiàn)
現(xiàn)在,模型的各個(gè)部分基本上都解釋清楚了。其實(shí)模型整體簡單明了,講起來也容易,應(yīng)該會(huì)有種“大道至簡”的感覺。下面介紹一些實(shí)現(xiàn)要點(diǎn)。?
模型設(shè)置
下面是實(shí)現(xiàn)模型的一些基本要點(diǎn)。?
中文分詞
從前面的介紹中可以看到,本模型是基于詞來實(shí)現(xiàn)的,并且基于前面說的人工特征簡單引入了字符級別的信息。不過,為了使得模型整體上更加靈活,能夠應(yīng)答更多的問題,本文僅僅對輸入進(jìn)行了一個(gè)基本的分詞,使得分詞的顆粒度盡量低一些。?
具體實(shí)現(xiàn)為:自己寫了一個(gè)基于一元模型的分詞模塊,自行準(zhǔn)備了一個(gè)約 50 萬詞的詞典,而所有的英文、數(shù)字都被拆開為單個(gè)的字母和數(shù)字,比如 apple 就變成了五個(gè)“詞”:a p p l e,382 就變成了三個(gè)“詞”:3 8 2。?
由于沒有新詞發(fā)現(xiàn)功能,這樣一來,整個(gè)詞表的詞就不會(huì)超過 50 萬。事實(shí)上,我們最后得到的模型,模型總詞數(shù)只有 30 萬左右。?
當(dāng)然,讀者可以使用結(jié)巴分詞,關(guān)閉結(jié)巴分詞的新詞發(fā)現(xiàn),并且手動(dòng)對數(shù)字和英文進(jìn)行拆分,效果是一樣的。
部分參數(shù)
1. 詞向量的維度為 128 維,由比賽方提供的訓(xùn)練語料、WebQA 語料、50 萬百度百科條目、100 萬百科知道問題用 Word2Vec 預(yù)訓(xùn)練而成,其中 Word2Vec 的模型為 Skip Gram,窗口為 5,負(fù)采樣數(shù)為 8,迭代次數(shù)為 8,訓(xùn)練時(shí)間約為 12 小時(shí);?
2. 詞向量在 DGCNN 模型的訓(xùn)練過程中保持固定;?
3. 所有 Conv1D 的輸出維度皆為 128 維,位置向量也是 128 維;?
4. Conv1D 的最大長度取為 100,如果一個(gè) batch 中某些樣本涉及到 padding,那么對 padding 部分要做好 mask;?
5. 由于最后變成一個(gè)二分類的標(biāo)注形式,并且考慮到正負(fù)類不均衡,使用二分類的 focal loss 作為損失函數(shù);?
6. 用 adam 優(yōu)化器進(jìn)行訓(xùn)練,先用的學(xué)習(xí)率訓(xùn)練到最優(yōu)(大概 6 個(gè) epoch 內(nèi)),然后加載最優(yōu)模型,改用學(xué)習(xí)率訓(xùn)練到最優(yōu)(3 個(gè) epoch 內(nèi))。
正則項(xiàng)
在比賽后期,我們發(fā)現(xiàn)一種類似 DropPath 的正則化能輕微提升效果,不過提升幅度我也不大確定,總之當(dāng)時(shí)是帶來了一定的提升。
這個(gè)正則化手段建立在 (3) 式的基礎(chǔ)上,我們的思路是在訓(xùn)練階段對“門”進(jìn)行擾動(dòng):
▲?對GCNN的門進(jìn)行擾動(dòng),作為模型的一個(gè)正則項(xiàng)
其中 ε 是 [?0.1,0.1] 內(nèi)的均勻隨機(jī)數(shù)張量。這樣一來,我們給 GCNN 的“門”加入了“乘性噪聲”來使得具有更好的魯棒性(對抗參數(shù)的小擾動(dòng))。
這個(gè)正則化方案的提出,多多少少受到了 FractalNet: Ultra-Deep Neural Networks without Residuals?[5] 和 Shake-Shake regularization [6]?里邊的正則化技術(shù)啟發(fā)。
數(shù)據(jù)準(zhǔn)備
數(shù)據(jù)預(yù)處理
由于 SOGOU 這個(gè)比賽允許使用外部數(shù)據(jù),因此我們及大多數(shù)參賽隊(duì)伍都使用了 WebQA 數(shù)據(jù)集補(bǔ)充訓(xùn)練。考慮到 WebQA 數(shù)據(jù)集相對規(guī)整一下,而 SOGOU 提供的語料噪聲相對大一些,所以我們將 SOGOU 和 WebQA 的語料集以 2:1 的比例混合。?
不管是 WebQA 還是 SOGOU,所提供的語料都是“一個(gè)問題 + 多段材料 + 一個(gè)答案”的形式,并沒有特別指明答案出現(xiàn)在哪段材料的哪個(gè)位置。
因此,我們只好把材料中所有能跟答案全匹配的子串都視為答案所在處。對于某些樣本,這樣操作有點(diǎn)不合理,但是在不加額外的人工標(biāo)注的情況下,這也是我們能做到的最優(yōu)的思路了。?
訓(xùn)練語料還有一個(gè)問題答案的同義詞問題,比如問“憨豆的扮演者”,標(biāo)準(zhǔn)答案是“羅溫艾金森”,但是材料中不僅有“羅溫艾金森”,還有“羅溫·艾金森”、“羅溫.艾金森”、“洛溫·艾金森”等。
SOGOU 比賽比較好的一點(diǎn)是它提供了一個(gè)相對客觀的線下評測腳本,這個(gè)評測腳本考慮了同義詞的變化,因此我們可以從這個(gè)評測腳本中找到答案的同義詞,從而可以把同義答案都標(biāo)注出來。?
還有一些諸如全角字符轉(zhuǎn)半角的操作,相信大家看了數(shù)據(jù)集自然也就想到了,因此不再贅述。?
數(shù)據(jù)打勻
SOGOU 最后一共提供了 3 萬個(gè)問題的標(biāo)注語料,并且給我們預(yù)先劃分好了訓(xùn)練集(2.5 萬)和驗(yàn)證集(0.5 萬)。但是如果直接用它的劃分來訓(xùn)練,那驗(yàn)證集的結(jié)構(gòu)卻跟線上提交的結(jié)果出入比較大。?
所以我們把所有的標(biāo)注語料混合然后重新打亂,并且重新劃分訓(xùn)練集(2 萬)和驗(yàn)證集(1 萬),這樣在驗(yàn)證集上的得分約為 0.76,跟線上提交的結(jié)果接近。
數(shù)據(jù)擴(kuò)增
在模型的訓(xùn)練過程中,使用了可以稱得上是數(shù)據(jù)擴(kuò)增的三個(gè)操作。?
1. 直接隨機(jī)地將問題和材料的部分詞 id 置零:問題和材料都是以詞 id 序列的方式輸入,0 是填充符(相當(dāng)于),隨機(jī)置零就是隨機(jī)將詞用替換,減弱對部分詞的依賴;?
2. 將同一段材料通過重復(fù)拼接、隨機(jī)裁剪的方式,來得到新的材料(答案的數(shù)目、位置也隨之變化);?
3. 對于答案出現(xiàn)多次的材料,隨機(jī)去掉某些答案的標(biāo)注。比如答案“廣東”可能在某段材料中出現(xiàn)兩次,那么做答案標(biāo)注的時(shí)候,可能只標(biāo)注第一個(gè)、或只標(biāo)注第二個(gè)、或都標(biāo)注。?
印象中,第 1 個(gè)數(shù)據(jù)擴(kuò)增手段影響比較大的,能有效提升模型的穩(wěn)定性和精度,至于第 2、3 個(gè)方案相對微弱一些。
第 1 個(gè)數(shù)據(jù)擴(kuò)增手段,跟直接對詞向量序列進(jìn)行 dropout 的區(qū)別是:dropout 除了隨機(jī)置零外,還會(huì)進(jìn)行尺度縮放,而這里就是不想要它的尺度縮放,解釋性要好些。
解碼策略
很多參賽選手可能會(huì)忽略的一個(gè)細(xì)節(jié)是:答案的解碼方式可能有很大的優(yōu)化空間,而優(yōu)化解碼帶來的提升,可能遠(yuǎn)比反復(fù)對模型調(diào)參帶來的提升要大。?
打分方式
何為答案解碼?不管是用 softmax 形式的指針,還是用本文的 sigmoid 形式的“半指針-半標(biāo)注”,最后模型輸出的是兩列浮點(diǎn)數(shù),分別代表了答案起始位置和終止位置的打分。
但問題是,用什么指標(biāo)確定答案區(qū)間呢?一般的做法是:確定答案的最大長度 max_words(我取了 10,但漢字算一個(gè),字母和數(shù)字只算半個(gè)),然后遍歷材料所有長度不超過 max_words 的區(qū)間,計(jì)算它們起始位置和終止位置的打分的和或積,然后取最大值。
那么問題來了,“和”好還是“積”好呢?又或者是“積的平方根”??
開始我按直覺來,感覺“積的平方根”是最合理的,后來測試了一下直接改成“積”,發(fā)現(xiàn)效果提升很明顯(1%)。于是我就反復(fù)斟酌了這個(gè)解碼決策過程,發(fā)現(xiàn)里面還其實(shí)有很多坑,這也是一種重要的超參,不能單純按照直覺來。?
投票方式
比如同一段材料同一個(gè)片段出現(xiàn)多次時(shí),是要把這些片段的打分求和、求平均還是只取最大的?每段材料都得到了自己的答案,又怎么把這么多段材料的答案投票出最終的答案來??
比如有 5 段材料,每段材料得出的答案和分?jǐn)?shù)依次是 (A, 0.7)、(B, 0.2)、(B, 0.2)、(B, 0.2)、(B, 0.2),那么我們最終應(yīng)該輸出 A 還是 B 呢?
有人說“三個(gè)臭皮匠,頂一個(gè)諸葛亮”,自然這里的臭皮匠指的是指低分答案B,諸葛亮是指高分答案 A,4 個(gè) B 的分?jǐn)?shù)加起來為 0.8 > 0.7,這樣看起來應(yīng)該輸出 B??
我覺得不大對。在我們的生活中,專家并不等于平民的簡單疊加,人多的確力量大,但很多時(shí)候 1+1 是小于 2 的。就好比上面的答案分布,我們其實(shí)更傾向于選擇 A 答案,因?yàn)樗咏鼭M分 1,而且相對其它答案更加“出類拔萃”。?
所以,我們的投票方式必須體現(xiàn)兩點(diǎn):1. 人多力量大;2. 1+1<2。所以求和以及求平均都不行,最簡單的方案應(yīng)該是“平方和”:
1. 對于同一段材料,如果一個(gè)片段出現(xiàn)了多次,那么只取最大的那個(gè)分,不平均也不求和,這是因?yàn)椤巴欢尾牧稀毕喈?dāng)于“同一個(gè)人”,同一個(gè)人就沒必要疊加太多了;
2. 經(jīng)過這樣處理,每段材料都“選舉”出自己的答案了,每段材料就相當(dāng)于一個(gè)“臭皮匠”或“諸葛亮”,每個(gè)答案都有自己的分?jǐn)?shù),就是代表這些“臭皮匠”或“諸葛亮”的決策,將相同答案的打分求“平方平均”作為該答案的最后打分,然后在不同答案中選最大的那個(gè):
因?yàn)椤捌椒健睍?huì)把高分的樣本權(quán)重放大。
3. 相比步驟 2,我在比賽中使用了一個(gè)略微不同的打分公式:
這個(gè)公式同樣是平方求和的思想,只是再求了一次平均,并且分母“+1”。“平方”這個(gè)操作是對專家的加權(quán),“+1”則是對小樣本的懲罰,這個(gè)公式比直接平方求和更加平緩。
注意,不僅僅是我們的模型,我在跟另外一參賽選手交流的時(shí)候,提示了他這個(gè)解碼方式,他用同樣的思路經(jīng)過調(diào)試后,也得到了比較大的提升。
模型融合
經(jīng)過上述步驟,模型在 SOGOU 的在線測試集上達(dá)到 0.74~0.75 的分?jǐn)?shù)應(yīng)該是沒有問題的。但要達(dá)到最優(yōu)的 0.7583,就要上模型融合了。?
模型融合分單模型融合和多模型融合。單模型融合是指同一個(gè)模型架構(gòu),用不同的方式訓(xùn)練多次,然后將結(jié)果平均;多模型融合則是給每個(gè)模型都做一次單模型融合,然后將多個(gè)單模型融合的結(jié)果再次融合。簡單起見,我們只做了單模型融合。?
單模型建立在交叉驗(yàn)證的基礎(chǔ)上。前面我們提到,將標(biāo)注語料重新打亂后,重新劃分訓(xùn)練集和驗(yàn)證集,交叉驗(yàn)證的話更徹底一些,它把標(biāo)注語料重新打亂后,分為 k 份,每份都拿來做一次驗(yàn)證集(每次都要重零開始訓(xùn)練模型)。
▲?模型的k折交叉驗(yàn)證
這樣一來,我們就得到了同一個(gè)模型的 k 個(gè)不同訓(xùn)練結(jié)果,然后將這些結(jié)果平均一下,就是模型融合了:
▲?基于交叉驗(yàn)證的單模型融合
后文
效果評估
排行榜擺在那,所以模型的效果是看得見的,在 SOGOU 這個(gè)噪聲這么大的封閉測試集上,我們模型最終得分都有 0.7583。
而且從訓(xùn)練集來看,我覺得有些噪聲是故意加進(jìn)去的,有些材料實(shí)在太離譜,感覺直接放在搜索引擎或百度知道召回一批材料都不至于這么糟糕,所以我認(rèn)為實(shí)際使用中效果會(huì)更好。再加上純 CNN 的輕量級模型,這已經(jīng)完全滿足工業(yè)需求了。?
另外,我也在 SQUAD 上測了一下這個(gè)模型,發(fā)現(xiàn)準(zhǔn)確率也就 50% 上下,當(dāng)然沒精調(diào),也沒融合,如果經(jīng)過優(yōu)化調(diào)試,估計(jì)也就 60%+ 的準(zhǔn)確率吧。
顯然這跟 0.7583 的得分差距是比較遠(yuǎn)的,這也表明 WebQA 式的閱讀理解問答,跟 SQUAD 的純閱讀理解,是很不一樣的,雖然理論上它們的模型可以相互套用。
代碼 & 測試
模型已經(jīng)上線到火焰科技的官網(wǎng)上,可以點(diǎn)擊以下鏈接在線測試:
http://www.birdbot.cn/view/tyzq-igQa.html?
注:移動(dòng)端訪問效果也許欠佳,請盡量在 PC 端訪問
至于代碼就不公開了,原因有兩個(gè):
一是這個(gè)比賽是代表公司參加的,不好直接將所有東西開源,而且模型確實(shí)簡單明快,看完文章后跟著文章實(shí)現(xiàn)并不難,如果讀者還不能實(shí)現(xiàn)的話,我建議還是打好代碼基礎(chǔ)再玩閱讀理解和問答系統(tǒng)。
二是一旦開源,總有那么些讀者連文章都不想看,直接把代碼下載下來,然后跑不通就一連串問題“這個(gè)庫怎么安裝”、“這句代碼又報(bào)錯(cuò)了”,實(shí)在應(yīng)接不暇。?
這篇文章終究不是掃盲文,所以請讀者們見諒。當(dāng)然,沒有歧視初學(xué)者的意思,博客也時(shí)常會(huì)有入門級的文章出現(xiàn),只不過不是這篇罷了。?
此外,作為一個(gè)及格的參賽者,SOGOU 的訓(xùn)練語料也不好直接公開,需要測試的讀者,可以直接用 WebQA 數(shù)據(jù)集進(jìn)行訓(xùn)練。
千調(diào)百試
最后給大家看個(gè)截圖:
這個(gè)截圖基本上就代表了我的整個(gè)調(diào)試過程了,其中包含了上百次的迭代調(diào)試,每次更新又要做多次實(shí)驗(yàn)。
這是我目前做比賽最投入的一次了。所以,雖然本文不是正式的 paper,但如果讀者確實(shí)從本文中收獲了什么,那么希望能引用一下本文。
最后的最后,感謝廣州火焰科技提供的軟件和硬件上的的支持,公司給我提供了非常友好的發(fā)展和成長的機(jī)會(huì)。
PS:后來發(fā)現(xiàn),本文的模型其實(shí)跟? Fast Reading Comprehension with ConvNets? 和 QANET: COMBINING LOCAL CONVOLUTION WITH GLOBAL SELF-ATTENTION FOR READING COMPREHENSION 這兩篇論文“撞車”了,但筆者當(dāng)初做比賽時(shí),確實(shí)從未參考過這兩篇論文。
當(dāng)時(shí)是從 WebQA 的論文出發(fā),打算復(fù)現(xiàn) WebQA 的模型,然后覺得好奇就想試試 CNN 模型,然后就一發(fā)不可收了。
參考文獻(xiàn)
[1].?WebQA語料集
https://kexue.fm/archives/4338
[2]. Peng Li, Wei Li, Zhengyan He, Xuguang Wang, Ying Cao, Jie Zhou, and Wei Xu. Dataset and Neural Recurrent Sequence Labeling Model for Open-Domain Factoid Question Answering. arXiv:1607.06275.
[3].?Convolutional Sequence to Sequence Learning. Jonas Gehring, Michael Auli, David Grangier, Denis Yarats, Yann N. Dauphin. arXiv, 2017
[4].《分享一個(gè)slide:花式自然語言處理》
https://kexue.fm/archives/4823
[5].?G. Larsson, M. Maire, and G. Shakhnarovich, “FractalNet: Ultra-Deep Neural Networks without Residuals,” ArXiv:1605.07648v4
[6].?Xavier Gastaldi. Shake-Shake regularization.?arXiv:1705.07485.
點(diǎn)擊以下標(biāo)題查看作者其他文章:?
變分自編碼器VAE:原來是這么一回事
再談變分自編碼器VAE:從貝葉斯觀點(diǎn)出發(fā)
變分自編碼器VAE:這樣做為什么能成?
何愷明大神的「Focal Loss」,如何更好地理解?
#線 上 報(bào) 名#
?NVIDIA TensorRT 線上分享?
?1???掃描下方二維碼填寫報(bào)名表,報(bào)名成功請截圖保存
?2???添加小助手微信?pwbot02,備注 NVIDIA?獲取入群通道及直播地址
?? ? ? ??
NVIDIA × PaperWeekly?
揭秘NVIDIA TensorRT
NVIDIA開發(fā)者社區(qū)經(jīng)理何琨
內(nèi)容分享√在線Q&A√
活動(dòng)形式:PPT直播
?
?活動(dòng)時(shí)間?
4 月 18 日(周三)20:00
長按識別二維碼,立刻報(bào)名
*報(bào)名完成請加微信「pwbot02」入群
關(guān)于PaperWeekly
PaperWeekly 是一個(gè)推薦、解讀、討論、報(bào)道人工智能前沿論文成果的學(xué)術(shù)平臺。如果你研究或從事 AI 領(lǐng)域,歡迎在公眾號后臺點(diǎn)擊「交流群」,小助手將把你帶入 PaperWeekly 的交流群里。
▽ 點(diǎn)擊 |?閱讀原文?| 進(jìn)入作者博客
總結(jié)
以上是生活随笔為你收集整理的基于CNN的阅读理解式问答模型:DGCNN的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 本周 Github 精选:多款超赞 AI
- 下一篇: 深度学习在CTR预估中的应用 | CTR