99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

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

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

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

深度學(xué)習(xí)刷SOTA的一堆trick

深度學(xué)習(xí)自然語(yǔ)言處理 ? 來(lái)源:包包算法筆記 ? 作者:包包算法筆記 ? 2022-09-07 15:13 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

一般通用的trick都被寫(xiě)進(jìn)論文和代碼庫(kù)里了

像優(yōu)秀的優(yōu)化器,學(xué)習(xí)率調(diào)度方法,數(shù)據(jù)增強(qiáng),dropout,初始化,BN,LN,確實(shí)是調(diào)參大師的寶貴經(jīng)驗(yàn),大家平常用的也很多。

這里主要有幾個(gè),我們分成三部分,穩(wěn)定有用型trick,場(chǎng)景受限型trick,性能加速型trick。

穩(wěn)定有用型trick

0.模型融合

懂得都懂,打比賽必備,做文章沒(méi)卵用的人人皆知trick,早年模型小的時(shí)候還用stacking,直接概率融合效果也不錯(cuò)。

  1. 對(duì)抗訓(xùn)練

對(duì)抗訓(xùn)練就是在輸入的層次增加擾動(dòng),根據(jù)擾動(dòng)產(chǎn)生的樣本,來(lái)做一次反向傳播。以FGM為例,在NLP上,擾動(dòng)作用于embedding層。給個(gè)即插即用代碼片段吧,引用了知乎id:Nicolas的代碼,寫(xiě)的不錯(cuò),帶著看原理很容易就明白了。

#初始化
fgm=FGM(model)
forbatch_input,batch_labelindata:
#正常訓(xùn)練
loss=model(batch_input,batch_label)
loss.backward()#反向傳播,得到正常的grad
#對(duì)抗訓(xùn)練
fgm.attack()#在embedding上添加對(duì)抗擾動(dòng)
loss_adv=model(batch_input,batch_label)
loss_adv.backward()#反向傳播,并在正常的grad基礎(chǔ)上,累加對(duì)抗訓(xùn)練的梯度
fgm.restore()#恢復(fù)embedding參數(shù)
#梯度下降,更新參數(shù)
optimizer.step()
model.zero_grad()

具體FGM的實(shí)現(xiàn)

importtorch
classFGM():
def__init__(self,model):
self.model=model
self.backup={}

defattack(self,epsilon=1.,emb_name='emb.'):
#emb_name這個(gè)參數(shù)要換成你模型中embedding的參數(shù)名
forname,paraminself.model.named_parameters():
ifparam.requires_gradandemb_nameinname:
self.backup[name]=param.data.clone()
norm=torch.norm(param.grad)
ifnorm!=0andnottorch.isnan(norm):
r_at=epsilon*param.grad/norm
param.data.add_(r_at)

defrestore(self,emb_name='emb.'):
#emb_name這個(gè)參數(shù)要換成你模型中embedding的參數(shù)名
forname,paraminself.model.named_parameters():
ifparam.requires_gradandemb_nameinname:
assertnameinself.backup
param.data=self.backup[name]
self.backup={}

2.EMA/SWA

移動(dòng)平均,保存歷史的一份參數(shù),在一定訓(xùn)練階段后,拿歷史的參數(shù)給目前學(xué)習(xí)的參數(shù)做一次平滑。這個(gè)東西,我之前在earhian的祖?zhèn)鞔a里看到的。他喜歡這東西+衰減學(xué)習(xí)率。確實(shí)每次都有用。

#初始化
ema=EMA(model,0.999)
ema.register()

#訓(xùn)練過(guò)程中,更新完參數(shù)后,同步updateshadowweights
deftrain():
optimizer.step()
ema.update()

# eval前,apply shadow weights;eval之后,恢復(fù)原來(lái)模型的參數(shù)
defevaluate():
ema.apply_shadow()
#evaluate
ema.restore()

具體EMA實(shí)現(xiàn),即插即用:

classEMA():
def__init__(self,model,decay):
self.model=model
self.decay=decay
self.shadow={}
self.backup={}

defregister(self):
forname,paraminself.model.named_parameters():
ifparam.requires_grad:
self.shadow[name]=param.data.clone()

defupdate(self):
forname,paraminself.model.named_parameters():
ifparam.requires_grad:
assertnameinself.shadow
new_average=(1.0-self.decay)*param.data+self.decay*self.shadow[name]
self.shadow[name]=new_average.clone()

defapply_shadow(self):
forname,paraminself.model.named_parameters():
ifparam.requires_grad:
assertnameinself.shadow
self.backup[name]=param.data
param.data=self.shadow[name]

defrestore(self):
forname,paraminself.model.named_parameters():
ifparam.requires_grad:
assertnameinself.backup
param.data=self.backup[name]
self.backup={}

