什么是BERT?
BERT,全稱是Bidirectional Encoder Representations from Transformers,可以理解為一種以Transformers為主要框架的雙向編碼表征模型,所以要想理解BERT的原理,還需要先理解什么是Transformers,
Transformers簡單來說是一個將一組序列轉換成另一組序列的黑盒子,這個黑盒子內部由編碼器和解碼器組成,編碼器負責編碼輸入序列,然后解碼器負責將編碼器的輸出轉換為另一組序列,具體可以參考這篇文章《想研究BERT模型?先看看這篇文章吧!》
這里需要注意的是,BERT使用的Transformers中在表示位置資訊時,沒有使用Positional Encoding,而是使用了Positional Embedding,所以位置資訊是訓練出來的,并且為了讓模型能同時考慮到單詞左邊和右邊的背景關系資訊,BERT使用了雙向Transformers的架構,而由于位置資訊是采用的embedding的方式,所以對序列的最大長度就有所限制了,受限于訓練時最大序列的長度,這里BERT預訓練模型的最大序列長度是512.也就是說如果訓練樣本超過了長度,就需要采用截斷或者其他方式以保證序列的長度在512以內,
BERT能做什么?
- 文本推理
給定一對句子,預測第二個句子和第一個句子的關系:蘊含、矛盾、中性, - 問答
給定問題和短文,從短文預測出對應span作為答案, - 文本分類
比如對電影評論做情感預測, - 文本相似度匹配
輸入兩個句子,計算語意相似度, - 命名物體識別
給定一個句子,輸出句子中特定的物體,比如人名、地址、時間等,
怎么使用BERT?
BERT有2種用法:
-
feature-based
直接使用BERT預訓練模型提取出文本序列的特征向量,比如文本相似度匹配, -
fine-tuning
在預訓練模型層上添加新的網路;凍結預訓練模型的所有層,訓練完成后,放開預訓練模型的所有層,聯合訓練解凍的部分和添加的部分,比如文本分類、命名物體識別等,
為什么BERT能做到這些?
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的程序可以描述如下:
- 80% 的時間:用[MASK]替換目標單詞,例如:my dog is hairy --> my dog is [MASK] ,
- 10% 的時間:用隨機的單詞替換目標單詞,例如:my dog is hairy --> my dog is apple ,
- 10% 的時間:不改變目標單詞,例如:my dog is hairy --> my dog is hairy , (這樣做的目的是使表征偏向于實際觀察到的單詞,)
上面的程序,需要結合訓練程序的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
還有哪些模型可以做到這些,它們和BERT的區別是什么?
論文中作者提到了另外的兩個模型,分別是OpenAI GPT和ELMo,
圖3展示了這3個模型架構的對比:

- BERT使用了雙向的Transformer架構,預訓練階段使用了MLM和NSP,
- OpenAI GPT使用了left-to-right的Transformer,
- ELMo分別使用了left-to-right和right-to-left進行獨立訓練,然后將輸出拼接起來,為下游任務提供序列特征,
上面的三個模型架構中,只有BERT模型的表征在每一層都聯合考慮到了左邊和右邊的背景關系資訊,另外,除了架構不同,還要說明的一點是:BERT和OpenAI GPT是基于fine-tuning的方法,而ELMo是基于feature-based的方法,
更多細節
請閱讀原論文,或者參考筆者的這篇文章《BERT論文解讀》,
ok,本篇就這么多內容啦~,感謝閱讀O(∩_∩)O,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/71980.html
標籤:其他
下一篇:關于docker
