色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創作中心

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

3天內不再提示

深度學習刷SOTA的一堆trick

深度學習自然語言處理 ? 來源:包包算法筆記 ? 作者:包包算法筆記 ? 2022-09-07 15:13 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

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

像優秀的優化器,學習率調度方法,數據增強,dropout,初始化,BN,LN,確實是調參大師的寶貴經驗,大家平常用的也很多。

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

穩定有用型trick

0.模型融合

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

  1. 對抗訓練

對抗訓練就是在輸入的層次增加擾動,根據擾動產生的樣本,來做一次反向傳播。以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參數
#梯度下降,更新參數
optimizer.step()
model.zero_grad()

具體FGM的實現

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

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

2.EMA/SWA

移動平均,保存歷史的一份參數,在一定訓練階段后,拿歷史的參數給目前學習的參數做一次平滑。這個東西,我之前在earhian的祖傳代碼里看到的。他喜歡這東西+衰減學習率。確實每次都有用。

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

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

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

具體EMA實現,即插即用:

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等對比學習方法

有點用,不會變差,實現起來也很簡單

#訓練過程上下文
ce=CrossEntropyLoss(reduction='none')
kld=nn.KLDivLoss(reduction='none')
logits1=model(input)
logits2=model(input)
#下面是訓練過程中對比學習的核心實現!?。?!
kl_weight=0.5#對比loss權重
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,結果也應該差不多。好了,那么它的原理也呼之欲出了。用一張圖來形容就是:

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

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

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

4.TTA

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

5.偽標簽

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

聽起來挺離譜的,我們把步驟用偽代碼實現一下。

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

用網上一個經典的圖來說就是。

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

6.神經網絡自動填空值

表數據在NN上的trick,快被tabnet 集大成了,這個方法是把缺失值的位置之外的地方mask,本身當成1這樣可以學習出一個參數,再加回這個feature的輸入上??梢钥纯此恼碌膶崿F。

場景受限型trick

有用但場景受限或者不穩定

1.PET或者其他prompt的方案

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

2.Focalloss

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

3.mixup/cutmix等數據增強

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

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

在數據量偏少的時候有用,在工業界數據量巨大的情況下用處不大

5.領域后預訓練

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

6.分類變檢索

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

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

突破性能型trick

1.混合精度訓練

AMP即插即用,立竿見影。

2.梯度累積

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

3.Queue或者memery bank

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

4.非必要不同步

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


審核編輯 :李倩


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

    關注

    30

    文章

    4902

    瀏覽量

    70854
  • 深度學習
    +關注

    關注

    73

    文章

    5562

    瀏覽量

    122852
  • nlp
    nlp
    +關注

    關注

    1

    文章

    490

    瀏覽量

    22638

原文標題:深度學習刷SOTA的一堆trick

