七月,酷暑難耐,認識的幾位同窗參加知乎看山杯,均取得不錯的排名。當時天池AI醫療大賽初賽結束,官方正在爲複賽進行平臺調試,複賽時間一拖再拖。看着幾位同窗在比賽中排名都還很不錯,因而決定抽空試一試。結果一發不可收拾,又找了兩個同窗一塊兒組隊(隊伍init)以致於整個暑假都投入到這個比賽之中,並最終以必定的優點奪得第一名。html 1. 比賽介紹這是一個文本多分類的問題:目標是「參賽者根據知乎給出的問題及話題標籤的綁定關係的訓練數據,訓練出對未標註數據自動標註的模型」。通俗點講就是:當用戶在知乎上提問題時,程序要可以根據問題的內容自動爲其添加話題標籤。一個問題可能對應着多個話題標籤,以下圖所示。python
這是一個文本多分類,多label的分類問題(一個樣本可能屬於多個類別)。總共有300萬條問題-話題對,超過2億詞,4億字,共1999個類別。架構 1.1 數據介紹參考 https://biendata.com/competition/zhihu/data/機器學習 https://biendata.com/competition/zhihu/rules/?next_url=%2Fcompetition%2Fzhihu%2Fdata%2F函數
總的來講就是:工具
1.2 數據處理數據處理主要包括兩部分:
1.3 數據加強文本中數據加強不太常見,這裏咱們使用了shuffle和drop兩種數據加強,前者打亂詞順序,後者隨機的刪除掉某些詞。效果舉例如圖:
1.4 評價指標每一個預測樣本,提供最有可能的五個話題標籤,計算加權後的準確率和召回率,再計算F1值。注意準確率是加權累加的,意味着越靠前的正確預測對分數貢獻越大,同時也意味着準確率可能高於1,可是F1值計算的時候分子沒有乘以2,因此0.5是很難達到的。
2 模型介紹建議你們先閱讀這篇文章,瞭解文本多分類問題幾個經常使用模型:用深度學習(CNN RNN Attention)解決大規模文本分類問題 https://zhuanlan.zhihu.com/p/25928551
2.1 通用模型結構文本分類的模型不少,此次比賽中用到的模型基本上都遵循如下的架構:
基本思路就是,詞(或者字)通過embedding層以後,利用CNN/RNN等結構,提取局部信息、全局信息或上下文信息,利用分類器進行分類,分類器的是由兩層全鏈接層組成的。 在開始介紹每一個模型以前,這裏先下幾個結論:
2.2 TextCNN這是最經典的文本分類模型,這裏就不細說了,模型架構以下圖:
和原始的論文的區別就在於:
總之就是更深,更復雜。不過卷積核的尺寸設計的不夠合理,致使感覺野差距過大。 2.3 TextRNN沒找到論文,我就憑感受實現了一下:
相比於其餘人的作法,這裏的不一樣點在於:
2.4 TextRCNN參考原論文的實現,和RNN相似,也是兩層雙向LSTM,可是須要和Embedding層的輸出Concat(相似於resnet的shortcut直連)。
2.5 TextInception這個是我本身提出來的,參照TextCNN的思想(多尺度卷積核),模仿Inception的結構設計出來的,一層的Inception結構以下圖所示,比賽中用了兩層的Inception結構,最深有4層卷積,比TextCNN更深。
2.6 訓練方法要點:
2.7 各個模型分數計算訓練的時候,每一個模型要麼只訓練基於詞(word)的模型,要麼只訓練基於字(char)的模型。各個模型的分數都差很少,這裏再也不單獨列出來了,只區分訓練的模型的類型和數據加強與否。
能夠看出來
2.8 模型融合像這種模型比較簡單,數據量相對比較小的比賽,模型融合是比賽獲勝的關鍵。 在這裏,我只使用到了最簡單的模型融合方法-----機率等權重融合。對於每一個樣本,單模型會給出一個1999維的向量,表明着這個模型屬於1999個話題的機率。融合的方式就是把每個模型輸出的向量直接相加,而後選擇機率最大的5個話題提交。結構如圖所示:
下面咱們再來看看兩個模型融合的分數:
第一列的對比模型採用的是RNN(不採用數據加強,使用word做爲訓練數據),第二列是四個不一樣的模型(不一樣的結構,或者是不一樣的數據)。 咱們能夠得出如下幾個結論:
總結: 差別性越大,模型融合效果越好。沒有差別性,創造條件也要製造差別性。 另外模型融合還有個規律:越往上越難提高,有些模型在你分數較低的時候,對融合提高很明顯,當你分數較高的時候就沒什麼幫助,甚至會有干擾 2.9 MultiModel其實模型融合的方式,咱們換一種角度考慮,其實就是一個很大的模型,每個分支就像多通道的TextCNN同樣。那麼咱們能不能訓練一個超級大的模型?答案是能夠的,可是效果每每不好。由於模型過於複雜,太難以訓練。這裏我嘗試了兩種改進的方法。 第一種方法,利用預訓練好的單模型初始化複雜模型的某一部分參數,模型架構如圖所示:
可是這種作法會帶來一個問題: 模型過擬合很嚴重,難以學習到新的東西。由於單模型在訓練集上的分數都接近0.5,已經逼近理論上的極限分數,這時候很難接着學習到新的內容。這裏採起的應對策略是採用較高的初始學習率,強行把模型從過擬合點拉出來,使得模型在訓練集上的分數迅速下降到0.4左右,而後再下降學習率,緩慢學習,提高模型的分數。 第二種作法是修改預訓練模型的embedding矩陣爲官方給的embedding權重。這樣共享embedding的作法,可以必定程度上抑制模型過擬合,減小參數量。雖然CNN/RNN等模型的參數過擬合,可是因爲相對應的embedding沒有過擬合,因此模型一開始分數就會降低許多,而後再緩慢提高。這種作法更優。在最後提交模型復現成績的時候,我只提交了七個這種模型,裏面包含着不一樣子模型的組合,通常包含3-4個子模型。這種方式生成的權重文件也比較小(600M-700M左右),上傳到網盤相對來講更方便。
2.10 失敗的模型或沒什麼用的方法MultiMode只是我諸多嘗試的方法中比較成功的一個,其它方法大多以失敗了結(或者效果不明顯)
3 結束語我以前雖然學過CS224D的課程,也作了前兩次的做業,可是除此以外幾乎歷來沒寫過天然語言處理相關的代碼,能拿第一離不開隊友的支持,和同窗們不斷的激勵。 此次比賽入門對我幫助最大的兩篇文章是用深度學習(CNN RNN Attention)解決大規模文本分類問題 https://zhuanlan.zhihu.com/p/25928551 和deep-learning-nlp-best-practices http://ruder.io/deep-learning-nlp-best-practices/index.html 第一篇是北郵某學長(但我並不認識~)寫的,介紹了許多文本分類的模型(CNN/RNN/RCNN),對我入門幫助很大。 第二篇是國外某博士寫的,當時我已經把分數刷到前三,在家看到了這篇文章,歎爲觀止,解釋了我不少的疑惑,提到的不少經驗總結和個人狀況也確實相符。https://zhuanlan.zhihu.com/p/28923961 |