一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

文本分類中處理樣本不均衡和提升模型魯棒性的trick

深度學(xué)習(xí)自然語言處理 ? 來源:深度學(xué)習(xí)自然語言處理 ? 作者:深度學(xué)習(xí)自然語言 ? 2022-10-11 09:47 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

寫在前面

文本分類是NLP中一個非常重要的任務(wù),也是非常適合入坑NLP的第一個完整項目。

文本分類看似簡單,但實則里面有好多門道。作者水平有限,只能將平時用到的方法和trick在此做個記錄和分享,并且盡可能提供給出簡潔、清晰的代碼實現(xiàn)。希望各位看官都能有所收獲。

本文主要討論文本分類中處理樣本不均衡和提升模型魯棒性的trick

1. 緩解樣本不均衡

樣本不均衡現(xiàn)象

假如我們要實現(xiàn)一個新聞?wù)?fù)面判斷的文本二分類器,負(fù)面新聞的樣本比例較少,可能2W條新聞有100條甚至更少的樣本屬于負(fù)例。這種現(xiàn)象就是樣本不均衡。

在樣本不均衡場景下,樣本會呈現(xiàn)一個長尾分布(如圖中所示會出現(xiàn)長長的尾巴),頭部的標(biāo)簽包含了大量的樣本,而尾部的標(biāo)簽擁有很少的樣本,這種現(xiàn)象也叫長尾現(xiàn)象。岔開說下,聽過二八定律的人大多知道長尾現(xiàn)象其實很普遍,比如80%的財富掌握在20%的人手中。

4aa3820a-48b7-11ed-a3b6-dac502259ad0.png

樣本不均衡問題

樣本不均衡會帶來很多問題。模型訓(xùn)練的本質(zhì)是最小化損失函數(shù),當(dāng)某個類別的樣本數(shù)量非常龐大,損失函數(shù)的值大部分被其所影響,導(dǎo)致的結(jié)果就是模型分類會傾向于該類別(樣本量較大的類別)。

咱拿上面文本分類的例子來說明。現(xiàn)在有2W條用戶搜索的樣本,其中100條是負(fù)面新聞,即負(fù)樣本,那么當(dāng)模型全部將樣本預(yù)測為正例,也能得到 99.5% 的準(zhǔn)確率。但實際上這個模型跟盲猜沒什么區(qū)別,而我們的目的是讓模型能夠正確的區(qū)分正例和負(fù)例。

1.1 模型層面解決樣本不均衡

在模型層面解決樣本不均衡問題,可以選擇加入 Focal Loss 學(xué)習(xí)難學(xué)樣本,具體原理可以參考文章《何愷明大神的「Focal Loss」,如何更好地理解?》[1]。

1.1.1 Focal Loss pytorch代碼實現(xiàn)

classFocalLoss(nn.Module):
"""Multi-classFocallossimplementation"""
def__init__(self,gamma=2,weight=None,reduction='mean',ignore_index=-100):
super(FocalLoss,self).__init__()
self.gamma=gamma
self.weight=weight
self.ignore_index=ignore_index
self.reduction=reduction

defforward(self,input,target):
"""
input:[N,C]
target:[N,]
"""
log_pt=torch.log_softmax(input,dim=1)
pt=torch.exp(log_pt)
log_pt=(1-pt)**self.gamma*log_pt
loss=torch.nn.functional.nll_loss(log_pt,target,self.weight,reduction=self.reduction,ignore_index=self.ignore_index)
returnloss

代碼鏈接:blog_code/nlp/focal_loss.py[2]

1.2 數(shù)據(jù)層面解決樣本不均衡

假如我們的正樣本只有100條,而負(fù)樣本可能有1W條。如果不采取任何策略,那么我們就是使用這1.01W條樣本去訓(xùn)練模型。從數(shù)據(jù)層面解決樣本不均衡的問題核心是通過人為控制正負(fù)樣本的比例,分成欠采樣和過采樣兩種。

1.2.1 欠采樣

簡單隨機

欠采樣的基本做法是這樣的,現(xiàn)在我們的正負(fù)樣本比例為1:100。如果我們想讓正負(fù)樣本比例不超過1:10,那么模型訓(xùn)練的時候數(shù)量比較少的正樣本也就是100條全部使用,而負(fù)樣本隨機挑選1000條。

