在2020這個時間節(jié)點,對于NLP分類任務(wù),我們的關(guān)注重點早已不再是如何構(gòu)造模型、拘泥于分類模型長什么樣子了。如同CV領(lǐng)域當(dāng)前的重點一樣,我們更應(yīng)該關(guān)注如何利用機器學(xué)習(xí)思想,更好地去解決NLP分類任務(wù)中的低耗時、小樣本、魯棒性、不平衡、測試檢驗、增量學(xué)習(xí)、長文本等問題。
本文以QA形式探討了以下問題:

NLP分類任務(wù)我們每個NLPer都異常熟悉了,其在整個NLP業(yè)務(wù)中占據(jù)著舉足輕重的地位,更多領(lǐng)域的子任務(wù)也常常轉(zhuǎn)化為一個分類任務(wù),例如新聞分類、情感識別、意圖識別、關(guān)系分類、事件類型判斷等等。構(gòu)建一個完整的NLP分類任務(wù)主要包含4部分:標(biāo)簽定義、數(shù)據(jù)構(gòu)建、算法策略、測試部署。本文的組織架構(gòu),如下圖所示。

聲明:文中觀點謹(jǐn)代表筆者個人立場,盲目搬運有風(fēng)險~
Q1: 如何科學(xué)地構(gòu)建分類標(biāo)簽體系?
分類標(biāo)簽的定義至關(guān)重要,面對復(fù)雜的標(biāo)簽問題,最為關(guān)鍵的一點就是要緊密貼合業(yè)務(wù)、和專家共同設(shè)定,而不是靠“蠻力”去解決。這里給出筆者曾涉及到的一些標(biāo)簽定義方法:
長尾標(biāo)簽:某些分類標(biāo)簽下的樣本天然就很少,可以把這一類標(biāo)簽設(shè)置「其他」,然后在下一層級單獨對這些長尾標(biāo)簽進(jìn)一步處理。
易混淆標(biāo)簽:一些標(biāo)簽下的樣本表現(xiàn)形式不易區(qū)分,首先需要思考這類標(biāo)簽是否可以直接合并;如果不可以,可以先將這類標(biāo)簽進(jìn)行統(tǒng)一,然后在下一層級進(jìn)行規(guī)則處理。
多標(biāo)簽:一些場景下的標(biāo)簽設(shè)置可能達(dá)到幾百個,可以設(shè)置多層級的標(biāo)簽體系進(jìn)行處理。例如,先構(gòu)建標(biāo)簽大類、再構(gòu)建標(biāo)簽小類;也可以設(shè)置多個二分類,適用于標(biāo)簽分類相對獨立,并且經(jīng)常需要新增修改的場景,能做到相互獨立、便于維護(hù)。
未知標(biāo)簽:業(yè)務(wù)冷啟動時,如果尚不清楚設(shè)置哪些標(biāo)簽合適,可以嘗試通過文本聚類方式初步劃分標(biāo)簽,再輔以專家介入共同設(shè)定,這也是一個循環(huán)迭代的過程。
對于上述的「長尾標(biāo)簽」和「易混淆標(biāo)簽」,當(dāng)然也可在模型層面進(jìn)行優(yōu)化,這往往涉及樣本不平衡和hard example的處理問題,我們在下文詳細(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ù)集:為每個標(biāo)簽生產(chǎn)約100個樣本,具體的措施可以采取關(guān)鍵詞匹配等規(guī)則手段,再結(jié)合人工check進(jìn)行。
「主動學(xué)習(xí)+遷移學(xué)習(xí)」降低標(biāo)注規(guī)模:1)主動學(xué)習(xí)旨在挖掘高價值樣本:即通過構(gòu)建較少的樣本就可以滿足指標(biāo)要求。根據(jù)初始構(gòu)建的數(shù)據(jù)集,可以train一個base model,然后挑選一些不確定性程度高(熵最大)+代表性高(非離群點)的樣本進(jìn)行人工標(biāo)注。2)遷移學(xué)習(xí)降低對數(shù)據(jù)的依賴:遷移學(xué)習(xí)中預(yù)訓(xùn)練語言模型的成功,可以使其在較少的標(biāo)注樣本上finetune就可達(dá)到目標(biāo)指標(biāo)。
擴充標(biāo)注規(guī)模,數(shù)據(jù)增強最為關(guān)鍵:在標(biāo)注規(guī)模較小的少樣本場景下,可以通過文本增強方式擴充數(shù)據(jù)集,撬動數(shù)據(jù)杠桿。在《NLP中的少樣本困境問題探究》一文中我們對有關(guān)的文本增強技術(shù)進(jìn)行了詳細(xì)探究。
清洗數(shù)據(jù)噪音,讓模型更加魯棒:對于標(biāo)注質(zhì)量問題要嚴(yán)格把關(guān),標(biāo)志質(zhì)量除了人工核查,也可以下面的方法自動化構(gòu)建降噪系統(tǒng):1)人工規(guī)則清洗:可以配置關(guān)鍵詞信息在內(nèi)的黑白名單進(jìn)行強規(guī)則清洗。2)交叉驗證:可以通過對訓(xùn)練集進(jìn)行交叉驗證,對那些標(biāo)簽不一致的樣本進(jìn)行去除或者人工糾正。3)置信學(xué)習(xí):本質(zhì)上是對交叉驗證的進(jìn)一步推廣,構(gòu)建置信度混淆矩陣并引入rank機制過濾噪聲樣本。《別讓數(shù)據(jù)坑了你!用置信學(xué)習(xí)找出錯誤標(biāo)注》一文中有詳細(xì)介紹。4)深度KNN過濾:KNN中的最近鄰度量,使其在魯棒學(xué)習(xí)中更加有效?!禗eep k-NN for Noisy Labels》一文表明:即使深度模型在含噪數(shù)據(jù)上進(jìn)行訓(xùn)練,而將模型中間層表示適配于KNN進(jìn)行噪聲樣本過濾,效果提升也很明顯。
在構(gòu)建數(shù)據(jù)集時,除了上述4步外,也要注重一些細(xì)節(jié)和原則問題:
針對少樣本問題,不能盲目追求前沿算法的變現(xiàn)落地。很多時候,我們總想寄托于某種方法能夠通用地解決低資源問題,但現(xiàn)實往往是策略調(diào)研的時間過長,指標(biāo)增益還沒有直接人工補標(biāo)數(shù)據(jù)來得快。筆者發(fā)現(xiàn),絕大數(shù)少樣本問題,必要的人工標(biāo)注不可少,多策略組合+“有計劃、有策略”的人工標(biāo)注也許是解決少樣本問題的最佳方式。
智能標(biāo)注是否是一個偽命題?智能標(biāo)注的本質(zhì)是高效,但主動學(xué)習(xí)往往并不高效。主動學(xué)習(xí)需要對專家系統(tǒng)多次查詢來進(jìn)行標(biāo)注。所以采用主動學(xué)習(xí)方法時,不僅要降低標(biāo)注規(guī)模,也要注意降低查詢次數(shù)。實踐中,我們可以根據(jù)經(jīng)驗公式,優(yōu)先對指標(biāo)增益明顯的類別標(biāo)簽進(jìn)行主動查詢。也可以根據(jù)經(jīng)驗公式預(yù)估一下滿足增益目標(biāo)的數(shù)據(jù)補充量,一次查詢盡量滿足要求,多標(biāo)一點也沒關(guān)系。所謂的“智能標(biāo)注系統(tǒng)”是否真正的智能,筆者總覺得多多少少還是不能脫離人工介入。
預(yù)訓(xùn)練模型要具備領(lǐng)域性,不要停止預(yù)訓(xùn)練!當(dāng)我們所執(zhí)行任務(wù)的標(biāo)注數(shù)據(jù)較少,所屬的領(lǐng)域與初始預(yù)訓(xùn)練語料越不相關(guān),那就不要停止領(lǐng)域預(yù)訓(xùn)練!
筆者這里給出了上述一些策略的簡要實驗結(jié)果,如下圖所示:

