1. 程式人生 > >【金融大腦-一支優秀的隊伍】比賽經驗分享

【金融大腦-一支優秀的隊伍】比賽經驗分享

說在前面的話

大家好,我是“一支優秀的隊伍”隊長,SpaceOdd,我們隊伍有倆人,另一個是我師弟。這次是我第一次參加比賽,複賽封榜前僥倖拿到了第一的成績,實在是走運得很,不過還有重要的答辯環節,還要繼續努力加油:)在這裡斗膽做一個簡單的分享是為了和大家一起學習,難免因能力不足而出現一些錯誤請不吝指出。

實際上前排大佬們的最後結果都是在伯仲之間,大家的解法都有很可取之處,期待大家也做出自己的比賽經驗分享,一起為NLP添磚加瓦:)另外複賽A榜大佬們十分令人惋惜,B榜測試集只有1W條的確是會讓結果很波動,甚至大變天都是有可能的,我相信並不是所有人都在試圖“overfit”測試集,我們自己隊伍最後幾日的不斷嘗試也帶來了非常波動的結果,所以很能理解大家的心情,不過也不要一味的抱怨,生活還是要不斷往前的。

題目簡介

這個題目其實就是Natural Language Inference、Sentence Match這一類經典NLP問題,簡單來說就是判斷兩個sentence的關係,在本比賽中,就是判斷兩個sentence是否語意一致。

這個任務非常有實用價值,想象你在做一個客服系統,事先會有一個問題-答案的表單,客服的工作其實就是在面對使用者的提問時,迅速找到與之最接近的問題,並整理出答案來給使用者。文字匹配系統一旦做的好了,可以直接解決第二個階段的問題,也是最需要人力的部分——找到最接近的問題,這能大大減輕客服的壓力,讓他們去解決真正困難的問題。(真正的客服系統遠比這個過程複雜,這裡只是一個簡單的例子)

與這個比賽相關的領域也包括像QA match、machine reading甚至recommendation等,只要問題涉及到了兩類資訊的互動,都是相關領域,都可以找paper來看,來借鑑idea。

解題基本策略

本人比賽經驗比較少,聽比賽經驗略多的師弟說,NLP比賽一般不用feature(快有人來闢謠),所以我們一開始就沒有朝著 找feature 這條ML的路走,我們毅然決然的選擇了DL,換句話說,就是堆模型,靠模型的結構來自動提取、推演相關的feature,這也是DL的玄學魅力。

我們的配合方式很簡單。我和師弟用的是不同的框架,我keras他torch,所以用並行的方式來做比賽——互相分享好的paper、好的idea,互換實驗結果及分析,然後各取所長,最後誰的結果好就用誰的模型。

建議大家組隊的時候,還是儘量選擇框架一致的隊友,因為一旦你有事,隊友能快速幫你補實驗= =

我們無論是在做初賽還是複賽,都會先用siamese結構的純基於encoding的網路來當baseline,然後再上基於互動的模型。在這個比賽裡基於互動的模型還是要好於純粹基於encoding的模型,不過並不是所有的匹配資料集都滿足這一條件,依稀記得COLING 18年的一個復現paper(引用[4])裡提到了,quora資料集上純粹基於encoding的一個模型比ESIM等等模型效果還好,所以還是要多做實驗驗證。

我們的解題策略很簡單,選一個可擴充套件性強的模型,然後根據其他paper的idea、自己的idea來改進模型,把它改的面目全非為止。

從一開始我們就選擇了ESIM模型(引用[6]),相比現在動不動就好多層網路結構的NLI模型,ESIM思路清晰、能說服我們、網路結構相對簡單、沒有用很多trick、擴充套件性也強、效果很棒,所以就一眼相中了。目前來看逼格learning隊伍也是用ESIM改進版取得了不錯的成績,看來所見略同。

對於這個任務來講,模型的潛力是蠻大的,我們沒有做任何的預處理,完整的保留了每個句子的所有資訊(當然了padding和擷取是必須的),因為我們覺得每一個資訊對於DL來說都有用。我們沒有使用詞級別的向量,而是純用的字級別的向量,在做實驗的過程中發現基於詞級別的結果普遍要差一點,這和分詞質量不無關係,而且本人認為GRU、LSTM這樣的網路因為引入了gate,已經具備一定程度的分詞作用了。但是可以料想的是,如果經過了良好的分詞處理,結合word和char級別的embedding,應該是有一定幫助的。我們在b榜上的最終成績是多個模型求平均作ensemble的結果,這幾個模型和下面將提到的最優單模型實際上比較相關,這裡也是一個有待改進的點。

比賽經驗分享

初賽階段

這一段我們沒花很多的精力,就簡單的略過一下(主要成績也不好,哈哈)模型就是原始的ESIM略作改動,自始至終都只用了字向量,初賽的時候本地資料並不多,我們在github上找了預訓練好的300D的char embedding,地址在這兒 <a href="https://github.com/Embedding/Chinese-Word-Vectors" target="_blank">https://github.com/Embedding/Chinese-Word-Vectors ,我們用的是skipgram的mix-large版本,最終單模型初賽60名左右。

複賽階段

我們的baseline encoding模型是三層bi-GRU+mult-head self-attention的siamese模型,每一層都用了殘差。char emb方面我們用了初賽用的pretrain emb並作了fine-tune,對資料沒有做任何預處理。A榜裡單模型有728左右,10fold作平均來做ensemble,大概可以到735。作為一個baseline已經是很好的出發點了。

我們的最佳單模型是從ESIM出發一步步改進的,改到最後已經連ESIM也認不出來了。它像一個全新的物種,不過細細一看,眉眼、神情還是似曾相識的。我們參考了大概六七篇paper,附在本文的結尾,大家感興趣的可以下下來看看。