通過這樣人為的方式,我們把樣本的正負(fù)比例強行控制在了1:10。需要注意的是,這種方式存在一個問題:為了強行控制樣本比例我們生生的舍去了那9000條負(fù)樣本,這對于模型來說是莫大的損失。

迭代預(yù)分類

相比于簡單的對負(fù)樣本隨機采樣的欠采樣方法,實際工作中更推薦使用迭代預(yù)分類的方式來采樣負(fù)樣本。具體流程如下圖所示:

4ad27718-48b7-11ed-a3b6-dac502259ad0.png

首先我們會使用全部的正樣本和從負(fù)例候選集中隨機采樣一部分負(fù)樣本(這里假如是100條)去訓(xùn)練第一輪分類器;

然后用第一輪分類器去預(yù)測負(fù)例候選集剩余的9900條數(shù)據(jù),把9900條負(fù)例中預(yù)測為正例的樣本(也就是預(yù)測錯誤的樣本)再隨機采樣100條和第一輪訓(xùn)練的數(shù)據(jù)放到一起去訓(xùn)練第二輪分類器;

同樣的方法用第二輪分類器去預(yù)測負(fù)例候選集剩余的9800條數(shù)據(jù),直到訓(xùn)練的第N輪分類器可以全部識別負(fù)例候選集,這就是使用迭代預(yù)分類的方式進行欠采樣。

相比于隨機欠采樣來說,迭代預(yù)分類的欠采樣方式能最大限度地利用負(fù)樣本中差異性較大的負(fù)樣本,從而在控制正負(fù)樣本比例的基礎(chǔ)上采樣出了最有代表意義的負(fù)樣本。

欠采樣的方式整體來說或多或少的會損失一些樣本,對于那些需要控制樣本量級的場景下比較合適。如果沒有嚴(yán)格控制樣本量級的要求那么下面的過采樣可能會更加適合你。

1.2.2 過采樣

過采樣和欠采樣比較類似,都是人工干預(yù)控制樣本的比例,不同的是過采樣不會損失樣本

還拿上面的例子,現(xiàn)在有正樣本100條,負(fù)樣本1W條,最簡單的過采樣方式是我們使用全部的負(fù)樣本1W條。但是,為了維持正負(fù)樣本比例,我們會從正樣本中有放回的重復(fù)采樣,直到獲取了1000條正樣本,也就是說有些正樣本可能會被重復(fù)采樣到,這樣就能保持1:10的正負(fù)樣本比例了。這是最簡單的過采樣方式,這種方式可能會存在嚴(yán)重的過擬合

實際的場景中會通過樣本增強的技術(shù)來增加正樣本。

2. 提升模型魯棒性

提升模型魯棒性的方法有很多,其中對抗訓(xùn)練、知識蒸餾、防止模型過擬合多模型融合是常見的穩(wěn)定提升方式。

2.1 對抗訓(xùn)練

對抗訓(xùn)練是一種能有效提高模型魯棒性和泛化能力的訓(xùn)練手段,其基本原理是通過在原始輸入上增加對抗擾動,得到對抗樣本,再利用對抗樣本進行訓(xùn)練,從而提高模型的表現(xiàn)。

由于自然語言文本是離散的,一般會把對抗擾動添加到嵌入層上。為了最大化對抗樣本的擾動能力,利用梯度上升的方式生成對抗樣本。為了避免擾動過大,將梯度做了歸一化處理。

4adbb90e-48b7-11ed-a3b6-dac502259ad0.png

其中, 為嵌入向量。在實際訓(xùn)練過程中,我們會在訓(xùn)練完一個batch的原始輸入數(shù)據(jù)時,保存當(dāng)前batch對輸入詞向量的梯度,得到對抗樣本后,再使用對抗樣本進行對抗訓(xùn)練。

2.1.1 對抗訓(xùn)練pytorch代碼實現(xiàn)

class FGM():
    def __init__(self, model):
        self.model = model
        self.backup = {}

    def attack(self, epsilon=1., emb_name='emb'):
        for name, param in self.model.named_parameters():
            if param.requires_grad and emb_name in name:
                self.backup[name] = param.data.clone()
                norm = torch.norm(param.grad) 
                if norm != 0:
                    r_at = epsilon * param.grad / norm
                    param.data.add_(r_at)

    def restore(self, emb_name='emb'):
        for name, param in self.model.named_parameters():
            if param.requires_grad and emb_name in name: 
                assert name in self.backup
                param.data = self.backup[name]
        self.backup = {}

