谷歌BERT 學習

2021-08-31 18:30:50 字數 2921 閱讀 5643

bert(怎麼讀隨便),其實是bidirectional encoder representations from transformers的縮寫,屬於深度雙向預訓練模型,在模型的所有層的表示都依賴於左右兩個方向的上下文。這樣設計的結果就是在大規模預料上預訓練的bert表示再加一層額外的輸出層便可以應用到很多任務中,並可以得到很好的效果,據**說該模型在11種自然語言處理任務中都取得了目前最好的效果。(不得不佩服這種概念簡單但是實際效果屌炸的設計)

預訓練模型近幾年在自然語言處理領域逐漸得到廣泛關注,在很多任務中被驗證非常有效。目前在應用預訓練語言表示到下游任務(downstream tasks)中有兩種策略:1. 基於特徵,2. 基於fine-tuning;

基於特徵,例如elmo,將預訓練好的representations作為特徵輸入特定任務模型,訓練模型完成任務目標;

基於fine-tuning, generative pre-trained transformer (openai gpt) , 引入最少的特定任務引數,然後再下游任務中fine-tuning引入的引數;

bert的提出感覺是在前人基礎上的集大成,之前gpt已經是基於transform的語言模型了,但只做了單向,bert搞了雙向,增加了一些特殊的訓練方法,取得了很好的效果;

模型是乙個多層雙向transformer encoder, 基於《attention is all you need》中的模型(在中發布,大神詳細介紹的部落格: )。

模型結果對比如下圖:

模型的輸入可以是乙個句子,也可以是a pair of 句子,如圖:

圖中的輸入為一對句子,兩個句子用特殊分隔符[sep]隔開,每個輸入都是三個embedding的疊加,同時對於分類任務來說,句子開頭還有乙個表示類別的特殊embedding:[cls]。

並不是使用傳統的從左到右或者是從右到左語言模型進行預訓練,使用兩種新穎的無監督**任務來進行bert訓練。

masked lm

為了訓練深度雙向表示,我們直接將一些輸入token按一定的比例進行遮擋,然後**這些被遮擋的tokens,這個過程就叫做「masked lm(mlm)」。

而bert的訓練過程如下,

訓練資料生成器隨機選擇15%的tokens,例如選擇句子「my dog is hairy」中的"hairy", 並不總是將"hairy"替換為[mask], 進行如下處理:

上述過程有效解決了在fine-tuning過程中[mask] token永遠不會被看到,從而使得預訓練與fine-tuning產生mismatch的問題;但也存在著收斂時間變長的固有問題(因為每個batch只**15%的token)

**中的原理解釋:

transformer encoder 並不知道之後會**哪個word,也不知道輸入的哪個word被隨機替換了,因此會被強迫學習到每乙個輸入token的上下文背景語義分布。同時,由於隨機替換只發生1.5%(10% of 15%),看起來也不會損害模型的語言理解能力。

next sentence prediction

許多重要的下游任務,例如問答、自然語言推斷等都是基於對兩個句子關係的理解,同時使用語言模型又無法很好的捕捉。為了訓練乙個可以理解句子關係的模型,我們進行乙個二值化的下一句子**預訓練過程,訓練資料可以從任何乙個大的文字集合中得到。

當我們選擇兩個句子a和b的時候,50%的時間b是真正的下一句子,50%的時間b是從集合中任意生成的乙個句子,例如:

在 next sentence prediction目標上,**給出的結果最終的預訓練模型可以達到97%~98%的精確率(有點殘暴啊)。

真正上手使用,需要經過兩個階段,分別是在大語料上的預訓練階段(與具體任務無關,語料越大越好)與具體應用的fine-tuning階段;

預訓練階段

準備好大的文字集合,將文字集合分為a,b兩部分,為next sentence prediction目標準備資料;

由於同時訓練兩個任務目標,因此有兩部分損失函式:

total_loss = masked_lm_loss + next_sentence_loss
關於損失函式的定義,bert模型只使用了transform模型的encoder部分,它的encoder部分輸出為每乙個item的hidden_vector, 而對於masked_lm_loss,只使用對應mask掉的item hidden_vector過softmax 進行**,同時限制了再乙個訓練樣例中最多mask掉item的數量。

這裡需要注意乙個特殊的"[cls]",我的理解是在訓練階段,每個訓練樣例輸入開頭的都是這個特殊item,對應在輸入的hidden_vector會學到乙個包括整個序列的一些資訊,只是最後這個特殊的item對應的hidden_vector輸出經過fine-tuning可以用來做分類任務,且效果很好,**中把這個特殊向量叫做乙個sequence的pooled representation。

補充一點,sequence難免長度不一樣,做訓練需要特殊處理,採用的方式是用0值padding成一樣長的佇列,對不padding部分使用乙個mask的資料進行記錄,在訓練時候attention部分同樣有乙個mask,進行對應處理。

fine-tuning階段

fine-tuning階段就看具體任務是做什麼了,我的任務是文字分類,那就對"[cls]"對應的輸出向量pooled representation 再加乙個分類模型,二分類還是多分類看需求,在具體任務的訓練資料上繼續進行訓練,基本模式就是在最大化對數似然的過程中,fine-tine bert本身的引數與我們根據具體任務新加的引數。

Bert學習小記

input embedding token embedding segmentation embedding position embedding 三個embedding相加 1 masked lm策略 mlm 如果只選取什麼詞要mask的話,會有乙個缺點 造成pre training層和fine ...

bert學習筆記

如上圖,正如上一節所說,bert的核心結構其實跟transformer的encoder部分差不多。關於transformer的相關介紹,可檢視 transformer學習筆記 那麼這裡就不再贅述了。雖然bert跟transformer的encoder部分基本差不多,但是還是有一些地方需要注意一下。在...

BERT學習理解

在看了好多大牛們的部落格之後,關於bert有了乙個大概的理解,將一些知識點整理到這裡。bert的全稱是bidirectional encoder representation from transformers,利用了transformer的encoder部分,重點是預處理 訓練pre traini...