bert,全稱是bidirectional encoder representations from transformers。可以理解為一種以transformers為主要框架的雙向編碼表徵模型。所以要想理解bert的原理,還需要先理解什麼是transformers。
transformers簡單來說是乙個將一組序列轉換成另一組序列的黑盒子,這個黑盒子內部由編碼器和解碼器組成,編碼器負責編碼輸入序列,然後解碼器負責將編碼器的輸出轉換為另一組序列。具體可以參考這篇文章《想研究bert模型?先看看這篇文章吧!》
這裡需要注意的是,bert使用的transformers中在表示位置資訊時,沒有使用positional encoding,而是使用了positional embedding,所以位置資訊是訓練出來的,並且為了讓模型能同時考慮到單詞左邊和右邊的上下文資訊,bert使用了雙向transformers的架構。而由於位置資訊是採用的embedding的方式,所以對序列的最大長度就有所限制了,受限於訓練時最大序列的長度,這裡bert預訓練模型的最大序列長度是512.也就是說如果訓練樣本超過了長度,就需要採用截斷或者其他方式以保證序列的長度在512以內。
bert有2種用法:
bert在訓練的時候採用了無監督的方式,其主要採用2種策略來得到對序列的表徵。
mlm為了訓練乙個深度雙向表徵,作者簡單的隨機mask一些百分比的輸入tokens,然後**那些被mask掉的tokens。這一步稱為「masked lm」(mlm),在一些文獻中,被稱為完型填空任務(cloze task)。mask掉的tokens對應的最後的隱藏層向量餵給乙個輸出softmax,像在標準的lm中一樣。在實驗中,作者為每個序列隨機mask掉了15%的 tokens。儘管這允許作者獲得雙向預訓練模型,其帶來的負面影響是在預訓練和微調模型之間創造了不匹配,因為[mask]符號不會出現在微調階段。所以要想辦法讓那些被mask掉的詞的原本的表徵也被模型學習到,所以這裡作者採用了一些策略:
假設原句子是「my dog is hairy」,作者在3.1節 task1中提到,會隨機選擇句子中15%的tokens位置進行mask,假設這裡隨機選到了第四個token位置要被mask掉,也就是對hairy進行mask,那麼mask的過程可以描述如下:
上面的過程,需要結合訓練過程的epochs來理解,每個epoch表示學完了一遍所有的樣本,所以每個樣本在多個epochs過程中是會重複輸入到模型中的,知道了這個概念,上面的80%,10%,10%就好理解了,也就是說在某個樣本每次餵給模型的時候,用[mask]替換目標單詞的概率是80%;用隨機的單詞替換目標單詞的概率是10%;不改變目標單詞的概率是10%。
有的介紹bert的文章中,講解mlm過程的時候,將這裡的80%,10%,10%解釋成替換原句子被隨機選中的15%的tokens中的80%用[mask]替換目標單詞,10%用隨機的單詞替換目標單詞,10%不改變目標單詞。這個理解是不對的。
然後,作者在**中談到了採取上面的mask策略的好處。大致是說採用上面的策略後,transformer encoder就不知道會讓其**哪個單詞,或者說不知道哪個單詞會被隨機單詞給替換掉,那麼它就不得不保持每個輸入token的乙個上下文的表徵分布(a distributional contextual representation)。也就是說如果模型學習到了要**的單詞是什麼,那麼就會丟失對上下文資訊的學習,而如果模型訓練過程中無法學習到哪個單詞會被**,那麼就必須通過學習上下文的資訊來判斷出需要**的單詞,這樣的模型才具有對句子的特徵表示能力。另外,由於隨機替換相對句子中所有tokens的發生概率只有1.5%(即15%的10%),所以並不會影響到模型的語言理解能力。
nsp許多下游任務,比如問答,自然語言推理等,需要基於對兩個句子之間的關係的理解,而這種關係不能直接通過語言建模來獲取到。為了訓練乙個可以理解句子間關係的模型,作者為乙個二分類的下乙個句子**任務進行了預訓練,這些句子對可以從任何單語言的語料中獲取到。特別是,當為每個**樣例選擇乙個句子對a和b,50%的時間b是a後面的下乙個句子(標記為isnext), 50%的時間b是語料庫中的乙個隨機句子(標記為notnext)。圖1中,c用來輸出下乙個句子的標籤(nsp)。
」下個句子**「的任務的例子:
input = [cls] the man went to [mask] store [sep]
he bought a gallon [mask] milk [sep]
label = isnext
input = [cls] the man [mask] to the store [sep]
penguin [mask] are flight ##less birds [sep]
label = notnext
**中作者提到了另外的兩個模型,分別是openai gpt和elmo。
圖3展示了這3個模型架構的對比:
上面的三個模型架構中,只有bert模型的表徵在每一層都聯合考慮到了左邊和右邊的上下文資訊。另外,除了架構不同,還要說明的一點是:bert和openai gpt是基於fine-tuning的方法,而elmo是基於feature-based的方法。
ok,本篇就這麼多內容啦~,感謝閱讀o(∩_∩)o。
用深度學習做命名實體識別 六 BERT介紹
bert,全稱是bidirectional encoder representations from transformers。可以理解為一種以transformers為主要框架的雙向編碼表徵模型。所以要想理解bert的原理,還需要先理解什麼是transformers。transformers簡單來...
CRF做命名實體識別
crf learn.exe crf 的訓練程式 crf test.exe crf 的 程式 libcrfpp.dll 訓練程式和 程式需要使用的靜態鏈結庫 cd c users dell desktop crf實體識別crf learn template labeled train data mod...
ai命名實體識別模型 命名實體識別
crf中有兩類特徵函式,分別是狀態特徵和轉移特徵,狀態特徵用當前節點 某個輸出位置可能的狀態中的某個狀態稱為乙個節點 的狀態分數表示,轉移特徵用上乙個節點到當前節點的轉移分數表示。其損失函式定義如下 crf損失函式的計算,需要用到真實路徑分數 包括狀態分數和轉移分數 其他所有可能的路徑的分數 包括狀...