在2020這個(gè)時(shí)間節(jié)點(diǎn),對(duì)于NLP分類任務(wù),我們的關(guān)注重點(diǎn)早已不再是如何構(gòu)造模型、拘泥于分類模型長(zhǎng)什么樣子了。如同CV領(lǐng)域當(dāng)前的重點(diǎn)一樣,我們更應(yīng)該關(guān)注如何利用機(jī)器學(xué)習(xí)思想,更好地去解決NLP分類任務(wù)中的低耗時(shí)、小樣本、魯棒性、不平衡、測(cè)試檢驗(yàn)、增量學(xué)習(xí)、長(zhǎng)文本等問(wèn)題。
本文以QA形式探討了以下問(wèn)題:
NLP分類任務(wù)我們每個(gè)NLPer都異常熟悉了,其在整個(gè)NLP業(yè)務(wù)中占據(jù)著舉足輕重的地位,更多領(lǐng)域的子任務(wù)也常常轉(zhuǎn)化為一個(gè)分類任務(wù),例如新聞分類、情感識(shí)別、意圖識(shí)別、關(guān)系分類、事件類型判斷等等。構(gòu)建一個(gè)完整的NLP分類任務(wù)主要包含4部分:標(biāo)簽定義、數(shù)據(jù)構(gòu)建、算法策略、測(cè)試部署。本文的組織架構(gòu),如下圖所示。
聲明:文中觀點(diǎn)謹(jǐn)代表筆者個(gè)人立場(chǎng),盲目搬運(yùn)有風(fēng)險(xiǎn)~
Q1: 如何科學(xué)地構(gòu)建分類標(biāo)簽體系?
分類標(biāo)簽的定義至關(guān)重要,面對(duì)復(fù)雜的標(biāo)簽問(wèn)題,最為關(guān)鍵的一點(diǎn)就是要緊密貼合業(yè)務(wù)、和專家共同設(shè)定,而不是靠“蠻力”去解決。這里給出筆者曾涉及到的一些標(biāo)簽定義方法:
長(zhǎng)尾標(biāo)簽:某些分類標(biāo)簽下的樣本天然就很少,可以把這一類標(biāo)簽設(shè)置「其他」,然后在下一層級(jí)單獨(dú)對(duì)這些長(zhǎng)尾標(biāo)簽進(jìn)一步處理。
易混淆標(biāo)簽:一些標(biāo)簽下的樣本表現(xiàn)形式不易區(qū)分,首先需要思考這類標(biāo)簽是否可以直接合并;如果不可以,可以先將這類標(biāo)簽進(jìn)行統(tǒng)一,然后在下一層級(jí)進(jìn)行規(guī)則處理。
多標(biāo)簽:一些場(chǎng)景下的標(biāo)簽設(shè)置可能達(dá)到幾百個(gè),可以設(shè)置多層級(jí)的標(biāo)簽體系進(jìn)行處理。例如,先構(gòu)建標(biāo)簽大類、再構(gòu)建標(biāo)簽小類;也可以設(shè)置多個(gè)二分類,適用于標(biāo)簽分類相對(duì)獨(dú)立,并且經(jīng)常需要新增修改的場(chǎng)景,能做到相互獨(dú)立、便于維護(hù)。
未知標(biāo)簽:業(yè)務(wù)冷啟動(dòng)時(shí),如果尚不清楚設(shè)置哪些標(biāo)簽合適,可以嘗試通過(guò)文本聚類方式初步劃分標(biāo)簽,再輔以專家介入共同設(shè)定,這也是一個(gè)循環(huán)迭代的過(guò)程。
對(duì)于上述的「長(zhǎng)尾標(biāo)簽」和「易混淆標(biāo)簽」,當(dāng)然也可在模型層面進(jìn)行優(yōu)化,這往往涉及樣本不平衡和hard example的處理問(wèn)題,我們?cè)谙挛脑敿?xì)闡述。
Q2: 標(biāo)注是「人工」智能的精髓所在,如何省成本、魯棒、高效地構(gòu)建任務(wù)數(shù)據(jù)集?
標(biāo)簽定義好后,就需要構(gòu)建分類任務(wù)數(shù)據(jù)集。數(shù)據(jù)集構(gòu)建,是日常工作的重要一環(huán)。既要省成本、也要魯棒,更要高效。構(gòu)建數(shù)據(jù)集的主要流程包括以下4步:
構(gòu)建初始數(shù)據(jù)集:為每個(gè)標(biāo)簽生產(chǎn)約100個(gè)樣本,具體的措施可以采取關(guān)鍵詞匹配等規(guī)則手段,再結(jié)合人工check進(jìn)行。
「主動(dòng)學(xué)習(xí)+遷移學(xué)習(xí)」降低標(biāo)注規(guī)模:1)主動(dòng)學(xué)習(xí)旨在挖掘高價(jià)值樣本:即通過(guò)構(gòu)建較少的樣本就可以滿足指標(biāo)要求。根據(jù)初始構(gòu)建的數(shù)據(jù)集,可以train一個(gè)base model,然后挑選一些不確定性程度高(熵最大)+代表性高(非離群點(diǎn))的樣本進(jìn)行人工標(biāo)注。2)遷移學(xué)習(xí)降低對(duì)數(shù)據(jù)的依賴:遷移學(xué)習(xí)中預(yù)訓(xùn)練語(yǔ)言模型的成功,可以使其在較少的標(biāo)注樣本上finetune就可達(dá)到目標(biāo)指標(biāo)。
擴(kuò)充標(biāo)注規(guī)模,數(shù)據(jù)增強(qiáng)最為關(guān)鍵:在標(biāo)注規(guī)模較小的少樣本場(chǎng)景下,可以通過(guò)文本增強(qiáng)方式擴(kuò)充數(shù)據(jù)集,撬動(dòng)數(shù)據(jù)杠桿。在《NLP中的少樣本困境問(wèn)題探究》一文中我們對(duì)有關(guān)的文本增強(qiáng)技術(shù)進(jìn)行了詳細(xì)探究。
清洗數(shù)據(jù)噪音,讓模型更加魯棒:對(duì)于標(biāo)注質(zhì)量問(wèn)題要嚴(yán)格把關(guān),標(biāo)志質(zhì)量除了人工核查,也可以下面的方法自動(dòng)化構(gòu)建降噪系統(tǒng):1)人工規(guī)則清洗:可以配置關(guān)鍵詞信息在內(nèi)的黑白名單進(jìn)行強(qiáng)規(guī)則清洗。2)交叉驗(yàn)證:可以通過(guò)對(duì)訓(xùn)練集進(jìn)行交叉驗(yàn)證,對(duì)那些標(biāo)簽不一致的樣本進(jìn)行去除或者人工糾正。3)置信學(xué)習(xí):本質(zhì)上是對(duì)交叉驗(yàn)證的進(jìn)一步推廣,構(gòu)建置信度混淆矩陣并引入rank機(jī)制過(guò)濾噪聲樣本?!秳e讓數(shù)據(jù)坑了你!用置信學(xué)習(xí)找出錯(cuò)誤標(biāo)注》一文中有詳細(xì)介紹。4)深度KNN過(guò)濾:KNN中的最近鄰度量,使其在魯棒學(xué)習(xí)中更加有效?!禗eep k-NN for Noisy Labels》一文表明:即使深度模型在含噪數(shù)據(jù)上進(jìn)行訓(xùn)練,而將模型中間層表示適配于KNN進(jìn)行噪聲樣本過(guò)濾,效果提升也很明顯。
在構(gòu)建數(shù)據(jù)集時(shí),除了上述4步外,也要注重一些細(xì)節(jié)和原則問(wèn)題:
針對(duì)少樣本問(wèn)題,不能盲目追求前沿算法的變現(xiàn)落地。很多時(shí)候,我們總想寄托于某種方法能夠通用地解決低資源問(wèn)題,但現(xiàn)實(shí)往往是策略調(diào)研的時(shí)間過(guò)長(zhǎng),指標(biāo)增益還沒(méi)有直接人工補(bǔ)標(biāo)數(shù)據(jù)來(lái)得快。筆者發(fā)現(xiàn),絕大數(shù)少樣本問(wèn)題,必要的人工標(biāo)注不可少,多策略組合+“有計(jì)劃、有策略”的人工標(biāo)注也許是解決少樣本問(wèn)題的最佳方式。
智能標(biāo)注是否是一個(gè)偽命題?智能標(biāo)注的本質(zhì)是高效,但主動(dòng)學(xué)習(xí)往往并不高效。主動(dòng)學(xué)習(xí)需要對(duì)專家系統(tǒng)多次查詢來(lái)進(jìn)行標(biāo)注。所以采用主動(dòng)學(xué)習(xí)方法時(shí),不僅要降低標(biāo)注規(guī)模,也要注意降低查詢次數(shù)。實(shí)踐中,我們可以根據(jù)經(jīng)驗(yàn)公式,優(yōu)先對(duì)指標(biāo)增益明顯的類別標(biāo)簽進(jìn)行主動(dòng)查詢。也可以根據(jù)經(jīng)驗(yàn)公式預(yù)估一下滿足增益目標(biāo)的數(shù)據(jù)補(bǔ)充量,一次查詢盡量滿足要求,多標(biāo)一點(diǎn)也沒(méi)關(guān)系。所謂的“智能標(biāo)注系統(tǒng)”是否真正的智能,筆者總覺(jué)得多多少少還是不能脫離人工介入。
預(yù)訓(xùn)練模型要具備領(lǐng)域性,不要停止預(yù)訓(xùn)練!當(dāng)我們所執(zhí)行任務(wù)的標(biāo)注數(shù)據(jù)較少,所屬的領(lǐng)域與初始預(yù)訓(xùn)練語(yǔ)料越不相關(guān),那就不要停止領(lǐng)域預(yù)訓(xùn)練!
筆者這里給出了上述一些策略的簡(jiǎn)要實(shí)驗(yàn)結(jié)果,如下圖所示:
Q3: 模型化就是唯一嗎?分類任務(wù)中,算法策略構(gòu)建的基本原則是什么?
算法策略主要包括規(guī)則挖掘和模型化方法,基本原則應(yīng)是:
規(guī)則兜底:高頻case和hard case優(yōu)先進(jìn)入規(guī)則模塊,防止因模型的更新迭代,而使針對(duì)重要case的處理不夠健壯。規(guī)則挖掘主要包括重要case緩存、模式挖掘、關(guān)鍵詞+規(guī)則設(shè)置等。此外,規(guī)則也可以跟在分類模型后面進(jìn)行兜底處理。
模型泛化:模型化方法適合處理無(wú)法命中規(guī)則的case,具備泛化性。還有另一種處理邏輯是:如果case命中了規(guī)則,但模型對(duì)于規(guī)則預(yù)測(cè)的結(jié)果給出了很低的置信度(也就是模型認(rèn)為另一種類別的置信度更高),這時(shí)我們可以選擇相信模型,以模型輸出為準(zhǔn)。
不過(guò),無(wú)論是對(duì)于規(guī)則,還是模型,長(zhǎng)尾問(wèn)題的處理都是比較棘手的,但我們可以通過(guò)一些手段盡可能加強(qiáng)處理長(zhǎng)尾case的能力(Q6中具體介紹)。
Q4: 特征挖掘立竿見(jiàn)影,如何在特征工程方面搞點(diǎn)事情?
對(duì)于NLP分類任務(wù),特別是垂直領(lǐng)域的分類任務(wù),如果能夠在業(yè)務(wù)特征層面更好地進(jìn)行挖掘,那么指標(biāo)增益可是立竿見(jiàn)影啊~
在特征工程方面,筆者這里主要給出了3種技巧:
離散數(shù)據(jù)挖掘
構(gòu)建關(guān)鍵詞的高維稀疏特征:類似結(jié)構(gòu)化數(shù)據(jù)挖掘(如CTR中的wide&deep),比如根據(jù)關(guān)鍵詞列表對(duì)文本內(nèi)容進(jìn)行挖掘,構(gòu)建高維稀疏特征并喂入xDeepFM[1]中進(jìn)行處理,最后與文本向量一同拼接。
其他業(yè)務(wù)特征:如疾病大類劃分、就診科室等業(yè)務(wù)特征。
文本特征挖掘
關(guān)鍵詞&實(shí)體詞與文本拼接:將從文本序列提取的關(guān)鍵詞或?qū)嶓w詞拼接在文本序列后,再進(jìn)行分類。如在BERT中:[CLS][原始文本][SEP][關(guān)鍵詞1][SEP][實(shí)體詞1]...
關(guān)鍵詞embedding化:將關(guān)鍵詞劃分為不同的類別屬性,進(jìn)行embedding化,不同于離散數(shù)據(jù)挖掘,這里的embedding不應(yīng)稀疏。
領(lǐng)域化向量挖掘:除了在領(lǐng)域語(yǔ)料上繼續(xù)預(yù)訓(xùn)練詞向量外,還可以有監(jiān)督地構(gòu)建詞向量:例如對(duì)于21分類問(wèn)題,先根據(jù)弱監(jiān)督方法訓(xùn)練21個(gè)基于SVM的二分類器,然后提取每個(gè)詞匯在21個(gè)SVM中的權(quán)重,即可為每個(gè)詞匯可以構(gòu)建21維的詞向量。
標(biāo)簽特征融入
標(biāo)簽embedding 化:設(shè)置label embedding,然后通過(guò)注意力機(jī)制與詞向量進(jìn)行交互,提取全局向量分類。
標(biāo)簽信息補(bǔ)充:可以將類別標(biāo)簽與原始文本一同拼接,然后進(jìn)行2分類,如在BERT中:[CLS][原始文本][SEP][類別標(biāo)簽]。此外,也可以通過(guò)強(qiáng)化學(xué)習(xí)動(dòng)態(tài)地補(bǔ)充標(biāo)簽信息,具體可參考文獻(xiàn)[2]。
Q5: 數(shù)據(jù)為王,不要將數(shù)據(jù)閑置,如何將無(wú)標(biāo)注數(shù)據(jù)更好地派上用場(chǎng)?
大量的無(wú)標(biāo)注數(shù)據(jù)蘊(yùn)藏著巨大的能量!機(jī)器學(xué)習(xí)中,能夠充分利用、并挖掘無(wú)標(biāo)注數(shù)據(jù)價(jià)值的,自然是——自監(jiān)督學(xué)習(xí)和半監(jiān)督學(xué)習(xí)了。
自監(jiān)督學(xué)習(xí):乘風(fēng)破浪的NLP預(yù)訓(xùn)練語(yǔ)言模型充分利用了無(wú)標(biāo)注數(shù)據(jù),展現(xiàn)出強(qiáng)大能力。而如果我們?cè)O(shè)計(jì)分類任務(wù)時(shí),能夠釋放更多的無(wú)標(biāo)注數(shù)據(jù),亦或者通過(guò)度量學(xué)習(xí)采集更多的無(wú)標(biāo)注數(shù)據(jù),就可以:
繼續(xù)進(jìn)行任務(wù)級(jí)別的預(yù)訓(xùn)練,這是一種廉價(jià)、快速提升指標(biāo)的手段。
與分類任務(wù)一起構(gòu)造語(yǔ)言模型loss,進(jìn)行多任務(wù)學(xué)習(xí)。
半監(jiān)督學(xué)習(xí):半監(jiān)督學(xué)習(xí)在CV中已經(jīng)發(fā)揚(yáng)光大,常常有兩種形式:
偽標(biāo):可分為自訓(xùn)練和協(xié)同訓(xùn)練,Q6中介紹的數(shù)據(jù)蒸餾就屬于自訓(xùn)練的一種。在Google的最新論文《Rethinking Pre-training and Self-training》中,表明自監(jiān)督的局限性,而自訓(xùn)練表現(xiàn)良好,在每種條件設(shè)置下均能很好地發(fā)揮作用??梢?jiàn),如果在NLP中能夠構(gòu)建類似于ImageNet那樣大規(guī)模的有標(biāo)簽數(shù)據(jù)集,自訓(xùn)練“未來(lái)可期”。而聯(lián)合自監(jiān)督預(yù)訓(xùn)練和自訓(xùn)練可能會(huì)獲得更大的增益。
一致性訓(xùn)練:對(duì)于未標(biāo)記數(shù)據(jù),希望模型在其輸入受到輕微擾動(dòng)時(shí)仍然產(chǎn)生相同的輸出分布,這種方式能夠提高一致性訓(xùn)練性能,充分挖掘未標(biāo)注數(shù)據(jù)中潛在的價(jià)值,最終增強(qiáng)泛化性能。
來(lái)自Google的《UDA:Unsupervised Data Augmentation for Consistency Training》結(jié)合了自監(jiān)督預(yù)訓(xùn)練和半監(jiān)督學(xué)習(xí)中的一致性訓(xùn)練,在六個(gè)文本分類任務(wù)進(jìn)行了實(shí)驗(yàn),表明:
在少樣本場(chǎng)景下,借助UDA,最終能夠逼近全量數(shù)據(jù)集時(shí)所達(dá)到的指標(biāo):在IMDb的2分類任務(wù)上,具有20個(gè)標(biāo)注數(shù)據(jù)的UDA優(yōu)于在1250倍標(biāo)注數(shù)據(jù)上訓(xùn)練的SOTA模型。但相較于2分類任務(wù),5分類任務(wù)難度更高,未來(lái)仍有提升空間。
全量數(shù)據(jù)下,融合UDA框架,性能也有一定提升。
下面是筆者的一些簡(jiǎn)要實(shí)驗(yàn)結(jié)果:
Q6: 攻克分類任務(wù)的難點(diǎn):如何更好處理不平衡問(wèn)題(hard example問(wèn)題)?
不平衡問(wèn)題(長(zhǎng)尾問(wèn)題)是文本分類任務(wù)一個(gè)難啃的骨頭。也許有人會(huì)問(wèn):為何不在初始構(gòu)造數(shù)據(jù)集時(shí),就讓每個(gè)分類標(biāo)簽下的樣本數(shù)量相同,這不就解決不平衡問(wèn)題了嗎?
事實(shí)上,不平衡問(wèn)題不僅僅是分類標(biāo)簽下樣本數(shù)量的不平衡,其本質(zhì)上更是難易樣本的不平衡:即使樣本數(shù)量是平衡的,有的hard example還是很難學(xué)習(xí)。類似,對(duì)那些數(shù)量較少的類別進(jìn)行學(xué)習(xí),在不做數(shù)據(jù)補(bǔ)充的情況下,也可看作是一個(gè)hard example問(wèn)題。
解決不平衡問(wèn)題的通常思路有兩種:重采樣(re-sampling)和重加權(quán)(re-weighting):
(1)重采樣(re-sampling)
重采用的通用公式為:
為數(shù)據(jù)集的類別數(shù)量,為類別的樣本總數(shù), 為從 類別中采樣一個(gè)樣本的概率., 表示所有類別都采樣相同數(shù)量的樣本。
常用的重采樣方法有:
欠采樣&過(guò)采樣&SMOTE
欠采樣:拋棄大量case,可能導(dǎo)致偏差加大;
過(guò)采樣:可能會(huì)導(dǎo)致過(guò)擬合;
SMOTE:一種近鄰插值,降低過(guò)擬合風(fēng)險(xiǎn),但不能直接應(yīng)用于NLP任務(wù)的離散空間插值。
數(shù)據(jù)增強(qiáng):文本增強(qiáng)技術(shù)更適合于替代上述過(guò)采樣和SMOTE。
解耦特征和標(biāo)簽分布:文獻(xiàn)[3] 認(rèn)為對(duì)不平衡問(wèn)題的再平衡本質(zhì)應(yīng)只是分類器的再平衡過(guò)程,類別標(biāo)簽分布不應(yīng)影響特征空間的分布?;诖耍梢越怦铑悇e標(biāo)簽分布和特征空間分布:
首先不做任何再平衡,直接對(duì)原始數(shù)據(jù)訓(xùn)練一個(gè)base_model。
將base_model的特征提取器freeze,通過(guò)類別平衡采樣(對(duì)尾部類別重采樣)只調(diào)整分類器。
分類器權(quán)重模與類別數(shù)量呈正相關(guān),因此還需將做歸一化處理。
Curriculum Learning(課程學(xué)習(xí)):課程學(xué)習(xí)[4]是一種模擬人類學(xué)習(xí)過(guò)程的訓(xùn)練策略,從易到難進(jìn)行學(xué)習(xí):
Sampling Scheduler:調(diào)整訓(xùn)練集的數(shù)據(jù)分布,逐步將采樣數(shù)據(jù)集的樣本分布從原先的不平衡調(diào)整到后期的平衡狀態(tài)
Loss Scheduler:開(kāi)始傾向于拉大不同類目之間特征的距離,后期再傾向于對(duì)特征做分類。
(2)重加權(quán)(re-weighting)
重加權(quán)就是改變分類loss。相較于重采樣,重加權(quán)l(xiāng)oss更加靈活和方便。其常用方法有:
loss類別加權(quán):通常根據(jù)類別數(shù)量進(jìn)行加權(quán),加權(quán)系數(shù)與類別數(shù)量成反比。
Focal Loss:上述loss類別加權(quán)主要關(guān)注正負(fù)樣本數(shù)量的不平衡,并沒(méi)有關(guān)注難易不平衡。Focal Loss主要關(guān)注難易樣本的不平衡問(wèn)題,可根據(jù)對(duì)高置信度()樣本進(jìn)行降權(quán):
GHM Loss:GHM(gradient harmonizing mechanism) 是一種梯度調(diào)和機(jī)制。Focal Loss雖然強(qiáng)調(diào)對(duì)hard example的學(xué)習(xí),但不是所有的hard example都值得關(guān)注,有的hard example很可能是離群點(diǎn),過(guò)分關(guān)注不是錯(cuò)上加錯(cuò)了嗎?GHM定義了梯度模長(zhǎng)g:
如下圖所示(圖片來(lái)自知乎[5]),梯度模長(zhǎng)g接近于0的樣本數(shù)量最多,隨著梯度模長(zhǎng)的增長(zhǎng),樣本數(shù)量迅速減少,但是在梯度模長(zhǎng)接近于1時(shí),樣本數(shù)量也挺多。
因此,GHM的出發(fā)點(diǎn)是:既不要關(guān)注那些容易學(xué)的樣本,也不要關(guān)注那些離群點(diǎn)特別難分的樣本。為此,作者定義了梯度密度,其物理含義是:?jiǎn)挝惶荻饶iL(zhǎng)g部分的樣本個(gè)數(shù)。最終GHM Loss為:
Dice Loss:
與Focal Loss類似,訓(xùn)練時(shí)推動(dòng)模型更加關(guān)注困難的樣本,使用作為每個(gè)樣本的權(quán)重。改進(jìn)之后的DSC為:
主要為了解決訓(xùn)練和測(cè)試時(shí)F1指標(biāo)不一致的問(wèn)題,提出一個(gè)基于Dice Loss的自適應(yīng)損失——DSC,對(duì)F1指標(biāo)更加健壯:
對(duì)logit調(diào)整權(quán)重:實(shí)際上是將類別概率引入loss中,并對(duì)logit調(diào)整權(quán)重,本質(zhì)上是一種通過(guò)互信息思想來(lái)緩解類別不平衡問(wèn)題:
Q7: BERT時(shí)代,如何處理長(zhǎng)文本分類?
由于顯存占用和算力的限制,BERT等預(yù)訓(xùn)練語(yǔ)言模型的input一般來(lái)說(shuō)最長(zhǎng)512個(gè)token。某些場(chǎng)景下處理長(zhǎng)文本分類,BERT可能還不如CNN效果好。為能讓BERT等更適合處理長(zhǎng)文本,筆者從「文本處理」和「改進(jìn)attention機(jī)制」兩個(gè)方面給出一些可以嘗試的方法:
(1)文本處理
固定截?cái)啵阂话銇?lái)說(shuō),文本的開(kāi)頭和結(jié)尾信息量較大,可以按照一定比例對(duì)截取出文本的開(kāi)頭和結(jié)尾;
隨機(jī)截?cái)啵喝绻潭ń財(cái)嘈畔p失較大,可以在DataLoader中每次以不同的隨機(jī)概率進(jìn)行截?cái)?,這種截?cái)嗫梢宰屇P涂吹礁嘈螒B(tài)的case;
截?cái)?滑窗+預(yù)測(cè)平均:通過(guò)隨機(jī)截?cái)嗷蛘吖潭ɑ皩⒁粋€(gè)樣本切割成多個(gè)樣本,在預(yù)測(cè)時(shí)對(duì)多個(gè)樣本的結(jié)果進(jìn)行平均;
截?cái)?關(guān)鍵詞提?。翰扇≈苯咏?cái)嗟姆绞娇赡軙?huì)導(dǎo)致信息量損失,可以通過(guò)關(guān)鍵詞提取補(bǔ)充信息。如:[CLS][截?cái)辔谋綸[SEP][關(guān)鍵詞1][SEP][關(guān)鍵詞2]...
(2)改進(jìn)attention機(jī)制
Transformer采取的attention機(jī)制,其時(shí)間復(fù)雜度為,其中為文本長(zhǎng)度。最近一些paper聚焦于對(duì)attention機(jī)制的改進(jìn)、降低計(jì)算復(fù)雜度,以更適合處理長(zhǎng)文本序列。主要包括:
Reformer[6]:主要采取局部敏感哈希機(jī)制(Locality Sensitve Hashing,LSH),這種機(jī)制類似于桶排序:將相近的向量先歸為一類,只計(jì)算同類向量之間的點(diǎn)積,將時(shí)間復(fù)雜度降為O(nlog(n));考慮到相似的向量會(huì)被分到不同的桶里,Reformer進(jìn)行了多輪LSH,但這反而會(huì)降低效率。
Linformer[7]:提出自注意力是低秩的,信息集中在少量(個(gè))的最大奇異值中。Linformer利用線性映射將時(shí)間復(fù)雜度降為,當(dāng)時(shí),接近于線性時(shí)間。但實(shí)踐中表明,k增加效果會(huì)更好,k一般取256或512。
Longformer[8]:采取滑窗機(jī)制,只在固定窗口大小w內(nèi)計(jì)算局部attention,復(fù)雜度降為,當(dāng)時(shí),接近于線性時(shí)間(實(shí)踐中仍然取512);為擴(kuò)大感受野,也可以采取“膨脹滑窗機(jī)制”; 也可以在特殊位置,例如[CLS]處,局部地計(jì)算全局attention。詳見(jiàn)《Longformer:超越RoBERTa,為長(zhǎng)文檔而生的預(yù)訓(xùn)練模型》。
Big Bird[9]:在Longformer基礎(chǔ)上增加了Random attention,當(dāng)前長(zhǎng)序列建模的SOTA,刷新了QA和摘要的SOTA,同時(shí)也被證明是圖靈完備的。如下圖:
對(duì)于絕大數(shù)長(zhǎng)文本分類問(wèn)題,筆者建議首選「文本處理」方式。對(duì)于有條件的,可以采取上述「改進(jìn)attention機(jī)制」方法進(jìn)行嘗試,比如,對(duì)已經(jīng)預(yù)訓(xùn)練好的RoBERTa采取Longformer機(jī)制繼續(xù)預(yù)訓(xùn)練。Longformer已經(jīng)開(kāi)源,并且可以直接在cuda內(nèi)核上進(jìn)行優(yōu)化加速。
Q8: 預(yù)訓(xùn)練融合:NLP競(jìng)賽利器!
各大NLP競(jìng)賽中,模型融合(集成)是一個(gè)重要的提分神器,而除了不同模型的融合,另一種更加有效的方式就是——預(yù)訓(xùn)練融合。
在NLP任務(wù)中,不同模型的預(yù)測(cè)差異更多取決于底層模型(embedding層)的差異,這不同于CV領(lǐng)域往往取決于上層模型的異構(gòu)程度。
那么怎么豐富底層模型呢?一個(gè)直接的方式就是把不同預(yù)訓(xùn)練模型融合:如可以將word2vec、elmo、BERT、XLNET、ALBERT統(tǒng)一作為特征提取器,但這時(shí)需要注意(以下內(nèi)容部分參考自"王然老師課程"[10],筆者進(jìn)行了歸納整合):
一般不需要直接進(jìn)行finetune。當(dāng)然也可先單獨(dú)對(duì)BERT、XLNET、ALBERT進(jìn)行finetune,然后再一起進(jìn)行特征集成。
分詞器可以采取最佳預(yù)訓(xùn)練模型的tokenizer,也可同時(shí)使用不同預(yù)訓(xùn)練模型的tokenizer。
不要忽視簡(jiǎn)單詞向量的作用。類似字詞向量、bi-gram向量的補(bǔ)充對(duì)于底層模型的豐富性很關(guān)鍵。
配置上層模型時(shí),應(yīng)注意學(xué)習(xí)率的調(diào)整。將集成的底層特征喂入biLSTM或CNN中,也可以拼接biLSTM和CNN共同作為上層模型。訓(xùn)練時(shí),可以先將底層預(yù)訓(xùn)練模型freeze,只調(diào)整上層模型的學(xué)習(xí)率(較大),最后再全局調(diào)整學(xué)習(xí)率(較?。?。
CLS最后一定還要再用一次。無(wú)論上層模型怎樣。CLS特征要再最后直接進(jìn)入全連接層。
Q9: 你認(rèn)真構(gòu)造離線測(cè)試集了嗎?指標(biāo)高,也許是虛高!
很多時(shí)候時(shí)候我們構(gòu)造測(cè)試集,往往都是根據(jù)初始標(biāo)注集自動(dòng)劃分測(cè)試集,這在任務(wù)初期完全OK。但我們不能就此相信指標(biāo)高,一切就OK。模型的評(píng)估環(huán)節(jié)至關(guān)重要,不能總是上線了才醒悟,不能總是等著線上badcase來(lái)迭代。
ACL2020最佳論文《Beyond Accuracy: Behavioral Testing of NLP Models with CHECKLIST》告訴我們:應(yīng)通過(guò)CheckList全方位對(duì)模型多項(xiàng)“能力”進(jìn)行評(píng)估,其可快速生成大規(guī)模的測(cè)試樣例。
筆者發(fā)現(xiàn)在具體實(shí)踐中,為了讓評(píng)估更加全面,其實(shí)可以:
積累同義詞庫(kù)、生僻字,進(jìn)行性質(zhì)不變測(cè)試、詞匯測(cè)試;
構(gòu)造對(duì)抗樣本,進(jìn)行攻擊測(cè)試;
防患于未然,提前撈一批數(shù)據(jù),找到那些不確定性高的case進(jìn)行測(cè)試;
從上述測(cè)試中,發(fā)現(xiàn)bug自然是一件好事,問(wèn)題的暴露讓我們心里才有底。
最近開(kāi)源的OpenAttack文本對(duì)抗攻擊工具包也可幫助我們進(jìn)行魯棒性測(cè)試,主要包括:文本預(yù)處理、受害模型訪問(wèn)、對(duì)抗樣本生成、對(duì)抗攻擊評(píng)測(cè)以及對(duì)抗訓(xùn)練等。對(duì)抗攻擊能夠幫助暴露受害模型的弱點(diǎn),有助于提高模型的魯棒性和可解釋性,具有重要的研究意義和應(yīng)用價(jià)值。
Q10: 模型更新迭代時(shí),如何進(jìn)行增量學(xué)習(xí),不遺忘先前記憶?
模型化的手段在進(jìn)行更新迭代時(shí),也許會(huì)出現(xiàn)遺忘問(wèn)題,即對(duì)之前已經(jīng)處理好的case不work。如果badcase不多,先采取規(guī)則優(yōu)化是相對(duì)健壯的,可以用規(guī)則設(shè)置旁路,專門處置應(yīng)急badcase。
此外,筆者給出以下幾種解決此問(wèn)題的方案:
直接現(xiàn)有數(shù)據(jù)與原有數(shù)據(jù)混合訓(xùn)練;
將特征抽取層freeze,對(duì)新類別只更新softMax全連接層;
采取知識(shí)蒸餾方式。在現(xiàn)有數(shù)據(jù)與原有數(shù)據(jù)混合一起訓(xùn)練時(shí),對(duì)原有類別進(jìn)行蒸餾,指導(dǎo)新模型學(xué)習(xí)。
將分類標(biāo)簽統(tǒng)一進(jìn)行l(wèi)abel embedding,新增類別單獨(dú)構(gòu)建的label embedding不影響原有類別。從而將分類轉(zhuǎn)為一個(gè)match和rank問(wèn)題。
Q11: 低耗時(shí)場(chǎng)景,如何讓TextCNN逼近BERT的效果?
BERT雖然強(qiáng)大,但在低耗時(shí)場(chǎng)景、少機(jī)器場(chǎng)景下,直接拿BERT部署分類模型通常行不通。我們是否可以采取一個(gè)輕量級(jí)的模型,比如TextCNN,去逼近BERT的效果呢?
為解決這一問(wèn)題,我們通常采用知識(shí)蒸餾技術(shù)。蒸餾的本質(zhì)是函數(shù)逼近,但如果直接將BERT(Teacher模型)蒸餾到一個(gè)十分輕量的TextCNN(Student模型),指標(biāo)一般會(huì)下降。
如何盡量緩解這一情況呢?筆者根據(jù)「無(wú)標(biāo)注數(shù)據(jù)規(guī)模大小」分別給出了2種蒸餾方案——模型蒸餾和數(shù)據(jù)蒸餾。
(1)模型蒸餾
如果業(yè)務(wù)中的無(wú)標(biāo)注數(shù)據(jù)較少,我們通常采取logits近似(值近似)讓TextCNN進(jìn)行學(xué)習(xí),這種方式可稱之為模型蒸餾。這是一種離線蒸餾方式:即先對(duì)Teacher模型finetune,然后freeze,再讓Student模型學(xué)習(xí)。為避免蒸餾后指標(biāo)下降明顯,我們可以采取以下方式改進(jìn):
數(shù)據(jù)增強(qiáng):在蒸餾的同時(shí)引入文本增強(qiáng)技術(shù),具體的增強(qiáng)技術(shù)可參考《NLP中的少樣本困境問(wèn)題探究》。TinyBERT就采取了增強(qiáng)技術(shù),以輔助蒸餾。
集成蒸餾:對(duì)不同Teacher模型(如不同的預(yù)訓(xùn)練模型)的logits集成,讓TextCNN學(xué)習(xí)?!讣烧麴s+數(shù)據(jù)增強(qiáng)」可以有效避免指標(biāo)明顯下降。
聯(lián)合蒸餾:不同于離線蒸餾,這是一種聯(lián)合訓(xùn)練方式。Teacher模型訓(xùn)練的同時(shí),就將logits傳給Student模型學(xué)習(xí)。聯(lián)合蒸餾可以減輕異構(gòu)化嚴(yán)重的Teacher和Student模型間的gap,Student模型可以慢慢從中間狀態(tài)進(jìn)行學(xué)習(xí),更好地模仿Teacher行為。
(2)數(shù)據(jù)蒸餾
如果業(yè)務(wù)中的無(wú)標(biāo)注數(shù)據(jù)規(guī)模較大,我們可以采取標(biāo)簽近似讓TextCNN進(jìn)行學(xué)習(xí)。這種方式稱為數(shù)據(jù)蒸餾。其本質(zhì)與偽標(biāo)方法類似:讓Teacher模型對(duì)無(wú)標(biāo)注數(shù)據(jù)進(jìn)行偽標(biāo),再讓Student模型進(jìn)行學(xué)習(xí)。其具體步驟為:
訓(xùn)練1:BERT在標(biāo)注數(shù)據(jù)集A上finetune,訓(xùn)練一個(gè)bert_model;
偽標(biāo):bert_model對(duì)大量無(wú)標(biāo)注數(shù)據(jù)U進(jìn)行預(yù)測(cè)(偽標(biāo)),然后根據(jù)置信度打分,選擇高置信度的數(shù)據(jù)B填充到標(biāo)注數(shù)據(jù)A,這時(shí)候標(biāo)注數(shù)據(jù)變?yōu)椋ˋ+B);
訓(xùn)練2:基于標(biāo)注數(shù)據(jù)A+B訓(xùn)練TextCNN,得到textcnn_model_1;
訓(xùn)練3(optional):讓第3步訓(xùn)練好的textcnn_model_1基于標(biāo)注數(shù)據(jù)A再訓(xùn)練一次,形成最終模型textcnn_model_2;
對(duì)上述兩種蒸餾方式,筆者對(duì)業(yè)務(wù)中的一個(gè)21個(gè)分類任務(wù)(每類100條樣本)進(jìn)行了實(shí)驗(yàn),相關(guān)結(jié)果如下:
從上圖可以看出,如果我們能夠獲取更多的無(wú)標(biāo)注數(shù)據(jù),采取數(shù)據(jù)蒸餾的方式則更為有效,可以讓一個(gè)輕量級(jí)的TextCNN最大程度逼近BERT。
不過(guò)也許有的讀者會(huì)問(wèn),為什么不直接蒸餾為一個(gè)淺層BERT呢?這當(dāng)然可以,不過(guò)筆者這里推薦TextCNN的原因是:它實(shí)在太輕了,而且會(huì)更加方便引入一些業(yè)務(wù)相關(guān)的特征(會(huì)再之后的文章中再詳細(xì)介紹)。
如果仍然想蒸餾為一個(gè)淺層BERT,我們需要首先思考自己所在的領(lǐng)域是否與BERT原始預(yù)訓(xùn)練領(lǐng)域的gap是否較大?如果gap較大,我們不要停止預(yù)訓(xùn)練,繼續(xù)進(jìn)行領(lǐng)域預(yù)訓(xùn)練、然后再蒸餾;或者重新預(yù)訓(xùn)練一個(gè)淺層BERT。此外,采取BERT上線時(shí),也可以進(jìn)行算子融合(Faster Transformer)或者混合精度等方式。
寫在最后
讓我們一起致敬:那些年陪我們一起入門(坑)NLP的分類模型吧~
-
機(jī)器學(xué)習(xí)
+關(guān)注
關(guān)注
66文章
8418瀏覽量
132656 -
數(shù)據(jù)集
+關(guān)注
關(guān)注
4文章
1208瀏覽量
24704 -
nlp
+關(guān)注
關(guān)注
1文章
488瀏覽量
22038
原文標(biāo)題:打破BERT天花板:11種花式煉丹術(shù)刷爆NLP分類SOTA!
文章出處:【微信號(hào):zenRRan,微信公眾號(hào):深度學(xué)習(xí)自然語(yǔ)言處理】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論