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