Q3: 模型化就是唯一嗎?分類任務(wù)中,算法策略構(gòu)建的基本原則是什么?
算法策略主要包括規(guī)則挖掘和模型化方法,基本原則應(yīng)是:
規(guī)則兜底:高頻case和hard case優(yōu)先進(jìn)入規(guī)則模塊,防止因模型的更新迭代,而使針對重要case的處理不夠健壯。規(guī)則挖掘主要包括重要case緩存、模式挖掘、關(guān)鍵詞+規(guī)則設(shè)置等。此外,規(guī)則也可以跟在分類模型后面進(jìn)行兜底處理。
模型泛化:模型化方法適合處理無法命中規(guī)則的case,具備泛化性。還有另一種處理邏輯是:如果case命中了規(guī)則,但模型對于規(guī)則預(yù)測的結(jié)果給出了很低的置信度(也就是模型認(rèn)為另一種類別的置信度更高),這時我們可以選擇相信模型,以模型輸出為準(zhǔn)。
不過,無論是對于規(guī)則,還是模型,長尾問題的處理都是比較棘手的,但我們可以通過一些手段盡可能加強處理長尾case的能力(Q6中具體介紹)。
Q4: 特征挖掘立竿見影,如何在特征工程方面搞點事情?
對于NLP分類任務(wù),特別是垂直領(lǐng)域的分類任務(wù),如果能夠在業(yè)務(wù)特征層面更好地進(jìn)行挖掘,那么指標(biāo)增益可是立竿見影啊~
在特征工程方面,筆者這里主要給出了3種技巧:
離散數(shù)據(jù)挖掘
構(gòu)建關(guān)鍵詞的高維稀疏特征:類似結(jié)構(gòu)化數(shù)據(jù)挖掘(如CTR中的wide&deep),比如根據(jù)關(guān)鍵詞列表對文本內(nèi)容進(jìn)行挖掘,構(gòu)建高維稀疏特征并喂入xDeepFM[1]中進(jìn)行處理,最后與文本向量一同拼接。
其他業(yè)務(wù)特征:如疾病大類劃分、就診科室等業(yè)務(wù)特征。
文本特征挖掘
關(guān)鍵詞&實體詞與文本拼接:將從文本序列提取的關(guān)鍵詞或?qū)嶓w詞拼接在文本序列后,再進(jìn)行分類。如在BERT中:[CLS][原始文本][SEP][關(guān)鍵詞1][SEP][實體詞1]...
關(guān)鍵詞embedding化:將關(guān)鍵詞劃分為不同的類別屬性,進(jìn)行embedding化,不同于離散數(shù)據(jù)挖掘,這里的embedding不應(yīng)稀疏。
領(lǐng)域化向量挖掘:除了在領(lǐng)域語料上繼續(xù)預(yù)訓(xùn)練詞向量外,還可以有監(jiān)督地構(gòu)建詞向量:例如對于21分類問題,先根據(jù)弱監(jiān)督方法訓(xùn)練21個基于SVM的二分類器,然后提取每個詞匯在21個SVM中的權(quán)重,即可為每個詞匯可以構(gòu)建21維的詞向量。
標(biāo)簽特征融入
標(biāo)簽embedding 化:設(shè)置label embedding,然后通過注意力機制與詞向量進(jìn)行交互,提取全局向量分類。
標(biāo)簽信息補充:可以將類別標(biāo)簽與原始文本一同拼接,然后進(jìn)行2分類,如在BERT中:[CLS][原始文本][SEP][類別標(biāo)簽]。此外,也可以通過強化學(xué)習(xí)動態(tài)地補充標(biāo)簽信息,具體可參考文獻(xiàn)[2]。
Q5: 數(shù)據(jù)為王,不要將數(shù)據(jù)閑置,如何將無標(biāo)注數(shù)據(jù)更好地派上用場?
大量的無標(biāo)注數(shù)據(jù)蘊藏著巨大的能量!機器學(xué)習(xí)中,能夠充分利用、并挖掘無標(biāo)注數(shù)據(jù)價值的,自然是——自監(jiān)督學(xué)習(xí)和半監(jiān)督學(xué)習(xí)了。
自監(jiān)督學(xué)習(xí):乘風(fēng)破浪的NLP預(yù)訓(xùn)練語言模型充分利用了無標(biāo)注數(shù)據(jù),展現(xiàn)出強大能力。而如果我們設(shè)計分類任務(wù)時,能夠釋放更多的無標(biāo)注數(shù)據(jù),亦或者通過度量學(xué)習(xí)采集更多的無標(biāo)注數(shù)據(jù),就可以:
繼續(xù)進(jìn)行任務(wù)級別的預(yù)訓(xùn)練,這是一種廉價、快速提升指標(biāo)的手段。
與分類任務(wù)一起構(gòu)造語言模型loss,進(jìn)行多任務(wù)學(xué)習(xí)。
半監(jiān)督學(xué)習(xí):半監(jiān)督學(xué)習(xí)在CV中已經(jīng)發(fā)揚光大,常常有兩種形式:
偽標(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ā)揮作用??梢?,如果在NLP中能夠構(gòu)建類似于ImageNet那樣大規(guī)模的有標(biāo)簽數(shù)據(jù)集,自訓(xùn)練“未來可期”。而聯(lián)合自監(jiān)督預(yù)訓(xùn)練和自訓(xùn)練可能會獲得更大的增益。
一致性訓(xùn)練:對于未標(biāo)記數(shù)據(jù),希望模型在其輸入受到輕微擾動時仍然產(chǎn)生相同的輸出分布,這種方式能夠提高一致性訓(xùn)練性能,充分挖掘未標(biāo)注數(shù)據(jù)中潛在的價值,最終增強泛化性能。
來自Google的《UDA:Unsupervised Data Augmentation for Consistency Training》結(jié)合了自監(jiān)督預(yù)訓(xùn)練和半監(jiān)督學(xué)習(xí)中的一致性訓(xùn)練,在六個文本分類任務(wù)進(jìn)行了實驗,表明:
在少樣本場景下,借助UDA,最終能夠逼近全量數(shù)據(jù)集時所達(dá)到的指標(biāo):在IMDb的2分類任務(wù)上,具有20個標(biāo)注數(shù)據(jù)的UDA優(yōu)于在1250倍標(biāo)注數(shù)據(jù)上訓(xùn)練的SOTA模型。但相較于2分類任務(wù),5分類任務(wù)難度更高,未來仍有提升空間。
全量數(shù)據(jù)下,融合UDA框架,性能也有一定提升。
下面是筆者的一些簡要實驗結(jié)果:

Q6: 攻克分類任務(wù)的難點:如何更好處理不平衡問題(hard example問題)?
不平衡問題(長尾問題)是文本分類任務(wù)一個難啃的骨頭。也許有人會問:為何不在初始構(gòu)造數(shù)據(jù)集時,就讓每個分類標(biāo)簽下的樣本數(shù)量相同,這不就解決不平衡問題了嗎?
事實上,不平衡問題不僅僅是分類標(biāo)簽下樣本數(shù)量的不平衡,其本質(zhì)上更是難易樣本的不平衡:即使樣本數(shù)量是平衡的,有的hard example還是很難學(xué)習(xí)。類似,對那些數(shù)量較少的類別進(jìn)行學(xué)習(xí),在不做數(shù)據(jù)補充的情況下,也可看作是一個hard example問題。
解決不平衡問題的通常思路有兩種:重采樣(re-sampling)和重加權(quán)(re-weighting):
(1)重采樣(re-sampling)
重采用的通用公式為:
為數(shù)據(jù)集的類別數(shù)量,為類別的樣本總數(shù), 為從 類別中采樣一個樣本的概率., 表示所有類別都采樣相同數(shù)量的樣本。
常用的重采樣方法有:
欠采樣&過采樣&SMOTE
欠采樣:拋棄大量case,可能導(dǎo)致偏差加大;
過采樣:可能會導(dǎo)致過擬合;
SMOTE:一種近鄰插值,降低過擬合風(fēng)險,但不能直接應(yīng)用于NLP任務(wù)的離散空間插值。
數(shù)據(jù)增強:文本增強技術(shù)更適合于替代上述過采樣和SMOTE。
解耦特征和標(biāo)簽分布:文獻(xiàn)[3] 認(rèn)為對不平衡問題的再平衡本質(zhì)應(yīng)只是分類器的再平衡過程,類別標(biāo)簽分布不應(yīng)影響特征空間的分布。基于此,可以解耦類別標(biāo)簽分布和特征空間分布:
首先不做任何再平衡,直接對原始數(shù)據(jù)訓(xùn)練一個base_model。
將base_model的特征提取器freeze,通過類別平衡采樣(對尾部類別重采樣)只調(diào)整分類器。
分類器權(quán)重模與類別數(shù)量呈正相關(guān),因此還需將做歸一化處理。
Curriculum Learning(課程學(xué)習(xí)):課程學(xué)習(xí)[4]是一種模擬人類學(xué)習(xí)過程的訓(xùn)練策略,從易到難進(jìn)行學(xué)習(xí):
Sampling Scheduler:調(diào)整訓(xùn)練集的數(shù)據(jù)分布,逐步將采樣數(shù)據(jù)集的樣本分布從原先的不平衡調(diào)整到后期的平衡狀態(tài)
Loss Scheduler:開始傾向于拉大不同類目之間特征的距離,后期再傾向于對特征做分類。
(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ù)量的不平衡,并沒有關(guān)注難易不平衡。Focal Loss主要關(guān)注難易樣本的不平衡問題,可根據(jù)對高置信度()樣本進(jìn)行降權(quán):
GHM Loss:GHM(gradient harmonizing mechanism) 是一種梯度調(diào)和機制。Focal Loss雖然強調(diào)對hard example的學(xué)習(xí),但不是所有的hard example都值得關(guān)注,有的hard example很可能是離群點,過分關(guān)注不是錯上加錯了嗎?GHM定義了梯度模長g:
如下圖所示(圖片來自知乎[5]),梯度模長g接近于0的樣本數(shù)量最多,隨著梯度模長的增長,樣本數(shù)量迅速減少,但是在梯度模長接近于1時,樣本數(shù)量也挺多。