訓(xùn)練中加入幾行代碼

# 初始化
fgm = FGM(model)
for batch_input, batch_label in data:
  # 正常訓(xùn)練
  loss = model(batch_input, batch_label)
  loss.backward() 
  # 對抗訓(xùn)練
  fgm.attack() # 修改embedding
  # optimizer.zero_grad() # 梯度累加,不累加去掉注釋
  loss_sum = model(batch_input, batch_label)
  loss_sum.backward() # 累加對抗訓(xùn)練的梯度
  fgm.restore() # 恢復(fù)Embedding的參數(shù)

  optimizer.step()
  optimizer.zero_grad()

代碼鏈接:blog_code/nlp/at.py [3]

2.2 知識蒸餾

與對抗訓(xùn)練類似,知識蒸餾也是一種常用的提高模型泛化能力的訓(xùn)練方法

知識蒸餾這個概念最早由Hinton在2015年提出。一開始,知識蒸餾通往往應(yīng)用在模型壓縮方面,利用訓(xùn)練好的復(fù)雜模型(teacher model)輸出作為監(jiān)督信號去訓(xùn)練另一個簡單模型(student model),從而將teacher學(xué)習(xí)到的知識遷移到student。

Tommaso在18年提出,若student和teacher的模型完全相同,蒸餾后則會對模型的表現(xiàn)有一定程度上的提升。

2.3 防止模型過擬合

2.3.1 正則化

L1和L2正則化

L1正則化可以得到稀疏解,L2正則化可以得到平滑解,原因參考文章《為什么L1稀疏,L2平滑?》[4]。

2.3.2 Dropout

Dropout是指在深度學(xué)習(xí)網(wǎng)絡(luò)的訓(xùn)練過程中,對于神經(jīng)網(wǎng)絡(luò)單元,按照一定的概率將其暫時從網(wǎng)絡(luò)中丟棄。

Dropout為什么能防止過擬合,可以通過以下幾個方面來解釋:

它強迫一個神經(jīng)單元,和隨機挑選出來的其他神經(jīng)單元共同工作,達(dá)到好的效果。消除減弱了神經(jīng)元節(jié)點間的聯(lián)合適應(yīng)性,增強了泛化能力;

類似于bagging的集成效果;

對于每一個dropout后的網(wǎng)絡(luò),進行訓(xùn)練時,相當(dāng)于做了Data Augmentation,因為,總可以找到一個樣本,使得在原始的網(wǎng)絡(luò)上也能達(dá)到dropout單元后的效果。比如,對于某一層,dropout一些單元后,形成的結(jié)果是(1.5,0,2.5,0,1,2,0),其中0是被drop的單元,那么總能找到一個樣本,使得結(jié)果也是如此。這樣,每一次dropout其實都相當(dāng)于增加了樣本。

Dropout在測試時,并不會隨機丟棄神經(jīng)元,而是使用全部所有的神經(jīng)元,同時,所有的權(quán)重值都乘上1-p,p代表的是隨機失活率。

2.3.3 數(shù)據(jù)增強

數(shù)據(jù)增強即需要得到更多的符合要求的數(shù)據(jù),即和已有的數(shù)據(jù)是獨立同分布的,或者近似獨立同分布的。一般有以下方法:

1)從數(shù)據(jù)源頭采集更多數(shù)據(jù);

2)復(fù)制原有數(shù)據(jù)并加上隨機噪聲;

3)重采樣;

4)根據(jù)當(dāng)前數(shù)據(jù)集估計數(shù)據(jù)分布參數(shù),使用該分布產(chǎn)生更多數(shù)據(jù)等。

2.3.4 Early stopping

在模型對訓(xùn)練數(shù)據(jù)集迭代收斂之前停止迭代來防止過擬合。因為在初始化網(wǎng)絡(luò)的時候一般都是初始為較小的權(quán)值,訓(xùn)練時間越長,部分網(wǎng)絡(luò)權(quán)值可能越大。如果我們在合適時間停止訓(xùn)練,就可以將網(wǎng)絡(luò)的能力限制在一定范圍內(nèi)。