這兩個(gè)方法的問(wèn)題就是跑起來(lái)會(huì)變慢,并且提分點(diǎn)都在前分位,不過(guò)可以是即插即用類(lèi)型

3.Rdrop等對(duì)比學(xué)習(xí)方法

有點(diǎn)用,不會(huì)變差,實(shí)現(xiàn)起來(lái)也很簡(jiǎn)單

#訓(xùn)練過(guò)程上下文
ce=CrossEntropyLoss(reduction='none')
kld=nn.KLDivLoss(reduction='none')
logits1=model(input)
logits2=model(input)
#下面是訓(xùn)練過(guò)程中對(duì)比學(xué)習(xí)的核心實(shí)現(xiàn)?。。?!
kl_weight=0.5#對(duì)比loss權(quán)重
ce_loss=(ce(logits1,target)+ce(logits2,target))/2
kl_1=kld(F.log_softmax(logits1,dim=-1),F.softmax(logits2,dim=-1)).sum(-1)
kl_2=kld(F.log_softmax(logits2,dim=-1),F.softmax(logits1,dim=-1)).sum(-1)
loss=ce_loss+kl_weight*(kl_1+kl_2)/2

大家都知道,在訓(xùn)練階段。dropout是開(kāi)啟的,你多次推斷dropout是有隨機(jī)性的。

模型如果魯棒的話,你同一個(gè)樣本,即使推斷時(shí)候,開(kāi)著dropout,結(jié)果也應(yīng)該差不多。好了,那么它的原理也呼之欲出了。用一張圖來(lái)形容就是:

5d5ce4a6-2e61-11ed-ba43-dac502259ad0.gif

隨便你怎么踹(dropout),本AI穩(wěn)如老狗。

KLD loss是衡量?jī)蓚€(gè)分布的距離的,所以說(shuō)他就是在原始的loss上,加了一個(gè)loss,這個(gè)loss刻畫(huà)了模型經(jīng)過(guò)兩次推斷,抵抗因dropout造成擾動(dòng)的能力。

4.TTA

這個(gè)一句話說(shuō)明白,測(cè)試時(shí)候構(gòu)造靠譜的數(shù)據(jù)增強(qiáng),簡(jiǎn)單一點(diǎn)的數(shù)據(jù)增強(qiáng)方式比較好,然后把預(yù)測(cè)結(jié)果加起來(lái)算個(gè)平均。

5.偽標(biāo)簽

代碼和原理實(shí)現(xiàn)也不難,代價(jià)也是訓(xùn)練變慢,畢竟多了一些數(shù)據(jù)一句話說(shuō)明白,就是用訓(xùn)練的模型,把測(cè)試數(shù)據(jù),或者沒(méi)有標(biāo)簽的數(shù)據(jù),推斷一遍。構(gòu)成偽標(biāo)簽,然后拿回去訓(xùn)練。注意不要leak。

聽(tīng)起來(lái)挺離譜的,我們把步驟用偽代碼實(shí)現(xiàn)一下。

model1.fit(train_set,label,val=validation_set)#step1
pseudo_label=model.pridict(test_set)#step2
new_label=concat(pseudo_label,label)#step3
new_train_set=concat(test_set,train_set)#step3
model2.fit(new_train_set,new_label,val=validation_set)#step4
final_predict=model2.predict(test_set)#step5

用網(wǎng)上一個(gè)經(jīng)典的圖來(lái)說(shuō)就是。

5e04879c-2e61-11ed-ba43-dac502259ad0.jpg

6.神經(jīng)網(wǎng)絡(luò)自動(dòng)填空值

表數(shù)據(jù)在NN上的trick,快被tabnet 集大成了,這個(gè)方法是把缺失值的位置之外的地方mask,本身當(dāng)成1這樣可以學(xué)習(xí)出一個(gè)參數(shù),再加回這個(gè)feature的輸入上。可以看看他文章的實(shí)現(xiàn)。

場(chǎng)景受限型trick

有用但場(chǎng)景受限或者不穩(wěn)定

1.PET或者其他prompt的方案

在一些特定場(chǎng)景上有用,比如zeroshot,或者小樣本的監(jiān)督訓(xùn)練,在數(shù)據(jù)量充足情況下拿來(lái)做模型融合有點(diǎn)用,單模型不一定干的過(guò)硬懟。

2.Focalloss

偶爾有用,大部分時(shí)候用處不大,看指標(biāo),在一些對(duì)長(zhǎng)尾,和稀有類(lèi)別特別關(guān)注的任務(wù)和指標(biāo)上有所作為。

3.mixup/cutmix等數(shù)據(jù)增強(qiáng)

挑數(shù)據(jù),大部分?jǐn)?shù)據(jù)和任務(wù)用處不大,局部特征比較敏感的任務(wù)有用,比如音頻分類(lèi)等