因此,GHM的出發(fā)點是:既不要關(guān)注那些容易學(xué)的樣本,也不要關(guān)注那些離群點特別難分的樣本。為此,作者定義了梯度密度,其物理含義是:單位梯度模長g部分的樣本個數(shù)。最終GHM Loss為:
Dice Loss:
與Focal Loss類似,訓(xùn)練時推動模型更加關(guān)注困難的樣本,使用作為每個樣本的權(quán)重。改進(jìn)之后的DSC為:
主要為了解決訓(xùn)練和測試時F1指標(biāo)不一致的問題,提出一個基于Dice Loss的自適應(yīng)損失——DSC,對F1指標(biāo)更加健壯:
對logit調(diào)整權(quán)重:實際上是將類別概率引入loss中,并對logit調(diào)整權(quán)重,本質(zhì)上是一種通過互信息思想來緩解類別不平衡問題:
Q7: BERT時代,如何處理長文本分類?
由于顯存占用和算力的限制,BERT等預(yù)訓(xùn)練語言模型的input一般來說最長512個token。某些場景下處理長文本分類,BERT可能還不如CNN效果好。為能讓BERT等更適合處理長文本,筆者從「文本處理」和「改進(jìn)attention機制」兩個方面給出一些可以嘗試的方法:
(1)文本處理
固定截斷:一般來說,文本的開頭和結(jié)尾信息量較大,可以按照一定比例對截取出文本的開頭和結(jié)尾;
隨機截斷:如果固定截斷信息損失較大,可以在DataLoader中每次以不同的隨機概率進(jìn)行截斷,這種截斷可以讓模型看到更多形態(tài)的case;
截斷&滑窗+預(yù)測平均:通過隨機截斷或者固定滑窗將一個樣本切割成多個樣本,在預(yù)測時對多個樣本的結(jié)果進(jìn)行平均;
截斷+關(guān)鍵詞提取:采取直接截斷的方式可能會導(dǎo)致信息量損失,可以通過關(guān)鍵詞提取補充信息。如:[CLS][截斷文本][SEP][關(guān)鍵詞1][SEP][關(guān)鍵詞2]...
(2)改進(jìn)attention機制
Transformer采取的attention機制,其時間復(fù)雜度為,其中為文本長度。最近一些paper聚焦于對attention機制的改進(jìn)、降低計算復(fù)雜度,以更適合處理長文本序列。主要包括:
Reformer[6]:主要采取局部敏感哈希機制(Locality Sensitve Hashing,LSH),這種機制類似于桶排序:將相近的向量先歸為一類,只計算同類向量之間的點積,將時間復(fù)雜度降為O(nlog(n));考慮到相似的向量會被分到不同的桶里,Reformer進(jìn)行了多輪LSH,但這反而會降低效率。
Linformer[7]:提出自注意力是低秩的,信息集中在少量(個)的最大奇異值中。Linformer利用線性映射將時間復(fù)雜度降為,當(dāng)時,接近于線性時間。但實踐中表明,k增加效果會更好,k一般取256或512。
Longformer[8]:采取滑窗機制,只在固定窗口大小w內(nèi)計算局部attention,復(fù)雜度降為,當(dāng)時,接近于線性時間(實踐中仍然取512);為擴大感受野,也可以采取“膨脹滑窗機制”; 也可以在特殊位置,例如[CLS]處,局部地計算全局attention。詳見《Longformer:超越RoBERTa,為長文檔而生的預(yù)訓(xùn)練模型》。
Big Bird[9]:在Longformer基礎(chǔ)上增加了Random attention,當(dāng)前長序列建模的SOTA,刷新了QA和摘要的SOTA,同時也被證明是圖靈完備的。如下圖:

對于絕大數(shù)長文本分類問題,筆者建議首選「文本處理」方式。對于有條件的,可以采取上述「改進(jìn)attention機制」方法進(jìn)行嘗試,比如,對已經(jīng)預(yù)訓(xùn)練好的RoBERTa采取Longformer機制繼續(xù)預(yù)訓(xùn)練。Longformer已經(jīng)開源,并且可以直接在cuda內(nèi)核上進(jìn)行優(yōu)化加速。
Q8: 預(yù)訓(xùn)練融合:NLP競賽利器!
各大NLP競賽中,模型融合(集成)是一個重要的提分神器,而除了不同模型的融合,另一種更加有效的方式就是——預(yù)訓(xùn)練融合。
在NLP任務(wù)中,不同模型的預(yù)測差異更多取決于底層模型(embedding層)的差異,這不同于CV領(lǐng)域往往取決于上層模型的異構(gòu)程度。
那么怎么豐富底層模型呢?一個直接的方式就是把不同預(yù)訓(xùn)練模型融合:如可以將word2vec、elmo、BERT、XLNET、ALBERT統(tǒng)一作為特征提取器,但這時需要注意(以下內(nèi)容部分參考自"王然老師課程"[10],筆者進(jìn)行了歸納整合):
一般不需要直接進(jìn)行finetune。當(dāng)然也可先單獨對BERT、XLNET、ALBERT進(jìn)行finetune,然后再一起進(jìn)行特征集成。
分詞器可以采取最佳預(yù)訓(xùn)練模型的tokenizer,也可同時使用不同預(yù)訓(xùn)練模型的tokenizer。
不要忽視簡單詞向量的作用。類似字詞向量、bi-gram向量的補充對于底層模型的豐富性很關(guān)鍵。
配置上層模型時,應(yīng)注意學(xué)習(xí)率的調(diào)整。將集成的底層特征喂入biLSTM或CNN中,也可以拼接biLSTM和CNN共同作為上層模型。訓(xùn)練時,可以先將底層預(yù)訓(xùn)練模型freeze,只調(diào)整上層模型的學(xué)習(xí)率(較大),最后再全局調(diào)整學(xué)習(xí)率(較?。?/p>
CLS最后一定還要再用一次。無論上層模型怎樣。CLS特征要再最后直接進(jìn)入全連接層。
Q9: 你認(rèn)真構(gòu)造離線測試集了嗎?指標(biāo)高,也許是虛高!
很多時候時候我們構(gòu)造測試集,往往都是根據(jù)初始標(biāo)注集自動劃分測試集,這在任務(wù)初期完全OK。但我們不能就此相信指標(biāo)高,一切就OK。模型的評估環(huán)節(jié)至關(guān)重要,不能總是上線了才醒悟,不能總是等著線上badcase來迭代。
ACL2020最佳論文《Beyond Accuracy: Behavioral Testing of NLP Models with CHECKLIST》告訴我們:應(yīng)通過CheckList全方位對模型多項“能力”進(jìn)行評估,其可快速生成大規(guī)模的測試樣例。
筆者發(fā)現(xiàn)在具體實踐中,為了讓評估更加全面,其實可以:
積累同義詞庫、生僻字,進(jìn)行性質(zhì)不變測試、詞匯測試;
構(gòu)造對抗樣本,進(jìn)行攻擊測試;
防患于未然,提前撈一批數(shù)據(jù),找到那些不確定性高的case進(jìn)行測試;
從上述測試中,發(fā)現(xiàn)bug自然是一件好事,問題的暴露讓我們心里才有底。
最近開源的OpenAttack文本對抗攻擊工具包也可幫助我們進(jìn)行魯棒性測試,主要包括:文本預(yù)處理、受害模型訪問、對抗樣本生成、對抗攻擊評測以及對抗訓(xùn)練等。對抗攻擊能夠幫助暴露受害模型的弱點,有助于提高模型的魯棒性和可解釋性,具有重要的研究意義和應(yīng)用價值。
Q10: 模型更新迭代時,如何進(jìn)行增量學(xué)習(xí),不遺忘先前記憶?
模型化的手段在進(jìn)行更新迭代時,也許會出現(xiàn)遺忘問題,即對之前已經(jīng)處理好的case不work。如果badcase不多,先采取規(guī)則優(yōu)化是相對健壯的,可以用規(guī)則設(shè)置旁路,專門處置應(yīng)急badcase。
此外,筆者給出以下幾種解決此問題的方案:
直接現(xiàn)有數(shù)據(jù)與原有數(shù)據(jù)混合訓(xùn)練;
將特征抽取層freeze,對新類別只更新softMax全連接層;
采取知識蒸餾方式。在現(xiàn)有數(shù)據(jù)與原有數(shù)據(jù)混合一起訓(xùn)練時,對原有類別進(jìn)行蒸餾,指導(dǎo)新模型學(xué)習(xí)。
將分類標(biāo)簽統(tǒng)一進(jìn)行l(wèi)abel embedding,新增類別單獨構(gòu)建的label embedding不影響原有類別。從而將分類轉(zhuǎn)為一個match和rank問題。
Q11: 低耗時場景,如何讓TextCNN逼近BERT的效果?
BERT雖然強大,但在低耗時場景、少機器場景下,直接拿BERT部署分類模型通常行不通。我們是否可以采取一個輕量級的模型,比如TextCNN,去逼近BERT的效果呢?
為解決這一問題,我們通常采用知識蒸餾技術(shù)。蒸餾的本質(zhì)是函數(shù)逼近,但如果直接將BERT(Teacher模型)蒸餾到一個十分輕量的TextCNN(Student模型),指標(biāo)一般會下降。
如何盡量緩解這一情況呢?筆者根據(jù)「無標(biāo)注數(shù)據(jù)規(guī)模大小」分別給出了2種蒸餾方案——模型蒸餾和數(shù)據(jù)蒸餾。
(1)模型蒸餾
如果業(yè)務(wù)中的無標(biāo)注數(shù)據(jù)較少,我們通常采取logits近似(值近似)讓TextCNN進(jìn)行學(xué)習(xí),這種方式可稱之為模型蒸餾。這是一種離線蒸餾方式:即先對Teacher模型finetune,然后freeze,再讓Student模型學(xué)習(xí)。為避免蒸餾后指標(biāo)下降明顯,我們可以采取以下方式改進(jìn):
數(shù)據(jù)增強:在蒸餾的同時引入文本增強技術(shù),具體的增強技術(shù)可參考《NLP中的少樣本困境問題探究》。TinyBERT就采取了增強技術(shù),以輔助蒸餾。
集成蒸餾:對不同Teacher模型(如不同的預(yù)訓(xùn)練模型)的logits集成,讓TextCNN學(xué)習(xí)?!讣烧麴s+數(shù)據(jù)增強」可以有效避免指標(biāo)明顯下降。
聯(lián)合蒸餾:不同于離線蒸餾,這是一種聯(lián)合訓(xùn)練方式。Teacher模型訓(xùn)練的同時,就將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ù)中的無標(biāo)注數(shù)據(jù)規(guī)模較大,我們可以采取標(biāo)簽近似讓TextCNN進(jìn)行學(xué)習(xí)。這種方式稱為數(shù)據(jù)蒸餾。其本質(zhì)與偽標(biāo)方法類似:讓Teacher模型對無標(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)練一個bert_model;
偽標(biāo):bert_model對大量無標(biāo)注數(shù)據(jù)U進(jìn)行預(yù)測(偽標(biāo)),然后根據(jù)置信度打分,選擇高置信度的數(shù)據(jù)B填充到標(biāo)注數(shù)據(jù)A,這時候標(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;
對上述兩種蒸餾方式,筆者對業(yè)務(wù)中的一個21個分類任務(wù)(每類100條樣本)進(jìn)行了實驗,相關(guān)結(jié)果如下:

從上圖可以看出,如果我們能夠獲取更多的無標(biāo)注數(shù)據(jù),采取數(shù)據(jù)蒸餾的方式則更為有效,可以讓一個輕量級的TextCNN最大程度逼近BERT。
不過也許有的讀者會問,為什么不直接蒸餾為一個淺層BERT呢?這當(dāng)然可以,不過筆者這里推薦TextCNN的原因是:它實在太輕了,而且會更加方便引入一些業(yè)務(wù)相關(guān)的特征(會再之后的文章中再詳細(xì)介紹)。
如果仍然想蒸餾為一個淺層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)練一個淺層BERT。此外,采取BERT上線時,也可以進(jìn)行算子融合(Faster Transformer)或者混合精度等方式。
寫在最后
讓我們一起致敬:那些年陪我們一起入門(坑)NLP的分類模型吧~