2.3.5 交叉驗證

交叉驗證的基本思想就是將原始數(shù)據(jù)進行分組,一部分做為訓(xùn)練集來訓(xùn)練模型,另一部分做為測試集來評價模型。我們常用的交叉驗證方法有簡單交叉驗證、S折交叉驗證和留一交叉驗證。

2.3.6 Batch Normalization

一種非常有用的正則化方法,可以讓大型的卷積網(wǎng)絡(luò)訓(xùn)練速度加快很多倍,同時收斂后分類的準(zhǔn)確率也可以大幅度的提高。

BN在訓(xùn)練某層時,會對每一個mini-batch數(shù)據(jù)進行標(biāo)準(zhǔn)化(normalization)處理,使輸出規(guī)范到 的正態(tài)分布,減少了Internal convariate shift(內(nèi)部神經(jīng)元分布的改變),傳統(tǒng)的深度神經(jīng)網(wǎng)絡(luò)在訓(xùn)練是每一層的輸入的分布都在改變,因此訓(xùn)練困難,只能選擇用一個很小的學(xué)習(xí)速率,但是每一層用了BN后,可以有效的解決這個問題,學(xué)習(xí)速率可以增大很多倍。

2.3.7 選擇合適的網(wǎng)絡(luò)結(jié)構(gòu)

通過減少網(wǎng)絡(luò)層數(shù)、神經(jīng)元個數(shù)、全連接層數(shù)等降低網(wǎng)絡(luò)容量。

3.多模型融合

Baggging &Boosting,將弱分類器融合之后形成一個強分類器,而且融合之后的效果會比最好的弱分類器更好,三個臭皮匠頂一個諸葛亮。

審核編輯:彭靜
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 模型
    +關(guān)注

    關(guān)注

    1

    文章

    3521

    瀏覽量

    50429
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4900

    瀏覽量

    70751
  • nlp
    nlp
    +關(guān)注

    關(guān)注

    1

    文章

    490

    瀏覽量

    22625

原文標(biāo)題:2. 提升模型魯棒性

