bert學習筆記

2021-10-12 10:23:03 字數 2212 閱讀 6814

如上圖,正如上一節所說,bert的核心結構其實跟transformer的encoder部分差不多。關於transformer的相關介紹,可檢視《transformer學習筆記》,那麼這裡就不再贅述了。

雖然bert跟transformer的encoder部分基本差不多,但是還是有一些地方需要注意一下。

在第一節中也已經介紹到,由於bert其實是乙個比較重的模型,谷歌已經幫我們對bert進行預訓練了。谷歌主要是通過masked language model(mlm)和next sentence prediction(nsp)任務來進行預訓練。

masked language model就是將輸入的文字序列進行隨機的mask,然後使用上下文來對mask的文字進行**,這就像我們以前做的完形填空一樣。

那麼到底是怎麼mask的呢?這裡是,將每個輸入的資料句子中15%的概率隨機抽取token,在這15%中的80%概論將token替換成[mask],15%中的另外10%替換成其他token,15%中的最後10%保持不變。之所以要這麼mask,是因為後面的fine-tuning階段是不會做mask的操作的,為了減少pre-training和fine-tuning階段輸入分布不一致的問題,所以採用了這種mask方式。

上面的mlm認為是為了讓bert學習到token級別的資訊,而nsp任務,則是為了讓bert學習到句子級別的資訊。

這個任務比較簡單,nsp取[cls]對應位置的最終輸出向量進行二分類,來判斷輸入的兩個句子是不是前後相連的關係。構建資料的方法是,對於句子a,句子b以50%的概率為句子a相連的下一句,以50%的概率在語料庫裡隨機抽取一句。以此構建了一半正樣本一半負樣本。

既然經過上面的步驟,我們已經拿到了pretraining過後的模型了,那麼接下來我們要將模型應用在我們自己的任務上,就需要對預訓練模型進行finetune,畢竟預訓練的語料跟我們最終使用的語料還是有差別的(當然,在一些任務中,我們可以直接使用bert預訓練模型的輸出向量作為我們的特徵向量進行後續的任務,但是經過finetune之後的效果會更好)。

在bert的**中,給出了四種finetune方式,分別是single sentence classification,sentence pair classification,single sentence tagging,question answering

single sentence classification主要用於一些文字分類之類的任務。如上圖,輸入是乙個句子,然後使用[cls]位置輸出的向量進行分類。比如最簡單的,就是將[cls]的輸出向量後面,接乙個全連線層,全連線層輸出維度就是分類數。

與4.1中相對的,sentence pair classification的輸入是兩個句子,但是其他的就基本和single sentence classification差不多了。在這裡輸入兩個句子之後,後面也依舊是使用[cls]的輸出進行分類。

這個就是序列標註的問題了,這是在nlp領域中非常基礎的任務,在分詞、詞性標註、命名實體識別等任務都是依靠序列標註任務實現的。這類問題因為輸入句子的每乙個token都需要**它們的標籤,所以序列標註是乙個單句多label分類任務,bert模型的所有輸出(除去特殊符號[cls], [sep])都要給出乙個**結果。同時,我們要保證bert的微調層的輸出是[batch_size, seq_len, num_labels]。

這個就是抽取式的qa微調模型。也就是輸入question和paragraph,然後,在paragraph的輸出端進行打標,從而在paragraph中抽取出前面question的答案。

這裡就講一下在微調過程中的一些trick吧。

由於本人還是菜鳥,文中若有不對之處,還望不吝賜教

學習筆記(三) BERT

結構 兩個bilstm 1.考慮上下文資訊,每個詞都給出三個embedding word embedding 1st lstm layer embedding 2nd lstm layer embedding,針對不同的上下文資訊給三個embedding賦予不同的權重。2.利用長文字而不是視窗學習e...

Bert理論筆記

之前講的很多了,再多說一點 對於位置編碼,使用的是相對位置編碼,這樣可以保證比較好的相對的位置關係 之後的openai gpt和bert使用的都是簡單的絕對編碼 對於decoder部分不經存在self attention還有encoder decoder attention,並且decoder部分使...

谷歌BERT 學習

bert 怎麼讀隨便 其實是bidirectional encoder representations from transformers的縮寫,屬於深度雙向預訓練模型,在模型的所有層的表示都依賴於左右兩個方向的上下文。這樣設計的結果就是在大規模預料上預訓練的bert表示再加一層額外的輸出層便可以應...