2018年8月-12月,由美團點評、創新工場、搜狗、美圖聯合主辦的“AI Challenger 2018全球AI挑戰賽”歷經三個多月的激烈角逐,冠軍團隊從來自全球81個國家、1000多所大學和公司的過萬支參賽團隊中脫穎而出。其中“後廠村靜靜”團隊-由畢業於北京大學的程惠閣(現已入職美團點評)單人組隊,勇奪“細粒度使用者評論情感分類”賽道的冠軍。本文系程惠閣對於本次參賽的思路總結和經驗分享,希望對大家能夠有所幫助和啟發。
背景
在2018全球AI挑戰賽中,美團點評主要負責了其中兩個頗具挑戰的主賽道賽題:細粒度使用者評論情感分析和無人駕駛視覺感知。其中NLP中心負責的細粒度使用者評論情感分析賽道,最受歡迎,參賽隊伍報名數量最多,約佔整個報名團隊的五分之一。
細粒度使用者評論情感分析賽道提供了6大類、20個細分類的中文情感評論資料,標註規模難度之大,在NLP語料特別是文字分類相關語料中都屬於相當罕見,這份資料有著極其重要的科研學術以及工業應用價值(目前在大眾點評App已經可以看到20個類別的情感標籤了)。
1. 工具介紹
在本次比賽中,採用了自己開發的一個訓練框架,來統一處理TensorFlow和PyTorch的模型。在模型程式碼應用方面,主要基於香港科技大學開源的RNet和MnemonicReader做了相應修改。在比賽後期,還加入了一個基於BERT的模型,從而提升了一些整合的效果。
2. 整體思路
整體將該問題看作20個Aspect的情感多分類問題,採用了傳統的文字分類方法,基於LSTM建模文字,End2End多Aspect統一訓練。
文字分類是業界一個較為成熟的問題,在2018年2月份,我參加了Kaggle的“作弊文字分類”比賽,當時的冠軍團隊主要依靠基於翻譯的資料增強方法獲得了成功。2018年反作弊工作中的一些實踐經驗,讓我意識到,資料是提升文字分類效果的第一關鍵。因此,我第一時間在網路上尋找到了較大規模的大眾點評評論語料,在Kaggle比賽的時候,NLP的語言模型預訓練還沒有出現,而隨著ELMo之類模型的成功,也很期待嘗試一下預訓練語言模型在這個資料集合上的整體效果。
3. 基礎模型思路
首先,嘗試了不使用預訓練語言模型的基礎模型,基於Kaggle Toxic比賽的經驗,直接使用了當時表現最好的LSTM Encode + Pooling作為基線模型。在Kaggle的比賽中,大家實驗的普遍結果是針對中長文字的分類任務的最佳單模型,都是基於RNN(LSTM/GRU)或者部分基於RNN的模型,比如RCNN、Capsule + RNN這樣的模型,而其他的模型,比如單純的CNN結構相對錶現較差,主要可能是因為RNN模型能更好地捕獲相對較長距離的順序資訊。
4. 模型層面最佳化
在基線模型的基礎上,效仿閱讀理解常見的做法,增加了Self Attention層(計算文字到文字自身的Attention權重),並將Attention之後的輸出和原始LSTM輸出,採用Gate(RNet)或者Semantic Fusion(MnemonicReader)的方式進行融合。
5. 模型細節處理
更寬的引數更多的模型效果更好
LSTM效果好於GRU。
Hidden size 400 > 200 > 100。
Topk Pooling + Attention Pooling的效果好於單獨的Max或者Attention Pooling。
共享層前置,Pooling層 和最後Fc層不同aspect引數獨佔效果更好(來自賽後實驗,以及其他團隊經驗)。
這裡推測主要原因:是這個資料集有20個Aspect,每個Aspect分4個不同的類別,所需要的引數相對較多。
三角學習率調節效果最佳
參考BERT開原始碼的學習率設定帶來較大效果提升。
採用Word + Char的詞建模方式
這種建模方式能結合分詞和字元粒度切分的好處,最大限度避免詞彙UNK帶來的損失。
注意對比Kaggle Toxic比賽那次比賽是英文語料,對應英文,當時的實驗結果是Word + Ngram的建模效果更好,收斂更快,所以針對不同NLP任務,我們需要具體進行分析。
採用儘可能大的詞表
和其他團隊相比,我採用了更大的詞表14.4W(Jieba分詞),19.8W(Sentence Piece Unigram分詞),依靠外部大眾點評評論資料基於fastText預訓練詞向量,能夠支援更大的詞表。同時為了避免訓練過擬合,採用了只Finetune訓練中高頻的詞對低頻詞固定詞向量的處理方式。
最開始,預計情感相關的詞彙相對較少,不需要較大的詞表,但是實驗過程中發現更大的詞表相對地能夠提升效能,前提是利用較多的外部資料去比較好的刻畫訓練資料中低頻詞的向量。在理論上,我們可以採用一個儘可能大的詞表在預測過程中去儘可能的減少UNK的存在(有論文的結論是對應UNK不同的詞賦於不同隨機向量效果,好於一個固定的UNK向量。這裡類似,如果我們賦予一個基於無監督外部資料,透過語言模型訓練得到的向量則效果更好)。
6. 預訓練語言模型
這部分是模型效果提升的關鍵,這裡採用了ELMo Loss。在簡單嘗試了官方的ELMo版本之後,感覺速度相對比較慢,為此,採用了自己實現的一個簡化版的ELMo,實質上只使用了ELMo的Loss部分。
在當前雙層LSTM Encoder的基礎上,採用了最小代價的ELMo引入,也就是對當前模型的第一層LSTM進行基於ELMo Loss的預訓練,而Finetune的時候,模型結構和之前完全不變,只是第一層LSTM以及詞向量部分採用的ELMo預訓練的初始化結果,另外在ELMo的訓練過程中,也採用了基於fastText的詞向量引數初始化。這個設計使得ELMo訓練以及Finetune訓練的收斂,都加快了很多,只需要大概1小時的ELMo訓練,就能在下游任務產生明顯受益。值得一提的是,ELMo和Self Attention的搭配在這個資料集合效果非常好。
7. 模型整合
為了取得更好的模型多樣性,採用了多種粒度的分詞方式,在Jieba分詞的主要模型基礎上,同時引入了基於SentencePiece的多種粒度分詞。SentencePiece分詞能帶來更短的句子長度,但是分詞錯誤相對Jieba略多,容易過擬合,因此採用了只Finetune Char向量,固定詞向量的策略來避免過擬合。多種粒度的分詞配合Word + Char的建模方式帶來了很好的模型多樣性。
此外,模型維度的多樣性來源自RNet結構和MnemonicReader結構,以及BERT模型的結構的不同。
在模型選擇的時候選取了平均F1值最優的輪次模型,整合的時候採用了按Aspect效果分開加權整合的方式(權重來自Valid資料的F1分值排序)。基於以上的多樣性策略,只需要7個單模型整合就能取得較好的效果。
8. 關於BERT
在實驗中基於Char的BERT單模型,在本次比賽中並沒有取得比ELMo更好的效果,受限於512的長度和只基於Char的限制,目前看起來BERT模型在這個資料集合更容易過擬合,Train Loss下降較快,對應Valid Loss效果變差。相信透過適當的最佳化BERT模型能取得更好的效果。
9. 後續最佳化
F1的最佳化是一個有意思的方向。本次比賽中,沒有對此做特殊處理,考慮到F1是一個全域性最佳化值,如果基於Batch強化學習,每個Batch可能很難擬合稀有樣本分佈。
BERT的進一步最佳化。因為BERT出現之前,基於Transformer的模型在長文字分類效果大都是差於基於LSTM的模型的,所以如果我們按照BERT的Loss去預訓練基於LSTM而不是Transformer的模型,在分類問題層面的效果如何?另外,在這個資料集合基於Transformer的BERT,能否取得比ELMo更好的分類效果?
對話AI Challenger 2018冠軍:程惠閣
Q:談談對本次參賽的感受?
程惠閣:作為一個多年的演算法從業者,我真實的感受到在AI時代,技術更新非常之快,比如席捲而來的ELMo、BERT等預訓練語言模型在工業界影響力之大。包括美團在內的很多公司都快速跟進並上線,而且取得了很好收益,因此技術人員時刻保持學習的心態是非常重要的。
而比賽和工作存在很大的不同,比賽相對更加單純明確,比賽可以使我在最短時間去學習實驗驗證一些新的技術,而在標準資料集合驗證有效的模型策略,往往在工作中也有實際的價值。對於比賽以及工作中的模型開發,我覺得比較重要的一點首先要做好細緻的模型驗證部分,在此基礎上逐步開發迭代模型才有意義。比如在這次比賽中,我從一開始就監控了包括整體以及各個Aspect的包括F1、AUC、Loss等等各項指標。
Q:對學習演算法的新同學有哪些建議?
程惠閣:如果有時間,可以系統地學習一些名校的深度學習相關的課程,還有很重要的一點,就是實踐,我們可以參加去學校專案或者去大公司實習,當然也可以利用AI Challenger、Kaggle這樣的競賽平臺進行實踐。
Q:為什麼會選擇參加細粒度使用者評論情感分類這個賽道?
程惠閣:因為我之前參加過類似的比賽,並且做過文字分類相關的工作,對這個賽道的賽題也比較感興趣。
Q:本次比賽最有成就感的事情是什麼?
程惠閣:不斷迭代提升效果帶來的成就感吧,特別是簡化版ELMo帶來的效果提升。
Q:參賽過程中,有哪些收穫和成長?
程惠閣:作為一個TensorFlow重度使用者,我學會了使用PyTorch並且體驗到PyTorch帶來的優雅與高效。體驗到了預訓練語言模型的威力。在比賽中和比賽後,我也收穫了很多志同道合的朋友,和他們的交流學習,也幫助我提高了很多。
更重要的是,因為這次比賽,我加入了美團點評這個大家庭,入職這段時間,讓我真切地感受到美團點評為了提升使用者體驗,為了讓使用者吃的更好,生活更好,在技術方面做了大量的投入。