本篇文章是在之前文章《【NLP】BERT模型解析記錄》的基礎(chǔ)上,主要記錄BERT模型的相關(guān)細(xì)節(jié)問題,并以QA形式表述。
文中會(huì)標(biāo)注相關(guān)出處,如遇未注明或出現(xiàn)錯(cuò)誤,請(qǐng)告知。如遇侵權(quán),請(qǐng)告知?jiǎng)h除~
1.講講bert的結(jié)構(gòu)
bert結(jié)構(gòu)大體上可分為輸入、N層transformer的encoder和輸出三部分組成。
輸入由token embedding、segment embedding和position embedding三部分相加組成;
N層transformer的encoder,在bert_base中N=12,bert_large中N=24
輸出有model.get_sequence_out()和model.get_pooling_out()兩種輸出,其shape分別為[batch_size, seq_length, hidden_size]和[batch_size, hidden_size]。
model.get_sequence_out()輸出主要用于特征提取再處理的序列任務(wù),而model.get_pooling_out()輸出可直接接softmax進(jìn)行分類(當(dāng)然需要外加一層dense層將hidden_size轉(zhuǎn)換為num_tag)。
2.為什么BERT選擇mask掉15%這個(gè)比例的詞,可以是其他的比例嗎?
原文鏈接:https://zhuanlan.zhihu.com/p/132554155
BERT采用的Masked LM,會(huì)選取語料中所有詞的15%進(jìn)行隨機(jī)mask,論文中表示是受到完形填空任務(wù)的啟發(fā),但其實(shí)與CBOW也有異曲同工之妙。從CBOW的角度,這里15%有一個(gè)比較好的解釋是:在一個(gè)大小為100/15
7的窗口中隨機(jī)選一個(gè)詞,類似CBOW中滑動(dòng)窗口的中心詞,區(qū)別是這里的滑動(dòng)窗口是非重疊的。那從CBOW的滑動(dòng)窗口角度,10%~20%都是還ok的比例。
3.使用BERT預(yù)訓(xùn)練模型為什么最多只能輸入512個(gè)詞,最多只能兩個(gè)句子合成一句?
原文鏈接:https://zhuanlan.zhihu.com/p/132554155
這是Google BERT預(yù)訓(xùn)練模型初始設(shè)置的原因,前者對(duì)應(yīng)Position Embeddings,后者對(duì)應(yīng)Segment Embeddings
在BERT中,Token,Position,Segment Embeddings 都是通過學(xué)習(xí)來得到的,pytorch代碼中它們是這樣的self.word_embeddings = Embedding(config.vocab_size, config.hidden_size) self.position_embeddings = Embedding(config.max_position_embeddings, > config.hidden_size) self.token_type_embeddings = Embedding(config.type_vocab_size, config.hidden_size)上述BERT pytorch代碼來自:https://github.com/xieyufei1993/Bert-Pytorch-Chinese-TextClassification,結(jié)構(gòu)層次非常清晰。
而在BERT config中"max_position_embeddings": 512 "type_vocab_size": 2因此,在直接使用Google 的BERT預(yù)訓(xùn)練模型時(shí),輸入最多512個(gè)詞(還要除掉[CLS]> 和[SEP]),最多兩個(gè)句子合成一句。這之外的詞和句子會(huì)沒有對(duì)應(yīng)的embedding。
當(dāng)然,如果有足夠的硬件資源自己重新訓(xùn)練BERT,可以更改 BERT config,設(shè)置更大max_position_embeddings 和 type_vocab_size值去滿足自己的需求。
4.為什么BERT在第一句前會(huì)加一個(gè)[CLS]標(biāo)志?
原文鏈接:https://zhuanlan.zhihu.com/p/132554155
BERT在第一句前會(huì)加一個(gè)[CLS]標(biāo)志,最后一層該位對(duì)應(yīng)向量可以作為整句話的語義表示,從而用于下游的分類任務(wù)等。為什么選它呢,因?yàn)榕c文本中已有的其它詞相比,這個(gè)無明顯語義信息的符號(hào)會(huì)更“公平”地融合文本中各個(gè)詞的語義信息,從而更好的表示整句話的語義。
具體來說,self-attention是用文本中的其它詞來增強(qiáng)目標(biāo)詞的語義表示,但是目標(biāo)詞本身的語義還是會(huì)占主要部分的,因此,經(jīng)過BERT的12層,每次詞的embedding融合了所有詞的信息,可以去更好的表示自己的語義。
而[CLS]位本身沒有語義,經(jīng)過12層,得到的是attention后所有詞的加權(quán)平均,相比其他正常詞,可以更好的表征句子語義。
當(dāng)然,也可以通過對(duì)最后一層所有詞的embedding做pooling去表征句子語義。
5.BERT非線性的來源在哪里?
原文鏈接:https://zhuanlan.zhihu.com/p/132554155
前饋層的gelu激活函數(shù)和self-attention,self-attention是非線性的。
6.BERT的三個(gè)Embedding直接相加會(huì)對(duì)語義有影響嗎?
原文鏈接:https://zhuanlan.zhihu.com/p/132554155
這是一個(gè)非常有意思的問題,蘇劍林老師也給出了回答,真的很妙?。?br> Embedding的數(shù)學(xué)本質(zhì),就是以one hot為輸入的單層全連接。
也就是說,世界上本沒什么Embedding,有的只是one hot。在這里想用一個(gè)例子再嘗試解釋一下:
假設(shè) token Embedding 矩陣維度是 [4,768];position Embedding 矩陣維度是 [3,768];segment Embedding 矩陣維度是 [2,768]。
對(duì)于一個(gè)字,假設(shè)它的 token one-hot 是[1,0,0,0];它的 position one-hot 是[1,0,0];它的 segment one-hot 是[1,0]。那這個(gè)字最后的 word Embedding,就是上面三種 Embedding 的加和。
如此得到的 word Embedding,和concat后的特征:[1,0,0,0,1,0,0,1,0],再過維度為 [4+3+2,768] = [9, 768] 的全連接層,得到的向量其實(shí)就是一樣的。再換一個(gè)角度理解:
直接將三個(gè)one-hot 特征 concat 起來得到的 [1,0,0,0,1,0,0,1,0] 不再是one-hot了,但可以把它映射到三個(gè)one-hot 組成的特征空間,空間維度是 432=24 ,那在新的特征空間,這個(gè)字的one-hot就是[1,0,0,0,0...] (23個(gè)0)。此時(shí),Embedding 矩陣維度就是 [24,768],最后得到的 word Embedding 依然是和上面的等效,但是三個(gè)小Embedding 矩陣的大小會(huì)遠(yuǎn)小于新特征空間對(duì)應(yīng)的Embedding 矩陣大小。
當(dāng)然,在相同初始化方法前提下,兩種方式得到的 word Embedding 可能方差會(huì)有差別,但是,BERT還有Layer Norm,會(huì)把 Embedding 結(jié)果統(tǒng)一到相同的分布。
BERT的三個(gè)Embedding相加,本質(zhì)可以看作一個(gè)特征的融合,強(qiáng)大如 BERT 應(yīng)該可以學(xué)到融合后特征的語義信息的。
7.什么任務(wù)適合bert,什么任務(wù)不適合?
bert適合于自然語言理解(Natural language Understanding, NLU)類任務(wù),如文本分類、信息抽取等;
bert不適合于自然語言生成(Natural language Generation, NLG)類任務(wù)。
因?yàn)閎ert采用的是雙向的語言模型,除了被mask的詞語外,該詞語前后的詞語都可以看到。
而NLG任務(wù)的目標(biāo)是在已知當(dāng)前詞與之前詞語的情況下,預(yù)測出下一個(gè)詞語,直至所有詞語預(yù)測完成。
8.為什么 BERT 比 ELMo 效果好?
原文鏈接:https://cloud.tencent.com/developer/article/1687276
從網(wǎng)絡(luò)結(jié)構(gòu)以及最后的實(shí)驗(yàn)效果來看,BERT 比 ELMo 效果好主要集中在以下幾點(diǎn)原因:
- LSTM抽取特征的能力遠(yuǎn)弱于Transformer
- 拼接方式雙向融合的特征融合能力偏弱(沒有具體實(shí)驗(yàn)驗(yàn)證,只是推測)
- 其實(shí)還有一點(diǎn),BERT 的訓(xùn)練數(shù)據(jù)以及模型參數(shù)均多余 ELMo,這也是比較重要的一點(diǎn)。
9.ELMo 和 BERT 的區(qū)別是什么?
原文鏈接:https://cloud.tencent.com/developer/article/1687276
ELMo 模型是通過語言模型任務(wù)得到句子中單詞的 embedding 表示,以此作為補(bǔ)充的新特征給下游任務(wù)使用。因?yàn)?ELMO 給下游提供的是每個(gè)單詞的特征形式,所以這一類預(yù)訓(xùn)練的方法被稱為“Feature-based Pre-Training”。
而 BERT 模型是“基于 Fine-tuning 的模式”,這種做法和圖像領(lǐng)域基于 Fine-tuning 的方式基本一致,下游任務(wù)需要將模型改造成 BERT 模型,才可利用 BERT 模型預(yù)訓(xùn)練好的參數(shù)。