BERT的通俗理解 預訓練模型 微調

2021-09-26 22:57:19 字數 3499 閱讀 7174

1、預訓練模型

bert是乙個預訓練的模型,那麼什麼是預訓練呢?舉例子進行簡單的介紹

假設已有a訓練集,先用a對網路進行預訓練,在a任務上學會網路引數,然後儲存以備後用,當來乙個新的任務b,採取相同的網路結構,網路引數初始化的時候可以載入a學習好的引數,其他的高層引數隨機初始化,之後用b任務的訓練資料來訓練網路,當載入的引數保持不變時,稱為"frozen",當載入的引數隨著b任務的訓練進行不斷的改變,稱為「fine-tuning」,即更好地把引數進行調整使得更適合當前的b任務

優點:當任務b的訓練資料較少時,很難很好的訓練網路,但是獲得了a訓練的引數,會比僅僅使用b訓練的引數更優

task #1: masked lm

為了訓練雙向特徵,這裡採用了masked language model的預訓練方法,隨機mask句子中的部分token,然後訓練模型來**被去掉的token。

具體操作是:

隨機mask語料中15%的token,然後將masked token 位置輸出的final hidden vectors送入softmax,來**masked token。

這裡也有乙個小trick,如果都用標記[mask]代替token會影響模型,所以在隨機mask的時候採用以下策略:

1)80%的單詞用[mask]token來代替

my dog is hairy → my dog is [mask]

2)10%單詞用任意的詞來進行代替

3)10%單詞不變

my dog is hairy → my dog is hairy

task 2#: next sentence prediction

為了讓模型捕捉兩個句子的聯絡,這裡增加了next sentence prediction的預訓練方法,即給出兩個句子a和b,b有一半的可能性是a的下一句話,訓練模型來**b是不是a的下一句話

input = [cls] the man went to [mask] store [sep]

penguin [mask] are flight ## less birds [sep]

label = notnext

he bought a gallon [mask] milk [sep]

label = isnext

input = [cls] the man [mask] to the store [sep]

訓練模型,使模型具備理解長序列上下文的聯絡的能力

2、bert模型

bert:全稱是bidirectional encoder representation from transformers,即雙向transformer的encoder,bert的模型架構基於多層雙向轉換解碼,因為decoder是不能獲要**的資訊的,模型的主要創新點都在pre-traing方法上,即用了masked lm和next sentence prediction兩種方法分別捕捉詞語和句子級別的representation

其中「雙向」表示模型在處理某乙個詞時,它能同時利用前面的詞和後面的詞兩部分資訊,這種「雙向」的**在於bert與傳統語言模型不同,它不是在給你大**所有前面詞的條件下**最可能的當前詞,而是隨機遮掩一些詞,並利用所有沒被遮掩的詞進行**

下圖展示了三種預訓練模型,其中 bert 和 elmo 都使用雙向資訊,openai gpt 使用單向資訊

3、bert的輸入部分

bert的輸入部分是個線性序列,兩個句子通過分隔符分割,最前面和最後增加兩個識別符號號。每個單詞有三個embedding:位置資訊embedding,這是因為nlp中單詞順序是很重要的特徵,需要在這裡對位置資訊進行編碼;單詞embedding,這個就是我們之前一直提到的單詞embedding;第三個是句子embedding,因為前面提到訓練資料都是由兩個句子構成的,那麼每個句子有個句子整體的embedding項對應給每個單詞。把單詞對應的三個embedding疊加,就形成了bert的輸入。

如上圖所示,輸入有a句[my dog is cute]和b句[he likes playing]這兩個自然句,我們首先需要將每個單詞及特殊符號都轉化為詞嵌入向量,因為神經網路只能進行數值計算。其中特殊符[sep]是用於分割兩個句子的符號,前面半句會加上分割碼a,後半句會加上分割碼b