文章出處:【微信號:zenRRan,微信公眾號:深度學(xué)習(xí)自然語言處理】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    pyhanlp文本分類與情感分析

    關(guān)系如下:訓(xùn)練訓(xùn)練指的是,利用給定訓(xùn)練集尋找一個能描述這種語言現(xiàn)象的模型的過程。開發(fā)者只需調(diào)用train接口即可,但在實現(xiàn),有許多細(xì)節(jié)。分詞目前,本系統(tǒng)的分詞器接口一共有兩種實現(xiàn): 但文本
    發(fā)表于 02-20 15:37

    NLPIR平臺在文本分類方面的技術(shù)解析

    文本分類問題就是將一篇文檔歸入預(yù)先定義的幾個類別的一個或幾個,而文本的自動分類則是使用計算機程序來實現(xiàn)這種文本分類,即根據(jù)事先指定的規(guī)則和
    發(fā)表于 11-18 17:46

    不均衡數(shù)據(jù)集上基于子域?qū)W習(xí)的復(fù)合分類模型

    為進一步弱化數(shù)據(jù)不均衡分類算法的束縛,從數(shù)據(jù)集區(qū)域分布特性著手,提出了不均衡數(shù)據(jù)集上基于子域?qū)W習(xí)的復(fù)合分類模型。子域劃分階段,擴展支持向量
    發(fā)表于 12-12 15:28 ?0次下載

    結(jié)合BERT模型的中文文本分類算法

    層面的特征向量表示,并將獲得的特征冋量輸λ Softmax回歸模型進行訓(xùn)練與分類。實驗結(jié)果表明,隨著搜狐新聞文本數(shù)據(jù)量的增加,該算法在測試集上的整體F1值最高達(dá)到93%,相比基于 Textcnn
    發(fā)表于 03-11 16:10 ?6次下載
    結(jié)合BERT<b class='flag-5'>模型</b>的中文<b class='flag-5'>文本分類</b>算法

    融合文本分類和摘要的多任務(wù)學(xué)習(xí)摘要模型

    文本摘要應(yīng)包含源文本中所有重要信息,傳統(tǒng)基于編碼器-解碼器架構(gòu)的摘要模型生成的摘要準(zhǔn)確較低。根據(jù)文本分類
    發(fā)表于 04-27 16:18 ?11次下載
    融合<b class='flag-5'>文本分類</b>和摘要的多任務(wù)學(xué)習(xí)摘要<b class='flag-5'>模型</b>

    基于不同神經(jīng)網(wǎng)絡(luò)的文本分類方法研究對比

    神經(jīng)網(wǎng)絡(luò)、時間遞歸神經(jīng)網(wǎng)絡(luò)、結(jié)構(gòu)遞歸神經(jīng)網(wǎng)絡(luò)和預(yù)訓(xùn)練模型等主流方法在文本分類應(yīng)用的發(fā)展歷程比較不同模型基于常用數(shù)據(jù)集的分類效果,表明利用人
    發(fā)表于 05-13 16:34 ?49次下載

    膠囊網(wǎng)絡(luò)在小樣本文本分類的應(yīng)用(下)

    論文提出Dynamic Memory Induction Networks (DMIN) 網(wǎng)絡(luò)處理樣本文本分類。 兩階段的(two-stage)few-shot模型: 在監(jiān)督學(xué)習(xí)階段(綠色的部分
    的頭像 發(fā)表于 09-27 17:46 ?2446次閱讀
    膠囊網(wǎng)絡(luò)在小<b class='flag-5'>樣本</b>做<b class='flag-5'>文本分類</b><b class='flag-5'>中</b>的應(yīng)用(下)

    基于主題分布優(yōu)化的模糊文本分類方法

    到 word2vec詞向量空間內(nèi),對模糊文本進行分類操作,進而得到文本分類結(jié)果。實驗結(jié)果表明,與C_LCD+KNN方法相比,該方法分類效果較好,
    發(fā)表于 05-25 16:33 ?5次下載

    如何解決樣本不均的問題?

    樣本不均的問題大家已經(jīng)很常見了,我們總是能看到某一個類目的數(shù)量遠(yuǎn)高于其他類目,舉個例子,曝光轉(zhuǎn)化數(shù)遠(yuǎn)低于曝光未轉(zhuǎn)化數(shù)。樣本不均嚴(yán)重影響了模型的效果,甚至影響到我們對模型好壞的判斷,因為
    的頭像 發(fā)表于 05-26 09:19 ?2613次閱讀
    如何解決<b class='flag-5'>樣本不均</b>的問題?

    基于LSTM的表示學(xué)習(xí)-文本分類模型

    的關(guān)鍵。為了獲得妤的文本表示,提高文本分類性能,構(gòu)建了基于LSTM的表示學(xué)習(xí)-文本分類模型,其中表示學(xué)習(xí)模型利用語言
    發(fā)表于 06-15 16:17 ?18次下載

    一種新的不均衡關(guān)聯(lián)分類算法ACI

    基于規(guī)則的分類算法具有分類性能妤、可解釋強的優(yōu)點,得到了廣泛的應(yīng)用。然而已有的基于規(guī)則的分類算法沒有考慮不均衡數(shù)據(jù)的情況,從而影響了其對
    發(fā)表于 06-17 15:27 ?16次下載

    基于注意力機制的新聞文本分類模型

    基于注意力機制的新聞文本分類模型
    發(fā)表于 06-27 15:32 ?30次下載

    PyTorch文本分類任務(wù)的基本流程

    文本分類是NLP領(lǐng)域的較為容易的入門問題,本文記錄文本分類任務(wù)的基本流程,大部分操作使用了**torch**和**torchtext**兩個庫。 ## 1. 文本數(shù)據(jù)預(yù)處理
    的頭像 發(fā)表于 02-22 14:23 ?1426次閱讀

    的含義以及如何提高模型

    的含義以及如何提高模型? 什么是
    的頭像 發(fā)表于 10-29 11:21 ?4666次閱讀

    深度學(xué)習(xí)模型優(yōu)化

    深度學(xué)習(xí)模型優(yōu)化是一個復(fù)雜但至關(guān)重要的任務(wù),它涉及多個方面的技術(shù)和策略。以下是一些關(guān)鍵的優(yōu)化方法: 一、數(shù)據(jù)預(yù)處理與增強 數(shù)據(jù)清洗
    的頭像 發(fā)表于 11-11 10:25 ?1203次閱讀