之前沒(méi)認(rèn)真打過(guò)煉丹的比賽,這次機(jī)緣巧合碰上了三個(gè)牛逼又靠譜的隊(duì)友,就堅(jiān)持把這次比賽打完了。剛開(kāi)始的時(shí)候沒(méi)想到這次能拿下第一,趁著剛答辯完就順帶把這次NLP賽道的方案開(kāi)源出來(lái),歡迎各位同學(xué)參考和討論。
賽題分析
賽題介紹
這次的比賽由NLP和推薦兩部分組成,推薦的特征工程實(shí)在是做不明白,這次主要還是做NLP的部分。
抄一下官網(wǎng)的NLP賽題介紹:面向?qū)嶓w對(duì)象的文本描述情感極性及色彩強(qiáng)度分析。情感極性和強(qiáng)度分為五種情況:極正向、正向、中立、負(fù)向、極負(fù)向。選手需要針對(duì)給定的每一個(gè)實(shí)體對(duì)象,從文本描述的角度,分析出對(duì)該實(shí)體的情感極性和強(qiáng)度。
NLP任務(wù)的評(píng)價(jià)指標(biāo)為macro-F1,在計(jì)算準(zhǔn)確和召回的時(shí)候,是按照分析的實(shí)體數(shù)進(jìn)行計(jì)數(shù)的,而非樣本數(shù)。
拿一條數(shù)據(jù)來(lái)舉例子(截取部分文本):
{ "content": "離婚之后的林慶昆本以為會(huì)有一番更大的天地,沒(méi)想到離開(kāi)了吳敏自己什么都不是......", "entity": {"吳敏": 1, "林慶昆": -1} }
這條數(shù)據(jù)里有一段文本和兩個(gè)實(shí)體,需要預(yù)測(cè)出這兩個(gè)實(shí)體在文本中的情感極性,情感標(biāo)簽為-2, -1, 0, 1, 2五個(gè)。
簡(jiǎn)單分析可以知道這題可以定義為Aspect-level Sentiment Classification。
數(shù)據(jù)分析
在正式建模之前需要進(jìn)行一些簡(jiǎn)單的數(shù)據(jù)分析來(lái)挖掘賽題的特點(diǎn)。在這里截取一張和隊(duì)友一起做的PPT的圖:
數(shù)據(jù)分析
我們對(duì)數(shù)據(jù)中的文本長(zhǎng)度、實(shí)體數(shù)量和標(biāo)簽分布進(jìn)行了簡(jiǎn)單的分析,這提示我們:
有部分文本長(zhǎng)度超過(guò)BERT的512最大長(zhǎng)度,或許可以考慮長(zhǎng)文本處理的常用技巧;
實(shí)體的情感標(biāo)簽分布不平衡,最少的類只有2%左右,或許可以考慮不平衡分類問(wèn)題的技巧。
但實(shí)驗(yàn)證明上面這些考慮最后都只會(huì)成為掉分點(diǎn),具體的思考在后文論述。
模型構(gòu)建
Baseline
官方公布了賽題的Baseline,NLP賽道的Baseline大致是如下思路:將一段文本和文本中的一個(gè)實(shí)體拼成一條數(shù)據(jù),一段文本對(duì)應(yīng)N個(gè)實(shí)體就會(huì)有N條數(shù)據(jù)。將一條數(shù)據(jù)輸入BERT-based分類器后輸出一個(gè)實(shí)體。
仍然以上一節(jié)的case為例,按Baseline的做法這條數(shù)據(jù)會(huì)被拆成兩條數(shù)據(jù)輸入到BERT:
[CLS] 吳敏 [SEP] 離婚之后的林慶昆本以為會(huì)有一番更大的天地,沒(méi)想到離開(kāi)了吳敏自己什么都不是... [SEP] [CLS] 林慶昆 [SEP] 離婚之后的林慶昆本以為會(huì)有一番更大的天地,沒(méi)想到離開(kāi)了吳敏自己什么都不是... [SEP]
然后以BERT輸出的[CLS]位置的語(yǔ)義向量通過(guò)MLP分類器得到情感極性。
實(shí)際上我想思路的時(shí)候我還沒(méi)看到Baseline,看到Baseline的做法之后我就搖頭。
這里再截一張PPT的圖說(shuō)明Baseline有什么問(wèn)題:
就是說(shuō),一方面預(yù)期效果不好,因?yàn)锽aseline構(gòu)造數(shù)據(jù)的方式使分布發(fā)生了變化(有一個(gè)實(shí)體的文本模型會(huì)看它一次,有30個(gè)實(shí)體的文本模型就會(huì)看它30次,但是這點(diǎn)也存疑,因?yàn)榇疝q過(guò)程中有選手表示發(fā)現(xiàn)了數(shù)據(jù)的leak,后續(xù)的方法可能是使用了這個(gè)leak所以效果才會(huì)好的);另一方面把一段文本復(fù)制了好多遍顯然會(huì)導(dǎo)致效率大大下降;還有一點(diǎn)在PPT里沒(méi)說(shuō)的是沒(méi)有考慮到實(shí)體之間可能存在的潛在關(guān)系。
設(shè)計(jì)思路
再?gòu)腜PT里截一張圖:
在做這題的時(shí)候我就會(huì)思考如何做得優(yōu)雅,最好方法是simple yet effective的。最好就是使用以預(yù)訓(xùn)練BERT為backbone的分類器,不對(duì)模型結(jié)構(gòu)做太大修改,而且還要能在一次輸入之內(nèi)就并行分類所有實(shí)體。
除了BERT還考慮使用XLNet,因?yàn)閄LNet使用了相對(duì)位置編碼,可以原生支持超長(zhǎng)文本的輸入,而且XLNet的Tokenizer是字詞結(jié)合的,可以適應(yīng)本次比賽文本長(zhǎng)度較長(zhǎng)的情況。
模型架構(gòu)
大概想了不到一個(gè)小時(shí),想到了如下的方案:
如圖所示,模型的整體架構(gòu)就是一個(gè)普通的分類模型,在預(yù)訓(xùn)練的BERT或XLNet模型基礎(chǔ)上增加了簡(jiǎn)單的MLP分類器。這個(gè)思路的要點(diǎn)在于改變數(shù)據(jù)輸入的方式,利用BERT和XLNet作為Masked Language Model的性質(zhì),以[SEP]符號(hào)為界,第一段為文本輸入,第二段按順序輸入所有實(shí)體,實(shí)體之間以[MASK]進(jìn)行分隔,這個(gè)[MASK]標(biāo)簽通過(guò)BERT Encoder得到的語(yǔ)義向量就代表對(duì)應(yīng)實(shí)體的情感極性。將所有[MASK]位置的語(yǔ)義向量通過(guò)分類器即可并行對(duì)所有的實(shí)體進(jìn)行分類。
這套思路不加Trick的情況下線上F1就可以到69+,讓我在比賽前期就能超過(guò)大部分使用Baseline的團(tuán)隊(duì)。
另外根據(jù)線下指標(biāo)推測(cè)最終Accuracy在90+,說(shuō)明這題訓(xùn)練和測(cè)試集基本上同分布。
一些補(bǔ)充的思考
要說(shuō)這個(gè)方法為什么會(huì)有用,我一開(kāi)始推測(cè)是因?yàn)榭紤]了實(shí)體之間的潛在關(guān)系,而且對(duì)數(shù)據(jù)分布的假設(shè)更加合理。
后來(lái)決賽答辯的時(shí)候聽(tīng)到有選手提到這個(gè)數(shù)據(jù)存在leak,也就是在數(shù)據(jù)中標(biāo)簽非0的實(shí)體會(huì)被排在前面,標(biāo)簽為0的實(shí)體會(huì)被排在后面。我突然就覺(jué)得這可能就是這個(gè)方法提升巨大的真正原因,用了這個(gè)方法之后,相當(dāng)于模型從中學(xué)到了一個(gè)bias,就是靠近文本末尾的實(shí)體,標(biāo)簽為0的可能性更大。
另外,在比賽中期,“靈境”組在討論區(qū)公開(kāi)了一個(gè)方案,我們發(fā)現(xiàn)該方案的核心思路和我們不謀而合。在該方案公開(kāi)后很多隊(duì)伍的分?jǐn)?shù)都追上來(lái)了,在決賽答辯過(guò)程中我也發(fā)現(xiàn)很多高分團(tuán)隊(duì)都搬運(yùn)了這套方案。公開(kāi)的方案和我們做法基本一致,不過(guò)使用了一個(gè)含有MLM的全套BERT類模型,第二段文本(在該方案中被稱為Prompt)的形式為:“在這句話中,<實(shí)體1>是[MASK],<實(shí)體2>是[MASK]......”,然后MLM頭輸出詞表大小維度(21128)的向量,取五個(gè)Token作為Verbalizer(壞、差、平、行、好),分別對(duì)應(yīng)五個(gè)情感極性標(biāo)簽,忽略其他的Token。
然而,這套方案和我們的做法還存在一定差別,這也是我認(rèn)為該方案在這個(gè)任務(wù)上存在的一些問(wèn)題:
我們不稱輸入的第二段文本為"Prompt",因?yàn)檫@容易和Prompt Tuning概念中的Prompt混淆。該任務(wù)并不適合Prompt Tuning范式,而仍然是采用普通的對(duì)全模型進(jìn)行參數(shù)更新的Full Tuning范式。因此在該題中,“Prompt”的形式如何并不重要,增加一些沒(méi)什么用的詞反而會(huì)擠占第一段文本的輸入長(zhǎng)度。
該方案使用了BERT的MLM頭進(jìn)行分類,21128維的詞表中只有五個(gè)Token映射到有效標(biāo)簽,其余Token都被忽略。這和我們的方案在結(jié)構(gòu)上基本等價(jià),唯一的區(qū)別是該方案有MLM頭的參數(shù)初始化而我們的分類層為隨機(jī)初始化,這個(gè)區(qū)別是否會(huì)帶來(lái)性能提升不知道,但是直觀的是模型增加了至少768*21123=16M(或者1024*21123=22M)的無(wú)用參數(shù)量,在題目有模型總大小限制的情況下這意味著可以融合的模型變少了。
模型優(yōu)化
針對(duì)上述提出的模型,我們進(jìn)行了很多優(yōu)化嘗試,下面主要討論上分較多的技巧,沒(méi)什么用的東西就在最后放一小節(jié)補(bǔ)充說(shuō)明。很多優(yōu)化技巧都會(huì)導(dǎo)致訓(xùn)練或測(cè)試階段時(shí)空開(kāi)銷大大提升,比賽時(shí)還是應(yīng)該視情況使用。
線下數(shù)據(jù)劃分方式
隊(duì)友發(fā)現(xiàn),初賽階段使用前90%數(shù)據(jù)訓(xùn)練,后10%驗(yàn)證,可以取得最好的線上效果,隨機(jī)10%效果會(huì)變差一些,增加訓(xùn)練數(shù)據(jù)也不能使效果變好。復(fù)賽階段使用了同樣的數(shù)據(jù)劃分方式。
對(duì)抗訓(xùn)練(FGM)
在各類文本分類任務(wù)中,常用的提升NLP模型訓(xùn)練魯棒性和泛化能力的有效方法。簡(jiǎn)單來(lái)說(shuō)是在Embedding層的參數(shù)有一定程度擾動(dòng)時(shí)也盡量保證模型能分類正確。事后估計(jì)初賽線上提升1%左右。
參考了這篇知乎文章的實(shí)現(xiàn)方法:Nicolas:【煉丹技巧】功守道:NLP中的對(duì)抗訓(xùn)練 + PyTorch實(shí)現(xiàn)
模型平均 (SWA)
對(duì)訓(xùn)練過(guò)程中的多個(gè)checkpoint進(jìn)行權(quán)重平均,或許可以有助于模型收斂到loss landscape平坦區(qū)域的中心,提升模型的泛化能力。具體而言,我們?cè)隍?yàn)證指標(biāo)的最高點(diǎn)開(kāi)始,將這一輪和到Early Stopping之前的各輪驗(yàn)證時(shí),驗(yàn)證指標(biāo)與最高點(diǎn)差值小于一定值的模型權(quán)重放進(jìn)來(lái)平均。事后估計(jì)初賽線上提升1%左右。
模型融合
沒(méi)什么好說(shuō)的,幾個(gè)模型預(yù)測(cè)的logits平均得到最終結(jié)果。值得注意的是這題有2G的模型總大小限制,因此我們需要考慮融合模型的異構(gòu)度不能盲目做K折,最后融合了2個(gè)稍微異構(gòu)的XLNet-Mid + 1個(gè)MacBERT-Large + 1個(gè)RoBERTa-Large,全部保存為FP16格式,模型文件總大小2043M正好小于2G。估計(jì)初賽提升大約1%,復(fù)賽提升大約2%。
偽標(biāo)簽
在模型融合的基礎(chǔ)上,使用融合模型預(yù)測(cè)的測(cè)試集標(biāo)簽作為偽標(biāo)簽,將測(cè)試集數(shù)據(jù)加入訓(xùn)練集中再次訓(xùn)練模型。在復(fù)賽中,我們?yōu)榱吮苊舛嗄P驮跍y(cè)試集上的預(yù)測(cè)結(jié)果失去異構(gòu)性,我們沒(méi)有把全部測(cè)試數(shù)據(jù)都加入訓(xùn)練集,而是四個(gè)模型預(yù)測(cè)結(jié)果投票,大于等于三個(gè)模型預(yù)測(cè)一致的數(shù)據(jù)才會(huì)被加入訓(xùn)練集。這個(gè)訓(xùn)練集會(huì)重新被用于訓(xùn)練四個(gè)模型,然后重新進(jìn)行融合。復(fù)賽在模型融合基礎(chǔ)上還有1%左右的提升。
復(fù)賽數(shù)據(jù)適配
如圖所示。在復(fù)賽開(kāi)始的時(shí)候,起初我們使用初賽訓(xùn)練集+復(fù)賽訓(xùn)練集的全量訓(xùn)練數(shù)據(jù)對(duì)模型進(jìn)行訓(xùn)練,結(jié)果發(fā)現(xiàn)效果不好。后來(lái)發(fā)現(xiàn)復(fù)賽數(shù)據(jù)相比初賽數(shù)據(jù)的分布可能發(fā)生了較大的偏移,因此我們考慮用初賽訓(xùn)練好的模型的權(quán)重來(lái)對(duì)模型進(jìn)行初始化,然后只在復(fù)賽數(shù)據(jù)集上訓(xùn)練。相比全量數(shù)據(jù)訓(xùn)練提升近3%,驗(yàn)證了我們的猜想。
沒(méi)什么用的
R-Drop:在有了FGM,SWA等東西的情況下沒(méi)有什么提升,而且還慢。
PGD:慢而且相比FGM沒(méi)什么提升。
EMA:有了SWA之后也顯得沒(méi)用。
數(shù)據(jù)增強(qiáng):嘗試了EDA和AEDA,本來(lái)以為會(huì)有用實(shí)際上沒(méi)用。
長(zhǎng)文本處理:估計(jì)是沒(méi)有什么用,某次偶然發(fā)現(xiàn)設(shè)置最大長(zhǎng)度512的XLNet和最大長(zhǎng)度800的XLNet相比效果基本沒(méi)有差別,用MacBERT和RoBERTa訓(xùn)的模型和XLNet比效果也相差不大。推測(cè)可能是因?yàn)榍鞍攵挝谋镜?a target="_blank">信息量已經(jīng)足夠?qū)^大多數(shù)實(shí)體正確分類了。
標(biāo)簽不平衡處理:嘗試過(guò)Focal Loss和類別重加權(quán),也沒(méi)有什么用。猜測(cè)可能是因?yàn)閿?shù)據(jù)中2和-2的數(shù)據(jù)量也相對(duì)充足(各有幾千個(gè)實(shí)體),在普通Cross Entropy下充分學(xué)習(xí)也可以對(duì)這些類大部分樣本正確分類了,而修改Loss反而會(huì)扭曲模型學(xué)習(xí)到的分布,對(duì)于訓(xùn)練和測(cè)試同分布的情況下反而不利。
評(píng)測(cè)結(jié)果
初賽、復(fù)賽和決賽評(píng)測(cè)均為NLP賽道第一。
審核編輯 :李倩
-
數(shù)據(jù)分析
+關(guān)注
關(guān)注
2文章
1395瀏覽量
33916 -
nlp
+關(guān)注
關(guān)注
1文章
481瀏覽量
21937
原文標(biāo)題:競(jìng)賽 | Aspect-based的情感分析任務(wù)第一名方法解讀 -- 2022搜狐校園算法大賽
文章出處:【微信號(hào):zenRRan,微信公眾號(hào):深度學(xué)習(xí)自然語(yǔ)言處理】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論