2020年初,新冠疫情席卷全球。除了“待在家,不亂跑”,我想還能從哪為抗擊疫情出點(diǎn)微薄之力呢?
碰巧室友推送了一個(gè)天池公益賽“新冠疫情相似句對(duì)判定大賽”,秉持“重在參與”的心態(tài)參加了比賽。經(jīng)過半個(gè)月的努力,最終結(jié)果勉強(qiáng)不錯(cuò)(第6),收割了一臺(tái)Kindle。
2021年1月,疫情形勢(shì)依然嚴(yán)峻,幸運(yùn)的是國(guó)家不僅及時(shí)穩(wěn)住了疫情,還研發(fā)出了有效的疫苗。借助疫情主題的比賽,我希望幫助更多讀者,入門自然語(yǔ)言處理的基本任務(wù)——文本匹配。
開源代碼:
https://github.com/yechens/COVID-19-sentence-pair
01 數(shù)據(jù)分析任務(wù)背景非常直觀,主辦方給定了“肺炎”、“支氣管炎”、“上呼吸道感染”等醫(yī)療背景下的用戶真實(shí)提問,要求選手通過算法識(shí)別任意2個(gè)問題,是否表達(dá)同一個(gè)意思。舉例:
問題1:“輕微感冒需不需要吃藥?”
問題2:“輕微感冒需要吃什么藥?”
問題1關(guān)心“是否得吃藥”,問題2關(guān)心“該吃什么藥”,側(cè)重點(diǎn)不同所以意思不同。
數(shù)據(jù)集樣本都是三元組(query1, query2, label)。為了降低難度,每一個(gè)問題的長(zhǎng)度被控制在20字以內(nèi)。
比賽的訓(xùn)練集、驗(yàn)證集分別包含8746、2001條三元組。我們從dev中隨機(jī)保留了800條樣本作為最終dev,其余均加入訓(xùn)練。
數(shù)據(jù)增強(qiáng)拿到數(shù)據(jù)簡(jiǎn)單分析后,我發(fā)現(xiàn)數(shù)據(jù)集已經(jīng)過清洗,竟然異常的干凈整齊(沒有雜亂的符號(hào)、不通順的句子),label分布幾乎也接近1:1。
再觀察數(shù)據(jù),相同的query1總是按順序排列在一起,隨后跟著不同的query2。這種分布很容易想到一種數(shù)據(jù)增強(qiáng)策略:相似傳遞性。
A 《-》 B 相似 and A 《-》 C 相似 =》 B 《-》 C 相似
最終我額外獲得了5000條高質(zhì)量的數(shù)據(jù),比賽準(zhǔn)確率因此提升了0.5%。
實(shí)體替換此外,我們也嘗試了訓(xùn)練一個(gè)NER模型挖掘文本中的醫(yī)療實(shí)體,如“胸膜炎”、“肺氣腫”,再通過word2vec查找最接近的實(shí)體進(jìn)行替換。
但這種方式并沒有提升最終結(jié)果。我覺得原因有2個(gè):
1W條樣本規(guī)模偏小,NER模型識(shí)別誤差較大
詞向量沒有針對(duì)醫(yī)療場(chǎng)景訓(xùn)練,包含的醫(yī)療實(shí)體很少
02 匹配方法實(shí)現(xiàn)文本匹配有非常多簡(jiǎn)單又實(shí)用的方法,例如:
基于字符統(tǒng)計(jì):字符串匹配、編輯距離、Jaccards距離
基于語(yǔ)言模型:word2vec/glove詞向量、BERT
基于神經(jīng)網(wǎng)絡(luò):孿生網(wǎng)絡(luò)、TextCNN、DSSM、FastText等
由于比賽需要盡可能獲得高分,這里主要介紹基于神經(jīng)網(wǎng)絡(luò)和BERT的文本匹配算法。
BERT[1]是一種預(yù)訓(xùn)練語(yǔ)言模型,通過海量文本、Transformer架構(gòu)和MLM訓(xùn)練任務(wù)在眾多NLP任務(wù)上取得了優(yōu)異成果。對(duì)BERT不了解的讀者,可以參考我之前的文章“從BERT、XLNet到MPNet,細(xì)看NLP預(yù)訓(xùn)練模型發(fā)展變遷史”[2]。
比賽中我們測(cè)試了5-6種不同的神經(jīng)網(wǎng)絡(luò)方法,并最終選擇了3種在dev上表現(xiàn)最好的模型加權(quán)融合。具體可以參考 文件。
文本CNN(TextCNN)TextCNN是Yoon Kim[3]在2014年提出的用于句子分類的卷積神經(jīng)網(wǎng)絡(luò)。文本匹配任務(wù)本質(zhì)上可以理解成二分類任務(wù)(0:不相似,1:相似),所以一般的分類模型也能滿足匹配需求。
與圖像中的二維卷積不同,TextCNN采用的是一維卷積,每個(gè)卷積核的大小為 (h為卷積核窗口,k為詞向量維度)。文中采用了不同尺寸的卷積核,來(lái)提取不同文本長(zhǎng)度的特征。
然后,作者對(duì)于卷積核的輸出進(jìn)行最大池化操作,只保留最重要的特征。各個(gè)卷積核輸出經(jīng)MaxPooling后拼接形成一個(gè)新向量,最后輸出到全連接層分類器(Dropout + Linear + Softmax)實(shí)現(xiàn)分類。
我們知道,文本中的關(guān)鍵詞對(duì)于判斷2個(gè)句子是否相似有很大影響,而CNN局部卷積的特效能很好的捕捉這種關(guān)鍵特征。同時(shí)TextCNN還具有參數(shù)量小,訓(xùn)練穩(wěn)定等優(yōu)點(diǎn)。
文本RNN(TextRCNN)相比TextCNN,TextRCNN的模型結(jié)構(gòu)看起來(lái)復(fù)雜一些。
簡(jiǎn)單瀏覽論文后,會(huì)發(fā)現(xiàn)它的思路其實(shí)簡(jiǎn)單,粗暴。
首先通過詞向量獲得字符編碼 ,隨后將其通過雙向RNN學(xué)習(xí)上下文特征,編碼得到兩個(gè)方向的特征。
再將詞向量 和 、 拼接得到新向量,輸入經(jīng)tanh函數(shù)激活的全連接網(wǎng)絡(luò)。最后,將網(wǎng)絡(luò)的輸出最大池化,并輸入另一個(gè)全連接分類器完成分類。
RNN模型對(duì)于長(zhǎng)文本有較好的上下文“記憶”能力,更適合處理文本這種包含時(shí)間序列的信息。
BERT+MLP(fine-tune)最后一種方法,直接用語(yǔ)言模型BERT最后一層Transformer的輸出,接一層Dense實(shí)現(xiàn)文本匹配。
實(shí)驗(yàn)中我們發(fā)現(xiàn),對(duì)最終輸出的每個(gè)token特征取平均(MeanPooling)效果好于直接使用首字符“[CLS]”的特征。
模型權(quán)重上,崔一鳴等人[5]發(fā)布的中文roberta_wwm_ext_large模型效果要好于BERT_large。
最后,我們根據(jù)這三種模型在dev上的準(zhǔn)確率設(shè)置了不同比重,通過自動(dòng)搜索找到最優(yōu)權(quán)重組合,在線上測(cè)試集取得了96.26%的準(zhǔn)確率。
讀者可以在“NLP情報(bào)局”后臺(tái)回復(fù)“文本匹配”直接下載模型論文。
03 漲分trick做一個(gè)深度學(xué)習(xí)主導(dǎo)的算法比賽,除了分析數(shù)據(jù)與模型,一些trick也是獲得高分的重要因素。這里羅列了一些常用策略。
數(shù)據(jù)增強(qiáng)[6]
標(biāo)簽平滑
自蒸餾
文本對(duì)抗訓(xùn)練[7]
模型融合
特征篩選
使用多個(gè)學(xué)習(xí)率[8]
針對(duì)這次文本匹配任務(wù),數(shù)據(jù)增強(qiáng)、標(biāo)簽平滑、模型融合、多學(xué)習(xí)率都被證明是有效的。
04 總結(jié)過去將近1年的天池“新冠疫情相似句對(duì)判定大賽”,任務(wù)并不復(fù)雜,是入門NLP項(xiàng)目實(shí)戰(zhàn),提升編程能力的很好鍛煉機(jī)會(huì)。
比賽雖然結(jié)束了,疫情猶在。大家一定要保護(hù)好自己哦!
編輯:jq
-
神經(jīng)網(wǎng)絡(luò)
+關(guān)注
關(guān)注
42文章
4784瀏覽量
101245 -
數(shù)據(jù)集
+關(guān)注
關(guān)注
4文章
1209瀏覽量
24850 -
nlp
+關(guān)注
關(guān)注
1文章
489瀏覽量
22119
原文標(biāo)題:天池NLP賽道top指南
文章出處:【微信號(hào):zenRRan,微信公眾號(hào):深度學(xué)習(xí)自然語(yǔ)言處理】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論