在看了好多大牛們的部落格之後,關於bert有了乙個大概的理解,將一些知識點整理到這裡。
bert的全稱是bidirectional encoder representation from transformers,利用了transformer的encoder部分,重點是預處理/訓練pre-training,創新點是將雙向 transformer用於語言模型
bert採用了transformer encoder的模型來作為語言模型,transformer模型來自於**[4], 完全拋棄了rnn/cnn等結構,而完全採用attention機制來進行input-output之間關係的計算,如下圖中左半邊部分所示,其中模型包括兩個sublayer:
multi-head attention 來做模型對輸入的self-attention
feed forward 部分來對attention計算後的輸入進行變換
這裡為了能夠有利於token-level tasks例如序列標註,同時有利於sentence-level tasks例如問答,採用了兩個預訓練任務,目標就是做語言模型,使用兩個新的無監督**任務對bert進行預訓練
第一種是masked lm:
為了訓練雙向特徵,這裡採用了masked language model的預訓練方法,隨機mask句子中的部分token,然後訓練模型來**被去掉的token。
具體操作是:
隨機mask語料中15%的token,然後將masked token 位置輸出的final hidden vectors送入softmax,來**masked token。
這裡如果都用標記[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
這樣做的目的:transformer encoder不知道它將被要求**哪些單詞或哪些單詞已被隨機單詞替換,因此它被迫保持每個輸入token的分布式上下文表示
為什麼要以一定的概率保持不變呢? 如果100%的時間都用[mask]來取代被選中的詞,那麼在fine-tuning的時候模型會有一些沒見過的詞。第二種是next sentence prediction在 bert 的訓練過程中,模型接收成對的句子作為輸入,並且**其中第二個句子是否在原始文件中也是後續句子。那麼為啥要以一定的概率使用隨機詞呢?這是因為transformer要保持對每個輸入token分布式的表徵,否則transformer很可能會記住這個[mask]就是"hairy"。
至於使用隨機詞帶來的負面影響,所有其他的token(即非"hairy"的token)共享15%*10% = 1.5%的概率,其影響是可以忽略不計的。
在訓練期間,50% 的輸入對在原始文件中是前後關係,另外 50% 中是從語料庫中隨機組成的,並且是與第一句斷開的。
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]
訓練模型,使模型具備理解長序列上下文的聯絡的能力
針對不同的任務,模型能夠明確的表達乙個句子,或者句子對(比如[問題,答案])。如下圖所示,輸入包括三個embedding的求和,分別是:
token embedding 表示當前詞的embedding,每個句子有個句子整體的embedding項對應給每個單詞
segment embedding 表示當前詞所在句子的index embedding
position embedding 表示當前詞所在位置的index embedding,這是因為nlp中單詞順序是很重要的特徵,需要在這裡對位置資訊進行編碼
bert的輸入部分是個線性序列,兩個句子通過分隔符分割,最前面和最後增加兩個識別符號號。把單詞對應的三個embedding疊加,就形成了bert的輸入。
接下來進行encoder,下圖是 transformer 的 encoder 部分,輸入是乙個 token 序列,先對其進行 embedding ,然後輸入給神經網路,輸出是大小為 h 的向量序列,每個向量對應著具有相同索引的 token。
fine-tuning方式是指在已經訓練好的語言模型的基礎上,加入少量的task-specific parameters, 例如對於分類問題在語言模型基礎上加一層softmax網路,然後在新的語料上重新訓練來進行fine-tune。
參考:**bert
bert的理解
bert介紹
**解讀:bert模型及fine-tuning
Bert 理解基礎
bert理解的基礎 1 word embedding 2 rnn 3 seq2seq 4 transformer word embedding脈絡 w2v 詞對映到低維稠密空間,使得語義上相似的兩個詞在語義空間的距離也會比較近。w2v的問題 語義是上下文相關的。而w2v訓練出來詞的向量始終只有乙個。...
BERT的通俗理解
bert是乙個預訓練的模型,那麼什麼是預訓練呢?舉例子進行簡單的介紹 假設已有a訓練集,先用a對網路進行預訓練,在a任務上學會網路引數,然後儲存以備後用,當來乙個新的任務b,採取相同的網路結構,網路引數初始化的時候可以載入a學習好的引數,其他的高層引數隨機初始化,之後用b任務的訓練資料來訓練網路,當...
bert中的sep 詳解BERT閱讀理解
bert的簡單回顧 google發布的 pre training of deep bidirectional transformers for language understanding 提到的bert模型重新整理了自然語言處理的11項記錄。算是nlp的里程碑事件,也開始了大公司之間的資料和算力的...