4人臉等一些改動(dòng)softmax的方式

在數(shù)據(jù)量偏少的時(shí)候有用,在工業(yè)界數(shù)據(jù)量巨大的情況下用處不大

5.領(lǐng)域后預(yù)訓(xùn)練

把自己的數(shù)據(jù)集,在Bert base上用MLM任務(wù)再過(guò)一遍,代價(jià)也是變慢,得益于huggingface可用性極高的代碼,實(shí)現(xiàn)起來(lái)也非常簡(jiǎn)單,適用于和預(yù)訓(xùn)練預(yù)料差別比較大的一些場(chǎng)景,比如中藥,ai4code等,在一些普通的新聞文本分類(lèi)數(shù)據(jù)集上用處不大。

6.分類(lèi)變檢索

這算是小樣本分類(lèi)問(wèn)題的標(biāo)準(zhǔn)解法了,類(lèi)似于人臉領(lǐng)域的baseline,在這上面有很多圍繞類(lèi)間可分,類(lèi)內(nèi)聚集的loss改進(jìn),像aa-softmax,arcface,am-softmax等

在文本分類(lèi),圖像分類(lèi)上效果都不錯(cuò)。

突破性能型trick

1.混合精度訓(xùn)練

AMP即插即用,立竿見(jiàn)影。

2.梯度累積

在優(yōu)化器更新參數(shù)之前,用相同的模型參數(shù)進(jìn)行幾次前后向傳播。在每次反向傳播時(shí)計(jì)算的梯度被累積(加總)。不過(guò)這種方法會(huì)影響B(tài)N的計(jì)算,可以用來(lái)突破batchsize上限。

3.Queue或者memery bank

可以讓batchsize突破天際,可以參考MoCo用來(lái)做對(duì)比學(xué)習(xí)的那個(gè)實(shí)現(xiàn)方式

4.非必要不同步

多卡ddp訓(xùn)練的時(shí)候,用到梯度累積時(shí),可以使用no_sync減少不必要的梯度同步,加快速度


審核編輯 :李倩


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

    關(guān)注

    30

    文章

    4900

    瀏覽量

    70678
  • 深度學(xué)習(xí)
    +關(guān)注

    關(guān)注

    73

    文章

    5561

    瀏覽量

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

    關(guān)注

    1

    文章

    490

    瀏覽量

    22614

