論文《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》
以下陸續介紹bert及其變體(介紹的為粗體)
bert自從橫空出世以來,引起廣泛關注,相關研究及bert變體/擴展噴涌而出,如ELECTRA、DistilBERT、SpanBERT、RoBERTa、MASS、UniLM、ERNIE等。
由此,bert的成就不僅是打破了多項記錄,更是開創了一副可期的前景。
1, Bert
在看bert論文前,建議先了解《Attention is all you need》論文。
創新點:
- 通過MLM,使用雙向Transformer模型,獲得更豐富的上下文信息
- 輸入方式,句子級輸入,可以是一個句子或2個句子,只要給定分隔標記即可
Transformer,多頭注意力等概念見bert系列一
預訓練語言表示應用到下游任務的2種方式
- feature-based:提取某層或多層特征用於下游任務。代表:ELMo
- fine-tuning:下游任務直接在預訓練模型上添加若干層,微調即可。代表:OpenAI GPT,bert
MLM(masked language model):
文中操作為,對15%的token進行mask標記,被標記的token有80%的情況下以[MASK]代替,10%以隨機token代替,10%不改變原始token。
為什么要mask操作?因為,要使用雙向模型,就面臨一個“看見自己”的問題,如bert系列一所述。那么我們將一個token mask掉(是什么蒙蔽了我的雙眼?是mask),它就看不見自己啦!
為什么不對選中的token全部mask?因為,預訓練中這么做沒問題,而在下游任務微調時,[MASK] token是不會出現的,由此產生mismatch問題。
預訓練與微調圖示
如圖,輸入可以是一個句子,或2個句子,最后都轉換成最大長度521的序列,序列的開頭是一個[CLS]標記,用於分類或預測下一句等任務。句子之間也有一個[SEP]標記,用於分隔句子。
對於微調,如圖示問答任務,用S表示答案開頭,E表示答案末尾。第i個單詞(Ti)作為答案開頭的概率為:
即單詞隱層表示Ti與開頭S點乘后的softmax值。
候選范圍i~j的得分為STi+ETj,取其中得分最大(i,j)的作為答案的預測范圍。
輸入Embedding使用3個嵌入相加,token嵌入層就是我們通常用的嵌入方式,segment用於區分一個token屬於句子A還是B,Position用於位置編碼(自注意需要)
如下圖:
2, ELECTRA
再介紹一個參數少,訓練快,性能好的ELECTRA。來自論文《ELECTRA: PRE-TRAINING TEXT ENCODERS AS DISCRIMINATORS RATHER THAN GENERATORS》
創新點:
不使用mask操作,而是從一個較小的生成器(文中建議大小為判別器的1/4到1/2)中采樣來替換一些tokens,然后使用一個判別器去判斷這個token是真實的還是生成器產生的。這樣模型可以使用全部的tokens而非bert中15%mask的token去訓練。
這有點像GAN(生成對抗網絡)的概念,不同的是,這里的生成器並不以fool判別器為目標,而是基於極大似然原則訓練(其實GAN也可以通過極大似然,只不過生成器反向傳播更新需要通過鑒別器)。
如圖,先標記若干位置為mask點,然后使用生成器采樣的數據覆蓋mask位置,再使用判別器判斷每個token是原生的還是偽造的。
生成器及判別器的損失函數為:
生成器負責對選定的m個點使用極大似然訓練,而判別器將要對所有的token進行真偽判斷。
最終loss為加權和:
參數共享:
文中僅使用Embedding參數在生成器和判別器中共享(token和positional Embedding,這樣做更高效)
3,DistilBERT
論文為《DistilBERT, a distilled version of BERT: smaller, faster, cheaper and lighter》介紹部分我認為機器之心的這篇文章不錯
機器之心:小版BERT也能出奇跡:最火的預訓練語言庫探索小巧之路
這里只總結一下
創新點
蒸餾模型之前也有。主要是使用了軟目標交叉熵損失,以及學生網絡初始化的方式。
成就
模型大小減到60%,保留97%語言理解能力,推理速度快60%
訓練方式
訓練方式為蒸餾(即使用學生網絡模擬教師網絡,這里bert-base作為教師網絡)。
損失由3部分組成,一部分是學生網絡與教師網絡的軟目標交叉熵,一部分為學生網絡與教師網絡隱狀態矢量的嵌入余弦損失,一部分為掩飾語言模型(mlm)損失。其中前2個損失較為重要。
模型移除了token Embedding層和pooler(用於下一句預測),layer數量減到一半。學生網絡的初始化也很重要,因為layer只有一半,所以初始化也是從2個layer中取1個。使用非常大的batch_size=4000等。