文章出處:【微信號:zenRRan,微信公眾號:深度學習自然語言處理】歡迎添加關注!文章轉載請注明出處。

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    ADC不管是否有模擬信號輸入,輸出都是一堆固定的重復的值,為什么?

    不管是否有模擬信號輸入,輸出都是一堆固定的重復的值。是不是ADC沒有正常工作
    發表于 04-16 06:37

    如何排除深度學習工作臺上量化OpenVINO?的特定層?

    無法確定如何排除要在深度學習工作臺上量化OpenVINO?特定層
    發表于 03-06 07:31

    軍事應用中深度學習的挑戰與機遇

    人工智能尤其是深度學習技術的最新進展,加速了不同應用領域的創新與發展。深度學習技術的發展深刻影響了軍事發展趨勢,導致戰爭形式和模式發生重大變化。本文將概述
    的頭像 發表于 02-14 11:15 ?550次閱讀

    BP神經網絡與深度學習的關系

    BP神經網絡與深度學習之間存在著密切的關系,以下是對它們之間關系的介紹: 、BP神經網絡的基本概念 BP神經網絡,即反向傳播神經網絡(Backpropagation Neural Network
    的頭像 發表于 02-12 15:15 ?885次閱讀

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

    關于ADS1299的疑惑,我的程序燒入到自己做的板卡,有時候就能正常采樣,無論是外部信號發生器的波形,還是內部測試方波,但有時候重新燒錄后(程序字未動)就是一堆雜波。請問造成這樣的原因般是什么
    發表于 12-19 08:48

    NPU在深度學習中的應用

    隨著人工智能技術的飛速發展,深度學習作為其核心驅動力之,已經在眾多領域展現出了巨大的潛力和價值。NPU(Neural Processing Unit,神經網絡處理單元)是專門為深度
    的頭像 發表于 11-14 15:17 ?1961次閱讀

    pcie在深度學習中的應用

    深度學習模型通常需要大量的數據和強大的計算能力來訓練。傳統的CPU計算資源有限,難以滿足深度學習的需求。因此,GPU(圖形處理單元)和TPU(張量處理單元)等專用硬件應運而生,它們通過
    的頭像 發表于 11-13 10:39 ?1382次閱讀

    Pytorch深度學習訓練的方法

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

    GPU深度學習應用案例

    GPU在深度學習中的應用廣泛且重要,以下是些GPU深度學習應用案例: 、圖像識別 圖像識別是
    的頭像 發表于 10-27 11:13 ?1412次閱讀

    激光雷達技術的基于深度學習的進步

    信息。這使得激光雷達在自動駕駛、無人機、機器人等領域具有廣泛的應用前景。 二、深度學習技術的發展 深度學習是機器學習
    的頭像 發表于 10-27 10:57 ?1092次閱讀

    FPGA加速深度學習模型的案例

    FPGA(現場可編程門陣列)加速深度學習模型是當前硬件加速領域的個熱門研究方向。以下是些FPGA加速深度
    的頭像 發表于 10-25 09:22 ?1277次閱讀

    AI大模型與深度學習的關系

    AI大模型與深度學習之間存在著密不可分的關系,它們互為促進,相輔相成。以下是對兩者關系的介紹: 、深度學習是AI大模型的基礎 技術支撐 :
    的頭像 發表于 10-23 15:25 ?2934次閱讀

    深度學習GPU加速效果如何

    圖形處理器(GPU)憑借其強大的并行計算能力,成為加速深度學習任務的理想選擇。
    的頭像 發表于 10-17 10:07 ?636次閱讀

    FPGA做深度學習能走多遠?

    ,共同進步。 歡迎加入FPGA技術微信交流群14群! 交流問題() Q:FPGA做深度學習能走多遠?現在用FPGA做深度學習加速成為
    發表于 09-27 20:53

    NVIDIA推出全新深度學習框架fVDB

    在 SIGGRAPH 上推出的全新深度學習框架可用于打造自動駕駛汽車、氣候科學和智慧城市的 AI 就緒型虛擬表示。
    的頭像 發表于 08-01 14:31 ?1164次閱讀
    主站蜘蛛池模板: 在线亚洲视频无码天堂 | 久久人妻少妇嫩草AV無碼 | 国产成人免费不卡在线观看 | 俄罗斯呦呦 | 欧美卡1卡2卡三卡2021精品 | 青青草国产精品 | 儿子操妈妈 | 欧美大片免费观看 | 做暖暖视频在线看片免费 | 久久人妻熟女中文字幕AV蜜芽 | a视频免费在线 | 精品无码国产自产在线观看 | 欧美顶级情欲片免费看 | 国产在线播放KKK | 亚洲国产精品日本无码网站 | 四虎国产精品永久一区高清 | 99视频在线看观免费 | 荡公乱妇HD中文字幕 | 亚洲免费中文 | 尿孔 调教 扩张 | 亚洲日本欧美日韩高观看 | 92精品国产成人观看免费 | 黄A无码片内射无码视频 | 恋夜秀场支持安卓版全部视频国产 | 哒哒哒影院在线观看免费高清 | 国产小视频国产精品 | 色综合伊人色综合网站 | 亚欧日韩毛片在线看免费网站 | 国产午夜人成在线视频麻豆 | 国产亚洲精品久久无码98 | 色欲AV精品人妻一区二区麻豆 | 射死你天天日 | 扒开腿狂躁女人GIF动态图 | 国产午夜电影在线观看不卡 | 亚洲国产精品久久精品成人网站 | 欧美亚洲曰韩一本道 | 99久久精品免费精品国产 | 狠狠色狠狠色综合日日32 | 久久国产精品无码视欧美 | 成人精品在线视频 | 性夜影院爽黄A爽免费动漫 性夜夜春夜夜爽AA片A |

    電子發燒友

    中國電子工程師最喜歡的網站

    • 2931785位工程師會員交流學習
    • 獲取您個性化的科技前沿技術信息
    • 參加活動獲取豐厚的禮品