0
雷鋒網(wǎng)按:本文原作者MagicBubble,原載于知乎專欄人工智障的深度瞎學(xué)之路。雷鋒網(wǎng)已獲得作者授權(quán)。
利用一個暑假的時間,做了研究生生涯中的第一個正式比賽,最終排名第二,有些小遺憾,但收獲更多的是成長和經(jīng)驗。我們之前沒有參加過機(jī)器學(xué)習(xí)和文本相關(guān)的比賽,只是學(xué)過一些理論基礎(chǔ)知識,沒有付諸過實踐,看過的幾篇論文也多虧前輩的分享(一個是用深度學(xué)習(xí)(CNN RNN Attention)解決大規(guī)模文本分類問題 - 綜述和實踐,另一個是 brightmart 的 text_classification,里面用 Keras 實現(xiàn)了很多文本分類的模型)。這些為我們的入門打下了良好的基礎(chǔ),在比賽過程中也是反復(fù)研讀和實踐,在此感謝兩位前輩的無私分享。
先放一波鏈接:
比賽網(wǎng)址:https://biendata.com/competition/zhihu/
比賽結(jié)果:https://zhuanlan.zhihu.com/p/28912353
下面對在這次比賽中用到的方法和收獲的經(jīng)驗,做一個簡單的總結(jié)和分享。
用單模型探索數(shù)據(jù)的極限
典型的文本多標(biāo)簽分類問題,根據(jù)用戶在知乎上發(fā)布的問題標(biāo)題及描述,判斷它屬于哪幾個話題
訓(xùn)練數(shù)據(jù)給出了 300 萬問題及其話題的綁定關(guān)系,話題標(biāo)簽共有 1999 個,有父子關(guān)系,構(gòu)成有向無環(huán)圖
要求對未標(biāo)注的數(shù)據(jù)預(yù)測其最有可能綁定的 Top5 話題標(biāo)簽
評測采用準(zhǔn)確率與召回率的調(diào)和平均,準(zhǔn)確率的計算按照位置加權(quán),越靠前的分?jǐn)?shù)越高(具體見評測方案)
比賽提供的數(shù)據(jù)是 300 萬問題和話題的標(biāo)題(下稱 title)及描述(下稱 desc),分別有對應(yīng)的字序列(下稱 char)和詞序列(下稱 word),全部是以 id 的形式給出。這意味著我們是看不到原始文本的,所以對于 badcase 的分析也很困難,但好在其數(shù)據(jù)量夠大(2 億多詞,4 億多字),還是可以用深度學(xué)習(xí)來做。知乎官方也提供了訓(xùn)練好的 embedding(維度 256),字級別和詞級別的都有,但是是分開訓(xùn)練,不屬于同一個語義向量空間。
坊間常說:數(shù)據(jù)和特征決定了機(jī)器學(xué)習(xí)的上限,而模型和算法知識逼近這個上限而已。對于深度學(xué)習(xí),因為不存在特征工程,所以數(shù)據(jù)處理就至關(guān)重要了。而良好且合理的數(shù)據(jù)處理離不開系統(tǒng)詳細(xì)的數(shù)據(jù)分析,要知道數(shù)據(jù)是什么樣,數(shù)據(jù)怎么分布,才能更好地選擇模型和訓(xùn)練方式。
這里主要是對問題的 title 和 desc 做長度分析,更為詳細(xì)的分析見數(shù)據(jù)分析
首先是問題 title 的字詞長度分布:
其次是問題 desc 的字詞長度分布:
隨機(jī) shuffle 后以 9:1 的比例劃分線下驗證集和訓(xùn)練集,防止數(shù)據(jù)周期的影響
對于 embedding 矩陣中未出現(xiàn)的詞,添加,并用 - 0.25~0.25 初始化,千萬不能扔掉,這樣會破壞前后的語義關(guān)系
對于 title 和 desc,分別根據(jù)其平均長度 * 2,做截斷和補(bǔ)齊至長度一致,便于 batch 輸入網(wǎng)絡(luò)訓(xùn)練
參照 brightmart 的 github 開源,我們嘗試了前 5 種模型,分別是 FastText、TextCNN、TextRNN、RCNN、HAN
其中,HAN 的原始論文中用的是詞和句子兩層 Attention,而數(shù)據(jù)中是看不出句子的,所以這個方法我只用了一層 word,效果不好。而 RCNN 因為同時用到了 RNN 和 CNN 的思想,所以整個網(wǎng)絡(luò)的訓(xùn)練時間很長,且其效果與單獨的 RNN 和 CNN 差不多,因此后期沒有使用此模型。最終用到的模型有:
FastText:通過 Average 抽象出概括性語義信息
TextCNN:仿照 n-gram 捕捉局部語義信息
TextRNN:提取序列語義信息
因為沒有花很多時間在單模型調(diào)參訓(xùn)練上,所以最終單 Model 的分?jǐn)?shù)普遍偏低,約比別的隊伍低 0.5~1 個百分點。
這是我們這次參賽的一大亮點和創(chuàng)新點,就是成功地在深度學(xué)習(xí)上應(yīng)用了一種類似于 AdaBoost 的做法,通過訓(xùn)練多層來不斷修復(fù)前面層的偏差。我們在分析數(shù)據(jù)的時候發(fā)現(xiàn),一個模型的輸出是具有類別傾向性的,所以在某些類別上可能全對,而在某些類別上可能全錯,所以我們針對這種偏差做了一些改進(jìn),通過人為地定義偏差的計算方式,指導(dǎo)下一層模型更多關(guān)注那些錯的多的類,從而達(dá)到整體效果的提升。
通過用這種方法,單模型 Score 有了質(zhì)的飛躍,平均提升都在 1.5 個百分點(FastText 因模型過于簡單,提升空間有限),而 10 層的 RNN 則更是在用全部訓(xùn)練集 finetune 之后,分?jǐn)?shù)直接從 0.413 飆升到 0.42978,可謂真是用單模型探索數(shù)據(jù)的極限了。
這種方法的優(yōu)勢在于,一般只要不斷加深訓(xùn)練層數(shù),效果就會提升,但缺點卻在于它抹平了模型的差異性,對于模型融合效果不友好。
模型融合依靠差異性,而我們模型的差異性在前面已經(jīng)近乎被抹平,所以又另尋他路,用了另外兩個方法:
改變輸入,從 word 改成 char,雖然 char 的單模型效果不好,但總體融合卻能提升很多
人為定義不同的偏差計算方式
最終模型主要是 5 個 10 層模型的概率加權(quán)融合,分?jǐn)?shù)在 0.43506。
這次比賽收獲很大,總結(jié)起來就是:
數(shù)據(jù)預(yù)處理很重要
模型不一定是最主要的,要多嘗試其他方法,更不能無腦訓(xùn)模型,尤其是對于深度學(xué)習(xí)這種 “黑盒子”
比賽心態(tài)要放平,要抱著學(xué)習(xí)的心態(tài)
最后,還是要感謝知乎等組織舉辦的這次比賽,也感謝北郵模式識別實驗室的大力支持!
雷峰網(wǎng)版權(quán)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。