Chapter7-2_BERT and its family - Introduction and Fine-tune
文章目錄
- 1 What is pre-train model
- 2 How to fine-tune
- 2.1 Input
- 2.2 Output
- 2.3 Fine-tune
- 2.4 Weighted Features
- 3 Why fine-tune
本文為李弘毅老師【BERT and its family - Introduction and Fine-tune】的課程筆記,課程視頻youtube地址,點(diǎn)這里👈(需翻墻)。
下文中用到的圖片均來自于李宏毅老師的PPT,若有侵權(quán),必定刪除。
文章索引:
上篇 - 7-1 Overview of NLP Tasks
下篇 - 7-3_BERT and its family - ELMo, BERT, GPT, XLNet, MASS, BART, UniLM, ELECTRA, and more
總目錄
1 What is pre-train model
我們這里所說的pre-train model就是輸入一串tokens,能夠輸出一串vectors,且每個(gè)vector可以表示對應(yīng)的token的語義的模型,這些vectors也被稱作為embeddings。
以前常用的模型有耳熟能詳?shù)膚ord2vec,Glove等等。但是英文的單詞太多了,這個(gè)時(shí)候來一個(gè)新單詞的話整個(gè)embedding的模型就要重新train了,為了解決整個(gè)問題,就有了fasttext。fasttext是針對英文的,針對中文的則是輸入圖片,讓模型通過圖片中文字的偏旁部首去預(yù)測出訓(xùn)練時(shí)沒見過的文字的embedding。這種訓(xùn)練embedding的方式,根據(jù)語言的不同會有不同的方法。
不過,這里還有一個(gè)問題,就是按照上述的方法,如果輸入的token是一樣的,那么每次出來的vector也不然hi一樣的。但實(shí)際情況下并非如此。比如下圖中"養(yǎng)只狗"的“狗”和“單身狗”的“狗”顯然是不同的意思。
于是,我們就希望模型可以在輸出某個(gè)token的embedding的時(shí)候,去考慮上下文的信息,這個(gè)叫做contextualized word embedding 。這樣的模型基本就是基于LSTM或者self-attention layer去搭建的一個(gè)seq2seq的模型(如Bert,Megatron,Turing NLG等),可以理解為之前的文章中講過的encoder,至于訓(xùn)練的方法,這里暫時(shí)先不講。也有用tree-based model去做的,但是因?yàn)樾Ч麤]有那么強(qiáng),所以不太流行。
為了讓模型的效果變好,所使用的模型也就越來越大,參數(shù)已經(jīng)大到只有那些大公司才可以使用了。
當(dāng)然,窮人也有窮人的辦法,我們可以再不過多地?fù)p失模型精度的情況下,把模型變小一點(diǎn),這里有很多模型壓縮方面的技術(shù),這里不細(xì)講了。
2 How to fine-tune
那么,我們?nèi)绾伟堰@個(gè)pre-train model應(yīng)用到各式各樣的NLP任務(wù)當(dāng)中去呢?上篇中我們已經(jīng)討論過了,NLP的任務(wù)可以按輸入和輸出分別分類,如下圖所示。那么接下來就來講一下,如何去應(yīng)對每一類。
2.1 Input
(1) One sentence
對于輸入只有一個(gè)句子的,那就直接輸入就可以了,因?yàn)閜re-train model也是一個(gè)句子的輸入。
(2)multiple sentences
對于輸入有多個(gè)句子的,我們需要有一個(gè)叫做"[SEP]"的分隔符來把兩個(gè)句子拼成一個(gè)句子,然后再輸入就可以了。
2.2 Output
(1)One class
輸出只有一個(gè)分類的時(shí)候,可以有兩種做法,一種做法是,在輸入的開頭加一個(gè)叫做"[CLS]“的toekn,然后在這個(gè)”[CLS]“對應(yīng)的輸出的embedding后面加一個(gè)head,也就是比較淺的神經(jīng)網(wǎng)絡(luò),可以是一層全連接,然后輸出想要的類別數(shù)量;另一個(gè)做法是,把所有token的輸入都輸入到一個(gè)head當(dāng)中去,然后輸出想要的類別數(shù)量。
(2)Class for each token
當(dāng)每個(gè)token都要做分類時(shí),那在模型的后面加一個(gè)seq2seq的head的就可以了。
(2)Copy from input
當(dāng)我們的任務(wù)是Extraction-based QA時(shí),該怎么辦呢?因?yàn)檩斎胗衠uestion和document兩個(gè),所以我們需要加入一個(gè)”[SEP]"分隔符,然后輸出是找出document中的哪個(gè)token為答案的start,哪個(gè)token為答案的end。這個(gè)時(shí)候,就要兩個(gè)額外的向量去分別和document中每個(gè)token的輸出做dot product,然后和start向量最相關(guān)的token就是start token,和end向量最相關(guān)的token就是end token。
(4)General Sequence
當(dāng)我們希望模型的輸出也是一個(gè)sequence的時(shí)候,我們可以把pre-train model的輸出作為輸入,在后面接一個(gè)decoder,讓這個(gè)decoder去完成輸出sequence的步驟。這樣的一個(gè)壞處就是decoder會是一個(gè)比較大的模型,而我們是希望沒有pre-train過的參數(shù)是越少越好的。
另一種做法是把pre-train的模型當(dāng)作decoder去做。這就需要我們在input的后面加一個(gè)類似于"[SEP]“的特殊符號,然后把這個(gè)符號的輸出丟到一個(gè)我們自定義的head當(dāng)中去,輸出一個(gè)token,然后把這個(gè)token當(dāng)作輸入,反復(fù)下去,直到輸出”"
2.3 Fine-tune
在訓(xùn)練的時(shí)候,我們可以把pre-trained model的weights都固定住,然后只去訓(xùn)練最后自定義加上去的head。
我們也可以直接訓(xùn)練整個(gè)模型,雖然整個(gè)模型很大,但大部分的weights是預(yù)訓(xùn)練過的,所以訓(xùn)練起來不會壞掉。實(shí)際經(jīng)驗(yàn)也是這種方法要優(yōu)于上面的方法。
如果我們要用第二種方法的話,不同的task我們就需要train一個(gè)不同的模型,而這樣的模型往往非常大,這就很浪費(fèi)資源(計(jì)算資源,存儲資源),所以就有了Adaptor。Adaptor是我們在pretrained-model里去加一些layer,然后訓(xùn)練的時(shí)候就訓(xùn)練這些layer和最后的head。這樣pretrained model還是不動的。
比如下圖就是一種插入Adaptor的方式。實(shí)驗(yàn)證明,Adaptor可以讓模型調(diào)很少的參數(shù),卻達(dá)到fine-tune整個(gè)模型的效果。當(dāng)然,這個(gè)Adaptor如何加,還是一個(gè)值得深究的地方。
2.4 Weighted Features
由于pre-trained model往往很大,不同層得到的feature代表的意義也不同,所以也可以把各層的feature抽出來加權(quán)后輸入head中去,加權(quán)的weights可以是模型自己去學(xué)的。
3 Why fine-tune
那我們?yōu)槭裁匆胒ine-tune這樣的方法呢?一方面是因?yàn)閠rainning loss可以更快收斂,下圖是對比了隨機(jī)初始化訓(xùn)練和預(yù)訓(xùn)練后訓(xùn)練的training loss隨著epoch的變化過程,虛線為隨機(jī)初始化,實(shí)線為預(yù)訓(xùn)練的。很明顯,預(yù)訓(xùn)練的模型效果更好。
另一方面是因?yàn)閒ine-tune得到的模型有更好的泛化能力。下圖就是講模型變成二維下可視化的結(jié)果。可見右邊預(yù)訓(xùn)練的模型找到的極小值點(diǎn)的區(qū)域更加平緩,也就意味著泛化能力更好。
總結(jié)
以上是生活随笔為你收集整理的Chapter7-2_BERT and its family - Introduction and Fine-tune的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: LeetCode 1764. 通过连接另
- 下一篇: LeetCode 2100. 适合种地的