2018 ATEC NLP比賽 15th 總結

這次比賽跟以往的比賽似乎很不一樣(雖然這個是我第一次參加),以往比賽的特徵技巧,融合技巧,以及一些典型的模型都在這次比賽都失效。我一度懷疑螞蟻金服是故意設計了數據。。。。

賽題介紹

問題相似度計算,即給定客服裏用戶描述的兩句話,用算法來判斷是否表示了相同的語義。

示例:

“花唄如何還款” --“花唄怎麼還款”:同義問句
“花唄如何還款” – “我怎麼還我的花被呢”:同義問句
“花唄分期後逾期瞭如何還款”-- “花唄分期後逾期了哪裏還款”:非同義問句
對於例子a,比較簡單的方法就可以判定同義;對於例子b,包含了錯別字、同義詞、詞序變換等問題,兩個句子乍一看並不類似,想正確判斷比較有挑戰;對於例子c,兩句話很類似,僅僅有一處細微的差別 “如何”和“哪裏”,就導致語義不一致。

比賽思路

初賽期間,我花了大量時間做特徵工程,收效甚微。因爲如前面所說,這次比賽傳統方法在這次數據裏面都沒有效果。但是,正因爲我在前期做了大量的特徵分析,在後期我在設計網絡結構的時候能夠更加得心應手,比如DIIN 這個網絡模型結構,很多top20的隊伍都嘗試過,可是他們都說這個模型不給力,而這個模型恰恰是我的最強模型,這個跟我之前做的特徵工程這部分工作有着緊密的聯繫。

我預想的比賽的整體流程應該是下圖這樣,但是最終還是沒有用stacking,因爲覺得提升不會很大。

這裏寫圖片描述

這次比賽,我是非常遺憾的,也吐槽一下阿里PAI平臺,每次模型訓練都要排很久的隊。。。 這次我進複賽的排名很低,前100名進複賽,我是第70進的,排位在前的一些大佬有認識的,但是由於排名低,最終決定自己一個人打比賽。自己一個人打比賽,隨之而來的問題很多,其中最嚴重的問題是對時間利用效率非常低,以至於最終我的模型還沒有完全收斂,就提交了最終的分數,而且期間因爲一些突發事故,我丟失了幾次線上提交機會,在僅剩最後一次提交機會的時候,選擇了穩妥一點,但是分數低一些的模型融合。

特徵工程

1)n-gram similiarity(blue score for n-gram=1,2,3…);

  1. get length of questions, difference of length

  2. how many words are same, how many words are unique

  3. question 1,2 start with how/why/when(wei shen me,zenme,ruhe,weihe)

5)edit distance

  1. cos similiarity using bag of words for sentence representation(combine tfidf with word embedding from word2vec)

7)manhattan_distance,canberra_distance,minkowski_distance,euclidean_distance

深度學習模型

Siamese LSTM

這個模型如果實現好,單模型在初賽B榜上排名 150名左右。

這裏寫圖片描述

這是一個非常直觀的模型,這個是大多數參賽選手首先會想到的模型結構。但是有一個很重要的一點是要預訓練詞向量,並在訓練期間固定 這個trick 其實在Quora比賽中就有很多經驗帖子提過,但是沒人鄭重提過,以至於我當時並沒有在意。在這次比賽中如果update embedding vector during training 的話,看到的現象就是非常容易過擬合,在訓練數據上幾個epoch之後loss 已經降低到最低,而在驗證集上的loss卻開始上升,F1值變爲0。 很多人在這個時候就會認爲是模型不行,而去嘗試別的模型去了,其實在這個時候,稍微分析一下就會知道,模型在驗證集上表現如此異常,就好像是遇到了從未見過的數據一樣(我稱之爲陌生感 哈哈),就好像訓練數據和驗證集完全沒有聯繫一樣,這個時候我們需要在訓練數據和驗證機之間搭接一個橋樑,就是固定詞向量。
固定了詞向量,效果果然有明顯的提升,在線下測試集分數可以到0.52左右,提交上去之後分數在0.59左右。排名150名。

Siamese LSTM 改進方案

這裏寫圖片描述

這個模型在word 和 char 級別的 embedding 一同送入同一個神經網絡去訓練,並增加了傳統特徵。這個單模型線下測試集合可以到0.54,線上分數在0.61。做k-fold之後提交,分數可以到0.63的線上分數,排名73名。 我也是靠這個模型進入到複賽
(在這裏需要提一下的是,傳統特徵在初賽數據上是比較有用的,只是到了複賽平臺就不行了。)

Decompose Attention

到了複賽階段,我主要是嘗試Attention的方法,最先嚐試的模型就是這個。

這裏寫圖片描述

這個模型在複賽平臺上分數可以到0.70(word char 級別 embedding 一同送入神經網絡訓練)
這個模型有效,很大程度上是因爲通過attention的方式學習到字與字之間的關係。

Decompose Attention 改進方案

word char 級別的 decompose attention 結構如下:
這裏寫圖片描述

在Pooling Layer 中 我採用的是 AvgPooling 和 MaxPooling 拼接。還有其他的一些模型細節是 ,對F函數我採用的是一層線性結構(如果線性層數增多會產生Bug,最終還是找了古師兄幫忙調了這個bug,這bug如果調不出來,這模型就要丟掉了),relu激活函數,沒有使用drop out(這主要是爲了加速收斂,效果上可能會打折扣)。

ESIM 模型

這裏寫圖片描述