關於最佳單模型的具體結構,這裡暫時不透露太過詳細,因為考慮到之後我們可能會用這個模型來做一些事情:)在一切妥當之後,會放出開原始碼和大家一起學習。

經驗分享(重要性不分先後)

1.資料集夠大的時候,用外部訓練好的emb並不一定就比本地訓練的emb要好,比如複賽;

2.fix住emb能夠很好的防止過擬合風險。實驗發現fine-tune emb能夠取得很低的loss,但F1不一定就提高了。但是凡事有利有弊,fix emb會讓模型的能力受限,一個兩者兼得的方式是——在fix emb的同時,額外引入一些可訓練的emb維度,實驗證明效果非常不錯;

3.殘差連線很好用。想提效果,一個很自然的方式就是加入適度的複雜性->堆mlp,但是直接加mlp,會有難以訓練的風險,用殘差連線就能較好的中和這個問題,這個方法很簡單粗暴但是有用,我們的最優單模型在很多地方都用了一層Relu的mlp+殘差連線;

4.很喜歡一個叫CLR leraning的學習率自動調整策略,是在看fast.ai的視訊裡學到的,儘管沒有發生什麼神奇的事情,但是穩定在第4個epoch收斂的效果我很喜歡,paper見引用[1];

5.self-attention(引用[9])比雙向RNN要好用。初賽的時候我把ESIM頂層的雙向LSTM替換成mult-head self-attention,很好用,複賽最優單模型也用了mult-head self-attention;

6.learning rate、dropout、batch size對模型效果影響很大很大;

7.很喜歡fuse gate(引用[8]中提到),用得好的話感覺比殘差連線要有用,還有一種視覺化的感覺——告訴你模型什麼時候需要什麼level的資訊。在最優單模型上面我主要用在了char emb和encoder之後的表達上面,效果有提升;

8.對於DL模型,輸入永遠都是非常有用的,儘管你可以設計出牛逼的結構,但是如果輸入資訊就那麼些,實在是強模型所難,我們發現把一些簡單的char-level feature引入模型是會帶來一點提升的(但是比較有限),個人不建議在模型後面再引入feature,會誤導模型。我們用的char-level feature有四個,一個是exact match,一個是idf,另外兩個是自動提取的feature,來自一個很讚的KDD 2018的paper,見引用[3];

9.在需要pooling的時候,拼接max-pooling和avg-pooling通常是很有用的,他們沒有引數,而且儘可能的保留了資訊量,這一塊我們初賽和複賽一開始有在用;

10.還是pooling方面,也推薦s2t mult-dim的pooling方式(見paper引用[8]),最優的模型裡我用了這個,之所以沒有用max和avg的拼接,是不太希望最後接mlp之前的向量維度太大;

11.直接復現別人的paper不一定就效果好,通常需要自己做一些調整;

12.loss方面,加權的CE效果非常好,公式見引用[5]的paper,另外試過upsampling,效果和加權CE差不多,還沒有嘗試margin loss,不知道有沒有隊伍嘗試過,可以分享一下;

13.想到再補充。

那些想實現但是沒有實現的idea

1.引入拼音emb,這主要是為了一定程度上解決同音錯別字的問題,逼格learning戰隊試過在初賽上有一點效果;

2.data augmentation,在影象領域旋轉一下影象就能讓模型魯棒性更強,那麼在NLP領域,是不是可以隨機更改一下句子裡的重要名詞來製造負例,更改一下句子裡不影響語意的詞語來增加正例;

3.從外部找大量的語料,訓練一個language model來做ELMo,見引用[2];

4.參考引用[7]來在emb層面上引入對抗擾動來增強模型的魯棒性;

5.combine word和char emb,並引入pos tag等feature;

6.嘗試更好的ensemble策略,比如stacking,然後可以嘗試差異性更大的模型來做ensemble。

寫在後面的話

從參賽到複賽封榜,歷時兩個多月,中間各種酸甜苦辣都嚐了個遍,所有美好的旅程都是如此。感謝比賽方提供這樣一個平臺,感謝師弟的全力合作,感謝女票對我的悉心照顧,沒有你我很難把比賽堅持下來:)

答辯日益臨近,現在還遠不是放鬆的時刻,大家一起加油,各位杭州見:)

參考文章連結

[2].Deep contextualized word representations, <a href="https://aclanthology.info/papers/N18-1202/n18-1202" target="_blank">https://aclanthology.info/papers/N18-1202/n18-1202

[3].Multi-Cast Attention Networks for Retrieval-based Question Answering and Response Prediction, https://arxiv.org/abs/1806.00778

[4].Neural Network Models for Paraphrase Identification, Semantic Textual Similarity, Natural Language Inference, and Question Answering , <a href="https://aclanthology.info/papers/C18-1328/c18-1328" target="_blank">https://aclanthology.info/papers/C18-1328/c18-1328

[5].ETH-DS3Lab at SemEval-2018 Task 7: Effectively Combining Recurrent and Convolutional Neural Networks for Relation Classification and Extraction , <a href="https://aclanthology.info/papers/S18-1112/s18-1112" target="_blank">https://aclanthology.info/papers/S18-1112/s18-1112

[6].Enhanced LSTM for Natural Language Inference, <a href="http://aclweb.org/anthology/P17-1152" target="_blank">http://aclweb.org/anthology/P17-1152

[7].Adversarial Training Methods for Semi-Supervised Text Classification, https://arxiv.org/abs/1605.07725 

[9].Attention is all you need, <a href="http://papers.nips.cc/paper/7181-attention-is-all-you-need" target="_blank">http://papers.nips.cc/paper/7181-attention-is-all-you-need