因為要建模句子之間的關係,bert 有乙個任務是** b 句是不是 a 句後面的一句話,而這個分類任務會借助 a/b 句最前面的特殊符 [cls] 實現,該特殊符可以視為匯集了整個輸入序列的表徵。

最後的位置編碼是 transformer 架構本身決定的,因為基於完全注意力的方法並不能像 cnn 或 rnn 那樣編碼詞與詞之間的位置關係,但是正因為這種屬性才能無視距離長短建模兩個詞之間的關係。因此為了令 transformer 感知詞與詞之間的位置關係,我們需要使用位置編碼給每個詞加上位置資訊。

總結一下:

(1)token embeddings表示的是詞向量,第乙個單詞是cls,可以用於之後的分類任務

(2)segment embeddings用來區別兩種句子,因為預訓練不光做lm還要做以兩個句子為輸入的分類任務

(3)position embeddings表示位置資訊

4、nlp的四大類任務

(1)序列標註:分詞、實體識別、語義標註……

(2)分類任務:文字分類、情感計算……

(3)句子關係判斷:entailment、qa、自然語言推理

(4)生成式任務:機器翻譯、文字摘

上圖給出示例,對於句子關係類任務,很簡單,和gpt類似,加上乙個起始和終結符號,句子之間加個分隔符即可。對於輸出來說,把第乙個起始符號對應的transformer最後一層位置上面串接乙個softmax分類層即可。對於分類問題,與gpt一樣,只需要增加起始和終結符號,輸出部分和句子關係判斷任務類似改造;對於序列標註問題,輸入部分和單句分類是一樣的,只需要輸出部分transformer最後一層每個單詞對應位置都進行分類即可。從這裡可以看出,上面列出的nlp四大任務裡面,除了生成類任務外,bert其它都覆蓋到了,而且改造起來很簡單直觀。(

5、模型的評價

(1)優點

bert是截止至2023年10月的最新的的state of the art模型,通過預訓練和精調可以解決11項nlp的任務。使用的是transformer,相對於rnn而言更加高效、能捕捉更長距離的依賴。與之前的預訓練模型相比,它捕捉到的是真正意義上的bidirectional context資訊

(2)缺點

作者在文中主要提到的就是mlm預訓練時的mask問題:

1)[mask]標記在實際**中不會出現,訓練時用過多[mask]影響模型表現;

2)每個batch只有15%的token被**,所以bert收斂得比left-to-right模型要慢(它們會**每個token)

6、glue語料集的介紹

實驗資料以及對應的nlp任務

mnli:蘊含關係推斷

qqp:問題對是否等價

qnli:句子是都回答問句

sst-2:情感分析

cola:句子語言性判斷

sts-b:語義相似

mrpc:句子對是都語義等價

rte:蘊含關係推斷

wnli:蘊含關係推斷

7、git**

關於bert知識乾貨的彙總

bert預訓練模型解讀 Bert 預訓練小結

最近正在預訓練乙個中文pytorch版本的bert,模型部分 是基於huggingface發布的版本,預訓練過程還是參考google的 值得吐槽的是huggingface之前發布的分支名叫pytorch pretrain bert,後來又加上了gpt2 xlnet一系列當紅模型,結果索性改了個名字叫...

BERT 中文預訓練模型使用

只要是從事文字處理相關工作的人應該都知道 google 最新發布的 bert 模型,該模型屬於是詞向量的預訓練模型,一經提出便橫掃各大 nlp 任務,最近 google 公司如約推出了中文詞向量的預訓練模型,不得不說這是一件非常有良心的事情,在此膜拜和感謝 google 公司。那麼如何使用 bert...

基於bert預訓練模型的比較

基於bert預訓練模型的比較 electra roberta bert wwm albert xlnet 預訓練任務替換詞檢驗 遮掩詞 與bert相同 遮掩詞 sop permutation lm pretraining model生成器 判別器的模式,生成器與判別器的網路結構均為transform...