這個模型我沒有進行細緻的調試,最終提交到線上的分數是0.705 。後來知道這個模型是很多隊伍融合模型之一的時候,還是比較遺憾的。

這次比賽,我用的最成功的模型是DRCN模型和DIIN模型。據我瞭解,在前20的隊伍裏,把DIIN模型用好的只有我一個人,哈哈哈。這裏解釋一下,即使是同一個模型,每個隊伍之間實現方式都是不一樣的,大家對模型改造程度都非常大,這跟平時的煉丹經驗息息相關。

先來說一下DRCN 。論文名字叫《Semantic Sentence Matching with Densely-connected Recurrent and Co-attentive Information》

在這裏插入圖片描述

我從打比賽的角度分析一下這麼模型,打比賽如果完全照着這個模型去實現的話,分數會很低。很多人模型實現幾個,分數不高就心灰意冷跑路了。
首先我們來看看Word Representation Layer部分。
作者使用了fix word embedding 和 trainable word embedding 拼接的方式。但是這個比賽數據,做過特徵分析就知道,樣本之間很獨立,差異非常大,我們應該花大力氣在詞和詞,字和字之間關係的學習上,如果使用fix word embedding, 那麼attention的學習壓力都落在線性層上,在螞蟻金服這個比賽是很吃虧的。 我的做法是隻用trainable word embedding。
還有作者用CNN去提取char 級別的特徵,我覺得如果這麼用,在模型融合的時候會很吃虧(沒有理論根據,直覺談談)。不如分別訓練char level 和 word level 模型最終進行融合。

接着我們再來看看 他的attention 計算方式。
在這裏插入圖片描述

看到這個attention 計算方式,感覺作者太隨意搞了。怎麼拿餘弦相似度計算attention呢? 作者在論文裏沒有說,但我跑了幾個實驗之後就非常理解作者的做法,這個模型最需要克服的點是層數深,梯度回傳費勁,模型很可能會因爲多加了幾個線性層就崩掉了。我們傳統的計算Attention 都是線性變換,在計算權重送入softmax,作者用餘弦相似度就是想少用點線性層。但是在螞蟻金服這個比賽,不能用這種方式。因爲螞蟻金服句子都比較短,我們用的殘差網絡層用兩層就夠了,所以權衡之後,在計算attention的時候,還是用線性變換會更好一些。要知道作者的殘差網絡層數是5層,6層。。。所以,對論文的理解深淺會直接影響你對這個模型的使用效果。

我們再來說說auto encoder 這個我用了之後效果不好,可能是因爲作者的網絡層數確實太深,最終的FC layer 太大,需要用auto encoder去提取特徵,這種東西在比賽中真心覺得不實用,個人淺薄見解。

再說說 Prediction Layer,我沒有用絕對值特徵,又加了max和 相乘的特徵。這個是評感覺加的,實驗效果也確實好點。

最後來說說DIIN 模型。這個模型是我最後一天寫的,用三個小時寫模型,加調試,然後就放到平臺訓練了。在平臺開始訓練時間是下午1點,一直到晚上12點,模型還沒完全收斂,然後跟其他模型融合提交了。之前成績我是24名,最後靠這個模型上分,我覺得非常神奇。而且這個模型我提交的只是char level model,word level model沒有來得及寫。對此我是感覺很遺憾的。

在這裏插入圖片描述

我當時看到這個模型的時候,看到他最後的特徵提取是CNN提特徵,而我之前的模型都是RNN 所以我覺得用這個模型是可以有效提升分數的。

這個模型在embedding layer用了fuse gate ,效果不好,別用! 我是有時候很納悶爲啥論文裏面的模型總是喜歡大而全,什麼都往裏加。

Interaction Layer:
在這裏我用的是 decompose attention 沒有用self attention ,self attention效果也不行。
最後的CNN層我是用DenseNet 網絡。

這個模型收斂很慢,最後提交的時候都沒有收斂完。這也是我這次比賽比較遺憾的一點。

接下來講講模型融合
當時B榜開放就一週,評測機會就7次左右。我的有效提交是三次。因爲我那段時間基本白天寫代碼,晚上看論文,經常會因爲當天模型沒有訓練完就沒辦法提交,中間又因爲幾次失誤,發生評測錯誤。 這就直接導致我最後提交的時候,畏手畏腳。

我最終提交的模型 drcn word + drcn char + diin char,然而 siamese 和 decompose 都是很work的模型 ,我的最強模型融合應該是: siamese word and char with feature + drcn word + drcn char + diin char + decompsoe atten char + decompose atten word。

主要我聽很多其他隊伍因爲模型過擬合掉榜,其中第一隊伍直接掉到11名,skyhigh 則是通過減模型 排名回到第二。所以我就沒敢把siamese 模型加進去,所以最終提交也是以求穩的策略提交。

以上是這次比賽的總結,這次比賽收穫很多,也認識了很多人,very cool

如果有時間再繼續更新 我當時失敗的實驗過程。失敗的實驗過程其實包含更多 我對這個任務的思考。
參考論文:
[1].Siamese recurrent architectures for learning sentence similarity.
[2].Enhanced LSTM for Natural Language Inference.
[3].A Decomposable Attention Model for Natural Language Inference
[4].Shortcut-Stacked Sentence Encoders for Multi-Domain Inference
[5].Attention is All you Need
[6].Natural Language Inference over Interaction Space
[7].Semantic Sentence Matching with Densely-connected Recurrent and Co-attentive Information

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章