原文標(biāo)題:深度學(xué)習(xí)刷SOTA的一堆trick

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

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    ADC不管是否有模擬信號(hào)輸入,輸出都是一堆固定的重復(fù)的值,為什么?

    不管是否有模擬信號(hào)輸入,輸出都是一堆固定的重復(fù)的值。是不是ADC沒(méi)有正常工作
    發(fā)表于 04-16 06:37

    軍事應(yīng)用中深度學(xué)習(xí)的挑戰(zhàn)與機(jī)遇

    人工智能尤其是深度學(xué)習(xí)技術(shù)的最新進(jìn)展,加速了不同應(yīng)用領(lǐng)域的創(chuàng)新與發(fā)展。深度學(xué)習(xí)技術(shù)的發(fā)展深刻影響了軍事發(fā)展趨勢(shì),導(dǎo)致戰(zhàn)爭(zhēng)形式和模式發(fā)生重大變化。本文將概述
    的頭像 發(fā)表于 02-14 11:15 ?530次閱讀

    BP神經(jīng)網(wǎng)絡(luò)與深度學(xué)習(xí)的關(guān)系

    BP神經(jīng)網(wǎng)絡(luò)與深度學(xué)習(xí)之間存在著密切的關(guān)系,以下是對(duì)它們之間關(guān)系的介紹: 、BP神經(jīng)網(wǎng)絡(luò)的基本概念 BP神經(jīng)網(wǎng)絡(luò),即反向傳播神經(jīng)網(wǎng)絡(luò)(Backpropagation Neural Network
    的頭像 發(fā)表于 02-12 15:15 ?850次閱讀

    ADS1299重新燒錄后就是一堆雜波,造成這樣的原因般是什么?

    關(guān)于ADS1299的疑惑,我的程序燒入到自己做的板卡,有時(shí)候就能正常采樣,無(wú)論是外部信號(hào)發(fā)生器的波形,還是內(nèi)部測(cè)試方波,但有時(shí)候重新燒錄后(程序字未動(dòng))就是一堆雜波。請(qǐng)問(wèn)造成這樣的原因般是什么
    發(fā)表于 12-19 08:48

    NPU在深度學(xué)習(xí)中的應(yīng)用

    隨著人工智能技術(shù)的飛速發(fā)展,深度學(xué)習(xí)作為其核心驅(qū)動(dòng)力之,已經(jīng)在眾多領(lǐng)域展現(xiàn)出了巨大的潛力和價(jià)值。NPU(Neural Processing Unit,神經(jīng)網(wǎng)絡(luò)處理單元)是專(zhuān)門(mén)為深度
    的頭像 發(fā)表于 11-14 15:17 ?1898次閱讀

    pcie在深度學(xué)習(xí)中的應(yīng)用

    深度學(xué)習(xí)模型通常需要大量的數(shù)據(jù)和強(qiáng)大的計(jì)算能力來(lái)訓(xùn)練。傳統(tǒng)的CPU計(jì)算資源有限,難以滿足深度學(xué)習(xí)的需求。因此,GPU(圖形處理單元)和TPU(張量處理單元)等專(zhuān)用硬件應(yīng)運(yùn)而生,它們通過(guò)
    的頭像 發(fā)表于 11-13 10:39 ?1340次閱讀

    Pytorch深度學(xué)習(xí)訓(xùn)練的方法

    掌握這 17 種方法,用最省力的方式,加速你的 Pytorch 深度學(xué)習(xí)訓(xùn)練。
    的頭像 發(fā)表于 10-28 14:05 ?650次閱讀
    Pytorch<b class='flag-5'>深度</b><b class='flag-5'>學(xué)習(xí)</b>訓(xùn)練的方法

    GPU深度學(xué)習(xí)應(yīng)用案例

    GPU在深度學(xué)習(xí)中的應(yīng)用廣泛且重要,以下是些GPU深度學(xué)習(xí)應(yīng)用案例: 、圖像識(shí)別 圖像識(shí)別是
    的頭像 發(fā)表于 10-27 11:13 ?1339次閱讀

    激光雷達(dá)技術(shù)的基于深度學(xué)習(xí)的進(jìn)步

    信息。這使得激光雷達(dá)在自動(dòng)駕駛、無(wú)人機(jī)、機(jī)器人等領(lǐng)域具有廣泛的應(yīng)用前景。 二、深度學(xué)習(xí)技術(shù)的發(fā)展 深度學(xué)習(xí)是機(jī)器學(xué)習(xí)
    的頭像 發(fā)表于 10-27 10:57 ?1056次閱讀

    FPGA加速深度學(xué)習(xí)模型的案例

    FPGA(現(xiàn)場(chǎng)可編程門(mén)陣列)加速深度學(xué)習(xí)模型是當(dāng)前硬件加速領(lǐng)域的個(gè)熱門(mén)研究方向。以下是些FPGA加速深度
    的頭像 發(fā)表于 10-25 09:22 ?1219次閱讀

    AI大模型與深度學(xué)習(xí)的關(guān)系

    AI大模型與深度學(xué)習(xí)之間存在著密不可分的關(guān)系,它們互為促進(jìn),相輔相成。以下是對(duì)兩者關(guān)系的介紹: 、深度學(xué)習(xí)是AI大模型的基礎(chǔ) 技術(shù)支撐 :
    的頭像 發(fā)表于 10-23 15:25 ?2876次閱讀

    深度學(xué)習(xí)GPU加速效果如何

    圖形處理器(GPU)憑借其強(qiáng)大的并行計(jì)算能力,成為加速深度學(xué)習(xí)任務(wù)的理想選擇。
    的頭像 發(fā)表于 10-17 10:07 ?608次閱讀

    FPGA做深度學(xué)習(xí)能走多遠(yuǎn)?

    ,共同進(jìn)步。 歡迎加入FPGA技術(shù)微信交流群14群! 交流問(wèn)題() Q:FPGA做深度學(xué)習(xí)能走多遠(yuǎn)?現(xiàn)在用FPGA做深度學(xué)習(xí)加速成為
    發(fā)表于 09-27 20:53

    PyTorch深度學(xué)習(xí)開(kāi)發(fā)環(huán)境搭建指南

    PyTorch作為種流行的深度學(xué)習(xí)框架,其開(kāi)發(fā)環(huán)境的搭建對(duì)于深度學(xué)習(xí)研究者和開(kāi)發(fā)者來(lái)說(shuō)至關(guān)重要。在Windows操作系統(tǒng)上搭建PyTorc
    的頭像 發(fā)表于 07-16 18:29 ?2510次閱讀

    深度學(xué)習(xí)算法在嵌入式平臺(tái)上的部署

    隨著人工智能技術(shù)的飛速發(fā)展,深度學(xué)習(xí)算法在各個(gè)領(lǐng)域的應(yīng)用日益廣泛。然而,將深度學(xué)習(xí)算法部署到資源受限的嵌入式平臺(tái)上,仍然是個(gè)具有挑戰(zhàn)性的任
    的頭像 發(fā)表于 07-15 10:03 ?3183次閱讀