再谈BERT
三次講到了BERT。第一次是nlp中的經典深度學習模型(二),第二次是transformer & bert &GPT,這是第三次。
文章目錄
- 1 關于預訓練模型
- 1.1預訓練概念
- 1.2 再談語言模型
- 1.3 ELMo
- 1.4 GPT
- 2 BERT
- 2.1 BERT特點
- 2.2架構
- 2.3 預訓練任務
- 2.3.1 masked language model
- 2.3.2 next sentence prediction
- 2.3.4 Subword
- 2.4 微調fine-tuning
- 3后記
1 關于預訓練模型
1.1預訓練概念
預訓練模型最早用于CV領域。
深度學習模型就是一個y=fθ(x)y=f_{\theta}(x)y=fθ?(x)查找最優θ\thetaθ的過程。如果參數θ\thetaθ初始值合適的話,會加快模型訓練進度。
預訓練就是在任務上優化參數,最后得出一套參數。這套參數可以作為下游任務的初始值。
為什么預訓練模型可以提升模型的精度?
用一個例子來說明。廚師需要做很多種菜,例如:宮保雞丁、魚香肉絲、地三鮮。廚師可以每次對每個菜選擇不同的原材料、加工,成菜。廚師也可以先把菜加工成半成品,例如煮好的雞肉、胡蘿卜絲、切好的土豆塊。有了這些半成品,可以加快出菜速度。可以把預訓練得到的參數理解為半成品。
1.2 再談語言模型
語言模型就是 計算一個句子出現概率的模型。
P(x1,x2...xn)=P(x1)?P(x2∣x1)?P(x3∣x1,x2)...P(xn∣x1,x2,,,xn?1)P(x_1,x_2...x_n)= P(x_1)*P(x_2|x_1)*P(x_3|x_1,x_2)...P(x_n|x_1,x_2,,,x_{n-1})P(x1?,x2?...xn?)=P(x1?)?P(x2?∣x1?)?P(x3?∣x1?,x2?)...P(xn?∣x1?,x2?,,,xn?1?)
各種算法,模型就是去無限逼近右邊式子中的條件概率 。
使用語言模型做預訓練,訓練得到的參數,可以用于其他任務中。
1.3 ELMo
預訓練在nlp中正式提出是在ELMo中。
ELMo是一個三層的網絡結構:
- 字符CNN
- 一個正向語言模型
- 一個逆向語言模型
訓練了一個正向和逆向的語言模型。
逆向語言模型是在計算:P(x1,x2,...xn)=P(xn)P(xn?1∣xn)P(xn?2∣xn,xn?1)...P(x1)P(x_1,x_2,...x_n)= P(x_n)P(x_{n-1}|x_n)P(x_{n-2}|x_n,x_{n-1})...P(x_1)P(x1?,x2?,...xn?)=P(xn?)P(xn?1?∣xn?)P(xn?2?∣xn?,xn?1?)...P(x1?)
1.4 GPT
GPT是使用transformer替換了ELMo中的LSTM。
訓練了一個從左到右的語言模型任務。
GPT2和GPT3是使用了更多的參數,有些情況下layer normal放在了Attention之前。得到了更好的效果。
2 BERT
2.1 BERT特點
BERT: Bidirectional Encoder Representations from Transformers
bert相比較其他框架的優點是:
1 與GPT相比,GPT也使用了transformer,但GPT只訓練了一個從左到右的模型。
2 與ELMo相比,ELMo使用的是LSTM,訓練的是兩個獨立的從左到右,和從右到左兩個模型。
3 bert是在無標注的數據集上做預訓練,在每一層都包含左右的context信息。
4 應用于其他任務的時候只需要再加一層輸出層即可。
5 應用于其他任務,不需要修改bert的架構。
2.2架構
橫線表示了堆疊起來的transformer模型。
bert模型輸入的是兩個句子的拼接或者一個單獨的句子。例如[CLS] my do is cute[SEP] he likes play ##ing[SEP]
bert模型的輸入= token embedding + position embedding + segment embedding
token embedding:是經過wordpiece之后的一個一個token。
position embedding :表示不同的位置,要求就是不同位置用不同的數值表示即可。
segment embedding:表示兩個句子。例如第一個句子用EAE_AEA?表示,第二個句子用EBE_BEB?表示。
bert模型的輸出:表示[CLS]的隱狀態C,表示第i個token隱狀態的YiY_iYi?。
bert有兩個版本:
Bert-base:L=12(有12層),H=768(隱狀態的大小是768),A=12(multi self Attention的head有12個)
Bert-base:L=24(有24層),H=1024(隱狀態的大小是1024),A=16(multi self Attention的head有16個)
2.3 預訓練任務
預訓練任務有2個:masked language model 和 next sentence prediction。
預訓練的數據集是BooksCorpus (800M words) 和 English Wikipedia (2,500M words)。
2.3.1 masked language model
bert想要訓練一個深度的雙向語言模型。所以設計了MLM任務。
不要預測下一個詞,而是預測上下文。
問題:如何防止模型拷貝答案?
方法:masked。將數據集中15%的詞標記為mask,模型去預測這些被mask的詞。這樣做的好處是在預測一個詞的時候會同時用到這個詞的左右的信息。這種方式可以更好的建模詞左右的上下文信息。
問題:預訓練階段能看到mask標記,但是調優階段是看不到這個標記的,這在一定程度上影響了準確率。
方法:不要總是標記為mask。在確定第i個位置是mask之后。1. 80%的概率標記為mask,2. 10%的概率保持不變,3. 10%的概率改為其他字符。
如果只有mask,對于其他詞(被masked的詞)不能學習到好的表達。
如果只有mask和其他字符,那就學不到正確的詞。
如果只用mask和正確的詞,那模型可能會只記住單詞,不學習。
模型輸出:被mask位置的詞的上下文詞向量,以及[CLS]位置的句子表示。
2.3.2 next sentence prediction
輸入是句子對(A,B)
生成句子對A和B,50%的情況B是A真正的下一句,50%是隨機選擇的一個句子。
ps:后續實際中證明這個任務對下游任務并沒有幫助。沒有它,下游任務效果可能會更好。但是這個任務對于句子對分類任務是有幫助的。
在RoBera中拋棄了這個任務。
2.3.4 Subword
傳統詞表示不能解決未看到的詞。
bert中使用的token方式是subword,使用BPE(Byte-Pair Encoding)的方式生成token。
e.g. subword = sub + word
學習方式:Byte Pair Encoding(BPE)
參考鏈接:https://zhuanlan.zhihu.com/p/86965595
https://huggingface.co/transformers/tokenizer_summary.html
在中文中直接以字進行訓練就可以。
2.4 微調fine-tuning
nlp中所有的任務都是分類任務。
將bert模型應用于單個句子的分類中,使用CLS的隱狀態參與分類得到分類標簽。
3后記
今天早上一直不明白怎么用bert的輸出作為下游的起始。一直在想它做預測的只是被mask的部分,那學到的詞向量只是部分詞向量呢?而且作為詞向量應該是前面一些層的參數,不會是最后輸出層。
后來聽老師講預訓練模型訓練才發現自己的思維被前面的詞向量模型固定了。
預先訓練模型,再使用有兩種策略:feature-based 和 fine-tuning.
feature-based :skip-gram cbow ELmo都是這種策略。在一個語言模型的任務上訓練,得到詞向量表示。詞向量用于下游任務。
fine-tuning: GPT、bert是這種策略。這種策略是預先訓練一個模型。在下游任務的時候,在模型上面繼續加層,實現目標。這個模型的整體架構不發生大的變化。在下游任務訓練的時候,所有的參數都以預訓練的的參數為基準。這就類似于CNN在圖像分類上的預訓練-微調模式一樣。
在下游任務中可以固定前面的模型參數不變,也可以前面部分的參數一起參與訓練。這個看效果而定。
所以bert被下游使用的是整個網絡結構,以及所有結構中的參數。當然參與變化層運算的是最后一層的輸出。
這類似于使用CNN的GoogleNet預訓練,訓練自己的圖像分類器。只是修改最后一層輸出分類的個數,就變成自己的模型了。
總結
- 上一篇: iOS内存管理(ARC,MRC)
- 下一篇: 腾讯、阿里、搜狐、人人、去哪儿、迅雷等互