-
機器學(xué)習(xí)
+關(guān)注
關(guān)注
66文章
8540瀏覽量
136207 -
數(shù)據(jù)集
+關(guān)注
關(guān)注
4文章
1229瀏覽量
26031 -
nlp
+關(guān)注
關(guān)注
1文章
491瀏覽量
23182
原文標(biāo)題:打破BERT天花板:11種花式煉丹術(shù)刷爆NLP分類SOTA!
文章出處:【微信號:zenRRan,微信公眾號:深度學(xué)習(xí)自然語言處理】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
如何深度學(xué)習(xí)機器視覺的應(yīng)用場景
FPGA在機器學(xué)習(xí)中的具體應(yīng)用
利用NVIDIA Isaac Lab訓(xùn)練工業(yè)機器人齒輪裝配任務(wù)
完整版—單片機編程思想(推薦下載!)
機器學(xué)習(xí)模型市場前景如何
xgboost在圖像分類中的應(yīng)用
【「具身智能機器人系統(tǒng)」閱讀體驗】2.具身智能機器人的基礎(chǔ)模塊
傳統(tǒng)機器學(xué)習(xí)方法和應(yīng)用指導(dǎo)
【「具身智能機器人系統(tǒng)」閱讀體驗】2.具身智能機器人大模型
如何選擇云原生機器學(xué)習(xí)平臺
《具身智能機器人系統(tǒng)》第7-9章閱讀心得之具身智能機器人與大模型
【「具身智能機器人系統(tǒng)」閱讀體驗】+初品的體驗
如何利用地物光譜進(jìn)行土地利用分類?

如何利用機器學(xué)習(xí)思想,更好地去解決NLP分類任務(wù)
評論