日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

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

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

3天內不再提示

深度學習刷SOTA的一堆trick

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

掃碼添加小助手

加入工程師交流群

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

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

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

穩(wěn)定有用型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的祖?zhèn)鞔a里看到的。他喜歡這東西+衰減學習率。確實每次都有用。

#初始化
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穩(wěn)如老狗。

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的輸入上。可以看看他文章的實現。

場景受限型trick

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

1.PET或者其他prompt的方案

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

2.Focalloss

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

3.mixup/cutmix等數據增強

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

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

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

5.領域后預訓練

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

6.分類變檢索

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

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

突破性能型trick

1.混合精度訓練

AMP即插即用,立竿見影。

2.梯度累積

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

3.Queue或者memery bank

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

4.非必要不同步

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


審核編輯 :李倩


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

    關注

    30

    文章

    4977

    瀏覽量

    74431
  • 深度學習
    +關注

    關注

    73

    文章

    5611

    瀏覽量

    124663
  • nlp
    nlp
    +關注

    關注

    1

    文章

    491

    瀏覽量

    23347

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

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

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    深度學習為什么還是無法處理邊緣場景?

    [首發(fā)于智駕最前沿微信公眾號]雖然自動駕駛車輛已經完成了數百萬公里的行駛測試,深度學習也已被普遍應用,但依然會在些看似簡單的場景中犯下低級錯誤。比如在遇到些從未見到過的邊緣場景時,
    的頭像 發(fā)表于 05-04 10:16 ?2160次閱讀
    <b class='flag-5'>深度</b><b class='flag-5'>學習</b>為什么還是無法處理邊緣場景?

    人工智能-Python深度學習進階與應用技術:工程師高培解讀

    深度學習的工程化落地,早已不是紙上談兵的事。從卷積神經網絡到Transformer,從目標檢測到大模型私有化部署,技術棧不斷延伸,工程師面臨的知識體系也越來越龐雜?,F根據中際賽威工程師培訓老師的
    的頭像 發(fā)表于 04-21 11:01 ?402次閱讀
    人工智能-Python<b class='flag-5'>深度</b><b class='flag-5'>學習</b>進階與應用技術:工程師高培解讀

    從github上下載下來編譯為什么有一堆報錯哈?

    從github上下載下來編譯為什么有一堆報錯哈?
    發(fā)表于 03-27 06:17

    DRV8251:款優(yōu)秀的有直流電機驅動器深度解析

    DRV8251:款優(yōu)秀的有直流電機驅動器深度解析 在電機驅動領域,有直流電機驅動器直是非常關鍵的部件。今天我們要深入探討的是德州儀器
    的頭像 發(fā)表于 01-07 16:35 ?624次閱讀

    機器學習深度學習中需避免的 7 個常見錯誤與局限性

    無論你是剛入門還是已經從事人工智能模型相關工作段時間,機器學習深度學習中都存在些我們需要時刻關注并銘記的常見錯誤。如果對這些錯誤置之不
    的頭像 發(fā)表于 01-07 15:37 ?370次閱讀
    機器<b class='flag-5'>學習</b>和<b class='flag-5'>深度</b><b class='flag-5'>學習</b>中需避免的 7 個常見錯誤與局限性

    Amphenol ZTPD - 2210數字輸出熱電探測器深度解析

    Amphenol ZTPD - 2210數字輸出熱電探測器深度解析 在電子工程領域,傳感器是獲取環(huán)境信息的關鍵部件。今天,我們要深入探討Amphenol Advanced Sensors的ZTPD
    的頭像 發(fā)表于 12-10 11:35 ?596次閱讀

    深度睡眠時為什么串口會發(fā)送一堆 \\0?

    RT,初始化串口,發(fā)送數據然后休眠,串口工具會收到CW32L010發(fā)送的一堆? ,AI統(tǒng)計了下 128個字節(jié),是什么原因?。?/div>
    發(fā)表于 11-28 07:25

    如何深度學習機器視覺的應用場景

    深度學習視覺應用場景大全 工業(yè)制造領域 復雜缺陷檢測:處理傳統(tǒng)算法難以描述的非標準化缺陷模式 非標產品分類:對形狀、顏色、紋理多變的產品進行智能分類 外觀質量評估:基于學習的外觀質量標準判定 精密
    的頭像 發(fā)表于 11-27 10:19 ?359次閱讀

    如何在機器視覺中部署深度學習神經網絡

    圖 1:基于深度學習的目標檢測可定位已訓練的目標類別,并通過矩形框(邊界框)對其進行標識。 在討論人工智能(AI)或深度學習時,經常會出現“神經網絡”、“黑箱”、“標注”等術語。這些概
    的頭像 發(fā)表于 09-10 17:38 ?1081次閱讀
    如何在機器視覺中部署<b class='flag-5'>深度</b><b class='flag-5'>學習</b>神經網絡

    嵌入式 STM32 零基礎入門:「降維打擊式學習法」適配零基礎,高效進階全棧工程師

    嵌入式學習難嗎?今天就為你揭秘顛覆傳統(tǒng)的——“降維打擊式嵌入式學習法”!初學嵌入式會感覺難,為什么?因為嵌入式是軟硬件深度結合的技術,應用層開發(fā)所見即所得,效果直觀,相對容易上手。但底層開發(fā)卻像
    的頭像 發(fā)表于 08-25 15:24 ?892次閱讀
    嵌入式 STM32 零基礎入門:「降維打擊式<b class='flag-5'>學習</b>法」適配零基礎,高效進階全棧工程師

    學習D13的芯片配置,為什么我vscode,一堆爆紅,看著好煩,有沒有解決辦法

    學習D13的芯片配置,為什么我vscode,一堆爆紅,看著好煩,有沒有解決辦法
    發(fā)表于 08-22 20:02

    深度學習對工業(yè)物聯(lián)網有哪些幫助

    、實施路徑三個維度展開分析: 、深度學習如何突破工業(yè)物聯(lián)網的技術瓶頸? 1. 非結構化數據處理:解鎖“沉睡數據”價值 傳統(tǒng)困境 :工業(yè)物聯(lián)網中70%以上的數據為非結構化數據(如設備振動波形、紅外圖像、日志文本),傳統(tǒng)方法難以
    的頭像 發(fā)表于 08-20 14:56 ?1257次閱讀

    自動駕駛中Transformer大模型會取代深度學習嗎?

    [首發(fā)于智駕最前沿微信公眾號]近年來,隨著ChatGPT、Claude、文心言等大語言模型在生成文本、對話交互等領域的驚艷表現,“Transformer架構是否正在取代傳統(tǒng)深度學習”這
    的頭像 發(fā)表于 08-13 09:15 ?4397次閱讀
    自動駕駛中Transformer大模型會取代<b class='flag-5'>深度</b><b class='flag-5'>學習</b>嗎?

    AURIX tc367通過 MCU SOTA 更新邏輯 IC 閃存是否可行?

    你好專家:我的用例是 MCU 通過 SPI 連接到邏輯 IC,邏輯 IC 連接到 8MB 閃存,但 MCU PFLASH 大小為 2MB,通過 MCU SOTA 更新邏輯 IC 閃存是否可行?
    發(fā)表于 08-11 06:36

    求助,關于TC387使能以及配置SOTA些問題求解

    你好, 之前我拿到貴司給個demo,里面有些使能以及配置SWAP的代碼, 這里有些疑問 問題1. 判斷SOTA功能是否生效,demo中使用的是 SCU_STMEM1中的bit位, 代碼如下
    發(fā)表于 08-08 07:31
    亳州市| 五莲县| 会泽县| 阜平县| 清丰县| 巴南区| 浦县| 于都县| 桓台县| 和顺县| 五大连池市| 明水县| 咸阳市| 永泰县| 祁连县| 依安县| 安远县| 洪湖市| 手游| 湟中县| 叙永县| 长葛市| 应用必备| 漾濞| 珠海市| 凤山县| 望江县| 普宁市| 彰化县| 翁源县| 怀来县| 芮城县| 黎川县| 淮滨县| 神农架林区| 柞水县| 华蓥市| 乐都县| 图们市| 敦煌市| 安岳县|