“ 或許自上次N篇ACL事件后,不少人會突然發(fā)現(xiàn)我銷聲匿跡了。的確,我20年論文斷供整整一年。這一年我經(jīng)歷了論文從量變到質(zhì)變的痛苦蛻變過程,而今天這一篇論文就是在這個過程后的第一個我略微滿意的工作Child-Tuning,推薦給大家?!?/p>
自BERT火了以后,基本上現(xiàn)在所有NLP領(lǐng)域都all in Pre-training & Fine-tuning了吧?但當(dāng)“大”規(guī)模預(yù)訓(xùn)練模型遇上“小”規(guī)模標(biāo)注數(shù)據(jù)時,往往直接Fine-tuning會存在過擬合現(xiàn)象,進一步會影響Fine-tune完后模型的Generalization能力。如何更好地應(yīng)對這一問題呢?
我們提出的Child-Tuning給出了一種新的解法--在Fine-tuning過程中僅更新預(yù)訓(xùn)練模型中部分網(wǎng)絡(luò)的參數(shù)(這部分網(wǎng)絡(luò)本文就叫做Child Network),這么簡單直接的做法卻效果奇贊,結(jié)果在GLUE上相較標(biāo)準(zhǔn)Fine-tune有0.5~8.6個點的效果提升,但卻只需要幾行代碼的修改,你不想試試嗎?目前,該論文《Raise a Child in Large Language Model: Towards Effective and Generalizable Fine-tuning》已被EMNLP‘21接收。
01—
當(dāng)“大”模型遇上“小”數(shù)據(jù)
自BERT提出以來,預(yù)訓(xùn)練模型的參數(shù)量從最開始的3億,逐漸攀升到了GPT-2的15億,再到火出NLP圈的1750億參數(shù)的GPT-3。一方面模型越來越大,但另一方面,下游任務(wù)的標(biāo)注數(shù)據(jù)量有些情況下卻很少。如果直接將“大”模型在下游“小”數(shù)據(jù)上進行標(biāo)準(zhǔn)的Fine-tune,將模型遷移到目標(biāo)任務(wù)中去,會導(dǎo)致什么情況呢?
由于這種“大”與“小”的不匹配,往往容易出現(xiàn)過擬合的現(xiàn)象,導(dǎo)致模型在下游任務(wù)中的表現(xiàn)差、不穩(wěn)定、泛化性能差等現(xiàn)象,從而影響我們對于預(yù)訓(xùn)練模型的使用[1]。因此,越來越多工作開始聚焦于如何解決這種不匹配現(xiàn)象,緩解大規(guī)模預(yù)訓(xùn)練模型在下游任務(wù)中的過擬合。
本文介紹的Child-Tuning圍繞這個問題進行探究,從backward參數(shù)更新的角度思考問題,提出一種新的Fine-tuning策略,在Fine-tuning過程中僅更新對應(yīng)的Child Network,在不同下游任務(wù)中相比Vanilla Fine-tuning有明顯提高,如基于BERT模型在四個不同數(shù)據(jù)集中平均帶來1.5個點的提升,在ELETRA上甚至提升8.6個點。
02—
Child-Tuning 簡單有效的微調(diào)算法
在Fine-tuning過程中,我們一方面想利用大規(guī)模預(yù)訓(xùn)練模型提供的強大知識,另一方面又想解決“海量參數(shù)”與“少量標(biāo)注樣本”的不匹配問題,那么能否采用這樣的方式來解決問題呢?在forward的時候保持與正常Fine-tune一樣,利用整個模型的參數(shù)來編碼輸入樣本;在backward更新參數(shù)的時候,無需調(diào)整海量龐大的參數(shù),而是僅僅其中中的一部分,即網(wǎng)絡(luò)中的一個Child Network?;谶@個想法,本文提出一個新的Fine-tuning的策略——Child-Tuning。Child-Tuning的想法很簡單,做法也很簡單,概括性地講可以分為兩個步驟:
Step1:在預(yù)訓(xùn)練模型中發(fā)現(xiàn)確認(rèn)Child Network,并生成對應(yīng)的Weights的Gradients 0-1 Mask;
Step2:在后向傳播計算完梯度之后,僅僅對Child Network中的參數(shù)進行更新,而其他參數(shù)保持不變。
在前面提到的Child-Tuning的兩個步驟中,Step2即僅對Child Network中的參數(shù)進行更新相對簡單。我們可以通過一個梯度掩碼(Gradients Mask)來實現(xiàn),即在計算出各個參數(shù)位置的梯度之后將其乘以一個0-1矩陣的梯度掩碼,屬于Child Network中參數(shù)的位置對應(yīng)為1,而不屬于的對應(yīng)為0,之后再進行參數(shù)的更新。
那問題的關(guān)鍵就落到了,怎么識別Step1提到的Child Network呢?本文探索了兩種算法。一種是與下游任務(wù)無關(guān)的Child-Tuning_F方法,另一種則是與下游任務(wù)相關(guān)、能夠自適應(yīng)感知下游任務(wù)特點的Child-Tuning_D,這兩種方式各有優(yōu)缺點。
任務(wù)無關(guān)算法Child-Tuning_F對于下游任務(wù)無關(guān)算法Child-Tuning_F(F for Task-Free) ,其最大的優(yōu)點是簡單有效,在Fine-tune的過程中,只需要在每一步更新的迭代中,從伯努利分布中采樣得到一個Gradients Mask (M_t)即可,相當(dāng)于在對網(wǎng)絡(luò)參數(shù)更新的時候隨機地將一部分梯度丟棄。
盡管方式簡單,我們從理論上證明(詳細見原論文)這種方法可以有效提高模型更新量的方差,有利于模型逃離局部最優(yōu)點,最終收斂于一個相對比較平坦的損失曲面上,從而提高模型的泛化能力。任務(wù)相關(guān)算法Child-Tuning_D然而對于下游任務(wù)無關(guān)微調(diào)算法Child-Tuning_F,也有一個缺點,就是它對于不同的下游任務(wù)的策略都是一樣的,對于模型中的不同參數(shù)也都平等對待。
為此,我們提出了一個任務(wù)相關(guān)的Child-Tuning_D (D for Task-Driven ),讓選取Child Network的策略能夠針對不同的下游任務(wù)自適應(yīng)地進行調(diào)整,選擇出與下游任務(wù)最相關(guān)最重要的參數(shù)來充當(dāng)Child Network。具體的,我們引入Fisher Information Matrix(FIM)[2] 來估計每個參數(shù)對于下游任務(wù)的重要性程度,并與前人工作一致近似采用FIM的對角矩陣(即假設(shè)參數(shù)之間互相獨立)來計算各個參數(shù)相對下游任務(wù)的重要性分?jǐn)?shù)[3],之后選擇分?jǐn)?shù)最高的那部分參數(shù)作為我們的Child-Network。
盡管Child-Tuning_D擁有感知下游任務(wù)特性的能力,但同時計算Fisher Information也降低了方法的效率,我們不可能在每次迭代的時候都重新計算估計一次Child Network。
因此,我們采用的策略是在Fine-tuning一開始的時候識別出Child Network,并在接下來的迭代中都保持不變,也就是整個Fine-tuning過程只有這部分參數(shù)會被更新,我們的實驗證明了這種近似手段同樣可以取得不錯的效果(我們曾經(jīng)嘗試過在每個epoch之后重新估計一次,但是效果反而不如自始自終保持一致的這種方式)。
02—
Child-Tuning 實現(xiàn)僅需幾行代碼
總的來說,(在基于Adam優(yōu)化器下的)Child-Tuning的偽代碼如圖4所示,最關(guān)鍵的部分在于紅框內(nèi)的內(nèi)容,即發(fā)現(xiàn)Child Network,以及根據(jù)Child Network生成梯度掩模,從而實現(xiàn)僅對Child Network中的參數(shù)進行更新。
具體到代碼實現(xiàn)層面,就只需要在原來optimizer里加入簡單幾行代碼:
for p in model.parameters(): grad = p.grad.data
## Child-Tuning_F Begin
## reserve_p = 0.2 # the ratio of gradients that are reserved. grad_mask = Bernoulli(grad.new_full(size=grad.size(), fill_value=reserve_p))grad *= grad_mask.sample() / reserve_p
## Child-Tuning_F End ## # the followings are the original code of optimizer 。。..Child-Tuning代碼已開源到阿里預(yù)訓(xùn)練體系A(chǔ)liceMind,關(guān)于實現(xiàn)的更多細節(jié)可以參看:https://github.com/alibaba/AliceMind/tree/main/ChildTuning。
03—
實驗結(jié)果
我們做的實驗主要探究了微調(diào)后模型的效果和泛化性能(更多有趣實驗可以參見論文:https://arxiv.org/pdf/2109.05687.pdf):
下游任務(wù)效果
我們選取了BERT-large, XLNet-large,RoBERTa-large和ELECTRA-large四個不同的預(yù)訓(xùn)練模型,并在四個GLUE基準(zhǔn)集上的任務(wù),即CoLA,RTE,MRPC跟STS-B上進行實驗。從下表中可以看到,相比傳統(tǒng)微調(diào)算法(Vanilla Fine-tuning),使用Child-Tuning的兩個不同版本(Task-Free和Task-Driven)都能帶來提高,BERT平均提升+1.5,ELETRA平均提升+8.6。
微調(diào)后模型的泛化性能
我們通過兩種不同的方式來探究模型的泛化能力:域遷移實驗(Domain Transfer)和任務(wù)遷移實驗(Task Transfer),如果模型的泛化能力更好,產(chǎn)生的編碼表示更具有泛化性,那么在相應(yīng)的遷移實驗里邊將會在目標(biāo)任務(wù)中取得更好的效果。對于域遷移實驗(Domain Transfer),我們在一個NLI數(shù)據(jù)集上Fine-tune模型,之后直接將其在其他不同的NLI數(shù)據(jù)集上進行測試。
下表展現(xiàn)的是在源數(shù)據(jù)集MNLI跟SNLI(為模擬少樣本情況,均降采樣到5k)遷移到其他目標(biāo)數(shù)據(jù)集上的結(jié)果。可以看到,相比Vanilla Fine-tuning,Child-Tuning在目標(biāo)數(shù)據(jù)集上都擁有更好的效果,這說明了使用Child-Tuning能夠有效提高模型泛化能力,防止在源數(shù)據(jù)集上過擬合。
類似地我們還進行了任務(wù)遷移實驗(Task Transfer),即在一個源任務(wù)上進行Fine-tune,之后將預(yù)訓(xùn)練模型的參數(shù)凍結(jié)住,并遷移到另一個目標(biāo)任務(wù)上,僅僅Fine-tune與目標(biāo)任務(wù)相關(guān)的最頂層的線性分類器。下圖展示了在以MRPC為源任務(wù),遷移到CoLA,STS-B,QNLI和QQP任務(wù)上的實驗結(jié)果,Child-Tuning相比Vanilla Fine-tuning在任務(wù)遷移實驗上同樣具有明顯的優(yōu)勢,說明模型通過Child-Tuning的方法有效提高了泛化能力。
04—
小彩蛋:關(guān)于Rebuttal
這篇論文一開始的分?jǐn)?shù)是4/4/3.5,經(jīng)過rebuttal之后總共提高了1.5分,變成了4.5/4.5/4(滿分5分)。Reviewer主要關(guān)心的點就是本文與相關(guān)工作的區(qū)分度,比如Adapter[4],以及DIff-Pruning[5]等工作的對比。其實Child-Tuning跟這些工作還是就是有較大不同的,主要體現(xiàn)在:
a) 動機不同:這些工作主要聚焦于微調(diào)盡量少的參數(shù)而模型效果不會損失太多(所謂的paramter efficient learning),而Child-Tuning主要關(guān)注如何更好的提高模型的效果與泛化性能;
b) 方法不同:Adapter引入了額外的參數(shù)模塊,Diff-pruning則通過L0范數(shù)約束參數(shù)更新量,而Child-Tuning不需要額外的新模塊,只需要在模型內(nèi)識別確定Child Network即可;
c) 效果不同:Adapter跟Diff-pruning僅僅取得的效果與原模型相當(dāng)/可比,而Child-Tuning則明顯提升了模型在下游任務(wù)中的表現(xiàn)。
點評:分別從“動機-》方法-》結(jié)果”這三個方面闡釋清楚文章的貢獻的這個模板大家可以沿用到reviewer “質(zhì)疑你文章novelty” 或者 “跟xxx文章很相似” 的評審意見中。From:羅福莉
當(dāng)我們從這三方面做了非常詳細的clarify,充分解答了reviewer的最大疑惑之后,reviewer對我們的評價也就相應(yīng)地提高了。所以,rebuttal的時候抓住reviewer最關(guān)心的(而不是回復(fù)全部的問題),才更有可能影響reviewer提分哦~
ps:文章的最后感謝本文共一的實習(xí)生 潤昕,看到你的飛速成長,比我自己發(fā)了論文還開心!期待以及相信你有更好的未來~
責(zé)任編輯:haq
-
數(shù)據(jù)
+關(guān)注
關(guān)注
8文章
7256瀏覽量
91833 -
模型
+關(guān)注
關(guān)注
1文章
3519瀏覽量
50411 -
代碼
+關(guān)注
關(guān)注
30文章
4900瀏覽量
70715
原文標(biāo)題:極簡單但賊有效的Fine-tuning算法,幾行代碼最高漲點8%
文章出處:【微信號:zenRRan,微信公眾號:深度學(xué)習(xí)自然語言處理】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
當(dāng)ASM焊線機遇上協(xié)議翻譯官:CC\\-Link IE轉(zhuǎn)Modbus RTU的節(jié)能數(shù)據(jù)之旅
當(dāng)控制器遇上“協(xié)議外交官”:CC\\-Link IE轉(zhuǎn)Modbus RTU的能源數(shù)據(jù)握手
當(dāng)CCLink IE遇上DeviceNet,數(shù)據(jù)記錄儀秒變\"卷王\"?
從FA模型切換到Stage模型時:module的切換說明
FA模型訪問Stage模型DataShareExtensionAbility說明

當(dāng)沖壓焊接遇上Canopen到Profinet協(xié)議轉(zhuǎn)換網(wǎng)關(guān)
數(shù)據(jù)標(biāo)注服務(wù)—奠定大模型訓(xùn)練的數(shù)據(jù)基石
標(biāo)貝數(shù)據(jù)標(biāo)注服務(wù):奠定大模型訓(xùn)練的數(shù)據(jù)基石

有了DeepSeek等AI大模型,人人都能當(dāng)醫(yī)生嗎?
【「基于大模型的RAG應(yīng)用開發(fā)與優(yōu)化」閱讀體驗】+大模型微調(diào)技術(shù)解讀
【「大模型啟示錄」閱讀體驗】營銷領(lǐng)域大模型的應(yīng)用
【「大模型啟示錄」閱讀體驗】如何在客服領(lǐng)域應(yīng)用大模型
AI大模型的訓(xùn)練數(shù)據(jù)來源分析
使用AI大模型進行數(shù)據(jù)分析的技巧
當(dāng)PLC遇上IOT網(wǎng)關(guān)可以解決什么問題

評論