女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

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

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

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

刷SOTA一般通用的trick

深度學習自然語言處理 ? 來源:包包算法筆記 ? 作者:包包閉關(guān)修煉 ? 2022-09-07 15:10 ? 次閱讀

一般通用的trick都被寫進論文和代碼庫里了

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

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

穩(wěn)定有用型trick

0.模型融合

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

對抗訓練

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

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

具體FGM的實現(xiàn)

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

defattack(self,epsilon=1.,emb_name='emb.'):
#emb_name這個參數(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這個參數(shù)要換成你模型中embedding的參數(shù)名
forname,paraminself.model.named_parameters():
ifparam.requires_gradandemb_nameinname:
assertnameinself.backup
param.data=self.backup[name]
self.backup={}

2.EMA/SWA

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

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

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

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

具體EMA實現(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={}

這兩個方法的問題就是跑起來會變慢,并且提分點都在前分位,不過可以是即插即用類型

3.Rdrop等對比學習方法

有點用,不會變差,實現(xiàn)起來也很簡單

#訓練過程上下文
ce=CrossEntropyLoss(reduction='none')
kld=nn.KLDivLoss(reduction='none')
logits1=model(input)
logits2=model(input)
#下面是訓練過程中對比學習的核心實現(xiàn)!!!!
kl_weight=0.5#對比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

大家都知道,在訓練階段。dropout是開啟的,你多次推斷dropout是有隨機性的。

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

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

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

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

4.TTA

這個一句話說明白,測試時候構(gòu)造靠譜的數(shù)據(jù)增強,簡單一點的數(shù)據(jù)增強方式比較好,然后把預測結(jié)果加起來算個平均。

5.偽標簽

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

聽起來挺離譜的,我們把步驟用偽代碼實現(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)上一個經(jīng)典的圖來說就是。

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

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

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

場景受限型trick

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

1.PET或者其他prompt的方案

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

2.Focalloss

偶爾有用,大部分時候用處不大,看指標,在一些對長尾,和稀有類別特別關(guān)注的任務和指標上有所作為。

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

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

4人臉等一些改動softmax的方式

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

5.領(lǐng)域后預訓練

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

6.分類變檢索

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

在文本分類,圖像分類上效果都不錯。

突破性能型trick

1.混合精度訓練

AMP即插即用,立竿見影。

2.梯度累積

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

3.Queue或者memery bank

可以讓batchsize突破天際,可以參考MoCo用來做對比學習的那個實現(xiàn)方式

4.非必要不同步

多卡ddp訓練的時候,用到梯度累積時,可以使用no_sync減少不必要的梯度同步,加快速度。




審核編輯:劉清

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

    關(guān)注

    1

    文章

    45

    瀏覽量

    18872
  • 電源優(yōu)化器
    +關(guān)注

    關(guān)注

    0

    文章

    11

    瀏覽量

    5466
收藏 人收藏

    評論

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

    人臉識別門禁終端的一般故障排查方法

    問題,有些可能是使用環(huán)境造成,有些可能是人為不小心損壞了。下面,天波小編就來簡單介紹人臉識別門禁終端的一般故障排查方法吧。【電源問題】當人臉識別門禁終端出現(xiàn):接上電
    的頭像 發(fā)表于 04-27 10:45 ?296次閱讀
    人臉識別門禁終端的<b class='flag-5'>一般</b>故障排查方法

    mark點定位的一般原理與步驟

    在印刷電路板(PCB)的制造、組裝和檢測過程中,Mark 點定位是確保精度的關(guān)鍵環(huán)節(jié)。以下是 Mark 點定位的一般原則和步驟。 ()設計階段 位置規(guī)劃 在 PCB 設計之初,就需要規(guī)劃 Mark
    的頭像 發(fā)表于 02-05 17:37 ?1053次閱讀

    光譜傳感器的一般原理

    光譜傳感器是種能夠測量物質(zhì)光譜特性的儀器,其一般原理主要基于物質(zhì)對不同波長的光的吸收、發(fā)射和散射等特性進行分析,從而獲取物質(zhì)的光譜信息。以下是對光譜傳感器一般原理的詳細解釋:
    的頭像 發(fā)表于 01-05 14:16 ?947次閱讀

    網(wǎng)線一般是什么線

    網(wǎng)線一般指的是用于計算機網(wǎng)絡通信的傳輸介質(zhì),它有多種類型,每種類型都有其特定的應用場景和性能特點。以下是些常見的網(wǎng)線類型: 、以太網(wǎng)網(wǎng)線(Ethernet Cable) 以太網(wǎng)網(wǎng)線是最常用的網(wǎng)線
    的頭像 發(fā)表于 12-03 09:46 ?1714次閱讀

    變電站接地網(wǎng)的使用壽命一般是多久

    變電站接地網(wǎng)的使用壽命一般是多久?
    發(fā)表于 11-13 16:31 ?0次下載

    PGA2311P和PGA2311PA主要區(qū)別體現(xiàn)在哪里?一般情況運用下能通用嗎?

    PGA2311P和PGA2311PA主要區(qū)別體現(xiàn)在哪里,一般情況運用下能通用嗎,感謝!!!
    發(fā)表于 10-31 07:13

    鎧裝光纜和一般光纜區(qū)別

    鎧裝光纜和一般光纜在結(jié)構(gòu)、用途、性能以及價格等方面都存在顯著差異。以下是對這兩者的詳細對比: 、結(jié)構(gòu)差異 鎧裝光纜: 基本構(gòu)造包括光纖、加強件、護套等。 光纖被包裹在個堅固的金屬層(稱為鎧裝)中
    的頭像 發(fā)表于 10-25 10:26 ?1725次閱讀

    退耦電容一般用多大

    退耦電容的容量選擇并不是成不變的,而是需要根據(jù)具體的電路設計需求和工作條件來確定。以下是對退耦電容容量選擇的一般原則和考慮因素: 一般
    的頭像 發(fā)表于 09-26 11:28 ?1296次閱讀

    關(guān)于\"OPA615\"的SOTA的跨導大小的疑問求解

    關(guān)于OPA615的SOTA部分,看datasheet的page9的figure22,我們可以知道跨導大小大概是35mA/V左右,并且可以知道其Chold輸出一般在5mA以內(nèi),但是我從社區(qū)里面找到
    發(fā)表于 09-13 06:25

    一般熔斷器有過載和短路保護嗎

    一般熔斷器主要提供短路保護,但在定程度上也能提供過載保護 。不過,需要注意的是,熔斷器的過載保護能力相對有限,并且通常具有定的時間延遲。 短路保護 當電路中出現(xiàn)短路故障時,電流會急劇增大,遠遠
    的頭像 發(fā)表于 09-05 17:35 ?2708次閱讀

    一般繼電器需要多少電流才能驅(qū)動

    一般繼電器所需的驅(qū)動電流會根據(jù)其型號、規(guī)格和額定工作電壓等因素有所不同。通常,繼電器需要定的電流來驅(qū)動其線圈產(chǎn)生磁場,從而使觸點閉合或斷開。以下是對繼電器驅(qū)動電流的一般性說明:
    的頭像 發(fā)表于 09-05 15:18 ?6239次閱讀

    功分器的隔離度一般多大

    功分器的隔離度是指在個輸出端口上的信號對其他輸出端口的干擾程度,它是衡量功分器性能的個重要參數(shù)。一般來說,功分器的隔離度大小會根據(jù)其設計、應用場景以及具體規(guī)格而有所不同。 在無線通信和射頻技術(shù)中
    的頭像 發(fā)表于 08-13 11:31 ?2141次閱讀

    Arinc 429 發(fā)送數(shù)據(jù)一般是什么

    Arinc 429 發(fā)送數(shù)據(jù)一般是什么
    發(fā)表于 07-23 09:46

    工控機壽命一般幾年

    工控機,作為工業(yè)控制的核心設備,其使用壽命受到多種因素的影響。一般來說,工控機的正常使用壽命通常在 5 年到 10 年之間 12。但這范圍并非絕對,具體的使用壽命還會受到以下幾個關(guān)鍵因素的影響:
    的頭像 發(fā)表于 06-25 10:00 ?1566次閱讀

    NB81是否支持OneNet SOTA功能?應該如何激活SOTA

    NB81是否支持OneNet SOTA功能? 可以支持,應該如何激活SOTA
    發(fā)表于 06-04 06:14