关于Transformer和BERT,在面试中有哪些细节问题?
?PaperWeekly 原創(chuàng) ·?作者|海晨威
學校|同濟大學碩士生
研究方向|自然語言處理
隨著 NLP 的不斷發(fā)展,對 Transformer 和 BERT 相關知識的研 (mian) 究 (shi) 應 (ti) 用 (wen),也越來越細節(jié),下面嘗試用 QA 的形式深入不淺出 Transformer 和 BERT。
Transformer 在哪里做了權重共享,為什么可以做權重共享?
BERT 的三個 Embedding 直接相加會對語義有影響嗎?
在 BERT 中,token 分 3 種情況做 mask,分別的作用是什么?
為什么 BERT 選擇 mask 掉 15% 這個比例的詞,可以是其他的比例嗎?
為什么 BERT 在第一句前會加一個 [CLS] 標志?
使用 BERT 預訓練模型為什么最多只能輸入 512 個詞,最多只能兩個句子合成一句?
1. Transformer 在哪里做了權重共享,為什么可以做權重共享?
Transformer 在兩個地方進行了權重共享:
1. Encoder 和 Decoder 間的 Embedding 層權重共享;
2. Decoder 中 Embedding 層和 Full Connect(FC)層權重共享。
對于第一點,《Attention is all you need》中 Transformer 被應用在機器翻譯任務中,源語言和目標語言是不一樣的,但它們可以共用一張大詞表,對于兩種語言中共同出現(xiàn)的詞(比如:數(shù)字,標點等等)可以得到更好的表示,而且對于 Encoder 和 Decoder,嵌入時都只有對應語言的 embedding 會被激活,因此是可以共用一張詞表做權重共享的。
論文中,Transformer 詞表用了 bpe 來處理,所以最小的單元是 subword。英語和德語同屬日耳曼語族,有很多相同的 subword,可以共享類似的語義。而像中英這樣相差較大的語系,語義共享作用可能不會很大 [1]。
但是,共用詞表會使得詞表數(shù)量增大,增加 softmax 的計算時間,因此實際使用中是否共享可能要根據(jù)情況權衡。
對于第二點,Embedding 層可以說是通過 onehot 去取到對應的 embedding 向量,FC 層可以說是相反的,通過向量(定義為 w)去得到它可能是某個詞的 softmax 概率,取概率最大(貪婪情況下)的作為預測值。
那哪一個會是概率最大的呢?在 FC 層的每一行量級相同的前提下,理論上和 w 相同的那一行對應的點積和 softmax 概率會是最大的(可類比本文問題 1)。
因此,Embedding 層和 FC 層權重共享,Embedding 層中和向量 w 最接近的那一行對應的詞,會獲得更大的預測概率。實際上,Embedding 層和 FC 層有點像互為逆過程。
通過這樣的權重共享可以減少參數(shù)的數(shù)量,加快收斂。
但開始我有一個困惑是:Embedding 層參數(shù)維度是:(v,d),FC 層參數(shù)維度是:(d,v),可以直接共享嘛,還是要轉置?其中 v 是詞表大小,d 是 embedding 維度。
查看 pytorch 源碼發(fā)現(xiàn)真的可以直接共享:
fc?=?nn.Linear(d,?v,?bias=False)?#?Decoder?FC層定義,無?biasweight?=?Parameter(torch.Tensor(out_features,?in_features))???#?nn.Linear?的權重部分定義Linear 層的權重定義中,是按照(out_features, in_features)順序來的,實際計算會先將 weight 轉置在乘以輸入矩陣。所以 FC 層 對應的 Linear 權重維度也是? (v,d),可以直接共享。
2. BERT 的三個 Embedding 直接相加會對語義有影響嗎?
對于這個非常有意思的問題,蘇劍林老師給出的回答 [2],真的很妙:
Embedding 的數(shù)學本質(zhì),就是以 one hot 為輸入的單層全連接。
也就是說,世界上本沒什么 Embedding,有的只是 one hot。
現(xiàn)在我們將 token, position, segment 三者都用 one hot 表示,然后 concat 起來,然后才去過一個單層全連接,等價的效果就是三個 Embedding 相加。
因此,BERT 的三個 Embedding 相加,其實可以理解為 token, position, segment 三個用 one hot 表示的特征的 concat,而特征的 concat 在深度學習領域是很常規(guī)的操作了。
用一個例子理解一下:
假設 token Embedding 矩陣維度是 [4,768];position Embedding 矩陣維度是 [3,768];segment Embedding 矩陣維度是 [2,768]。
對于一個字,假設它的 token one-hot 是 [1,0,0,0];它的 position one-hot 是 [1,0,0];它的 segment one-hot 是 [1,0]。
那這個字最后的 word Embedding,就是上面三種 Embedding 的加和。
如此得到的 word Embedding,和 concat 后的特征:[1,0,0,0,1,0,0,1,0],再經(jīng)過維度為 [4+3+2,768] = [9, 768] 的 Embedding 矩陣,得到的 word Embedding 其實就是一樣的。
Embedding 就是以 one hot 為輸入的單層全連接。
再換一個角度理解:
直接將三個 one-hot 特征 concat 起來得到的 [1,0,0,0,1,0,0,1,0] 不再是 one-hot 了,但可以把它映射到三個 one-hot 組成的特征空間,空間維度是 4*3*2=24 ,那在新的特征空間,這個字的 one-hot 就是 [1,0,0,0,0...] (23個0)。
此時,Embedding 矩陣維度就是 [24,768],最后得到的 word Embedding 依然是和上面的等效,但是三個小 Embedding 矩陣的大小會遠小于新特征空間對應的 Embedding 矩陣大小。
BERT 的三個 Embedding 相加,本質(zhì)可以看作一個特征的融合,強大如 BERT 可以學到融合后特征的語義信息的。
3. 在 BERT 中,token 分 3 種情況 mask,分別的作用是什么?
在 BERT 的 Masked LM 訓練任務中, 會用 [MASK] token 去替換語料中 15% 的詞,然后在最后一層預測。但是下游任務中不會出現(xiàn) [MASK] token,導致預訓練和 fine-tune 出現(xiàn)了不一致,為了減弱不一致性給模型帶來的影響,在這被替換的 15% 語料中:
80% 的 tokens 會被替換為 [MASK] token
10% 的 tokens 會稱替換為隨機的 token
10% 的 tokens 會保持不變但需要被預測
作者在原文中給出了直觀的解釋:
The Transformer encoder does not know which words it will be asked to predict or which have been replaced by random words, so it is forced to keep a distributional contextual representation of every input token.
此外在 medium [3] 上,作者也從直覺上解釋了這樣做的可行性:
If we used [MASK] 100% of the time the model wouldn’t necessarily produce good token representations for non-masked words. The non-masked tokens were still used for context, but the model was optimized for predicting masked words. If we used [MASK] 90% of the time and random words 10% of the time, this would teach the model that the observed word is never correct. If we used [MASK] 90% of the time and kept the same word 10% of the time, then the model could just trivially copy the non-contextual embedding.
上面第一點中的替換,是 Masked LM 中的主要部分,可以在不泄露 label 的情況下融合真雙向語義信息;
第二點的隨機替換,因為需要在最后一層隨機替換的這個 token 位去預測它真實的詞,而模型并不知道這個 token 位是被隨機替換的,就迫使模型盡量在每一個詞上都學習到一個全局語境下的表征,因而也能夠讓 BERT 獲得更好的語境相關的詞向量(這正是解決一詞多義的最重要特性);
第三點的保持不變,也就是真的有 10% 的情況下是泄密的(占所有詞的比例為15% * 10% = 1.5%),這樣能夠給模型一定的 bias ,相當于是額外的獎勵,將模型對于詞的表征能夠拉向詞的真實表征(此時輸入層是待預測詞的真實 embedding,在輸出層中的該詞位置得到的embedding,是經(jīng)過層層 Self-attention 后得到的,這部分 embedding 里多少依然保留有部分輸入 embedding 的信息,而這部分就是通過輸入一定比例的真實詞所帶來的額外獎勵,最終會使得模型的輸出向量朝輸入層的真實 embedding 有一個偏移)。
而如果全用 mask 的話,模型只需要保證輸出層的分類準確,對于輸出層的向量表征并不關心,因此可能會導致最終的向量輸出效果并不好?[4]。
4. 為什么 BERT 選擇 mask 掉 15% 這個比例的詞,可以是其他的比例嗎?
BERT 采用的 Masked LM,會選取語料中所有詞的 15% 進行隨機 mask,論文中表示是受到完形填空任務的啟發(fā),但其實與 CBOW 也有異曲同工之妙。
從 CBOW 的角度,這里 有一個比較好的解釋是:在一個大小為 的窗口中隨機選一個詞,類似 CBOW 中滑動窗口的中心詞,區(qū)別是這里的滑動窗口是非重疊的。
那從 CBOW 的滑動窗口角度,10%~20% 都是還 ok 的比例。
上述非官方解釋,是來自我的一位朋友提供的一個理解切入的角度,供參考。
5. 為什么 BERT 在第一句前會加一個 [CLS] 標志?
BERT 在第一句前會加一個 [CLS] 標志,最后一層該位對應向量可以作為整句話的語義表示,從而用于下游的分類任務等。
為什么選它呢,因為與文本中已有的其它詞相比,這個無明顯語義信息的符號會更“公平”地融合文本中各個詞的語義信息,從而更好的表示整句話的語義。
這里補充一下 bert 的輸出,有兩種:
一種是 get_pooled_out(),就是上述 [CLS] 的表示,輸出 shape 是 [batch size,hidden size]。
一種是 get_sequence_out(),獲取的是整個句子每一個 token 的向量表示,輸出 shape 是 [batch_size, seq_length, hidden_size],這里也包括 [CLS],因此在做 token 級別的任務時要注意它。
6. 使用 BERT 預訓練模型為什么最多只能輸入 512 個詞,最多只能兩個句子合成一句?
這是 BERT 的初始設置的原因,前者對應 Position Embeddings,后者對應 Segment Embeddings
在 BERT 中,Token,Position,Segment Embeddings 都是通過學習來得到的,pytorch 代碼 [5] 中它們是這樣的:
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 config 中:
"max_position_embeddings":?512 "type_vocab_size":?2因此,在直接使用 Google 的 BERT 預訓練模型時,輸入最多 512 個詞(還要除掉 [CLS] 和 [SEP]),最多兩個句子合成一句。這之外的詞和句子會沒有對應的 embedding。
當然,如果有足夠的硬件資源自己重新訓練 BERT,可以更改 BERT config,設置更大 max_position_embeddings 和 type_vocab_size 值去滿足自己的需求。
參考文獻
[1] https://www.zhihu.com/question/333419099/answer/743341017
[2] https://www.zhihu.com/question/374835153
[3] https://towardsdatascience.com/bert-explained-state-of-the-art-language-model-for-nlp-f8b21a9b6270
[4] https://zhuanlan.zhihu.com/p/50443871
[5] https://github.com/hichenway/CodeShare/tree/master/bert_pytorch_source_code
更多閱讀
#投 稿?通 道#
?讓你的論文被更多人看到?
如何才能讓更多的優(yōu)質(zhì)內(nèi)容以更短路徑到達讀者群體,縮短讀者尋找優(yōu)質(zhì)內(nèi)容的成本呢?答案就是:你不認識的人。
總有一些你不認識的人,知道你想知道的東西。PaperWeekly 或許可以成為一座橋梁,促使不同背景、不同方向的學者和學術靈感相互碰撞,迸發(fā)出更多的可能性。?
PaperWeekly 鼓勵高校實驗室或個人,在我們的平臺上分享各類優(yōu)質(zhì)內(nèi)容,可以是最新論文解讀,也可以是學習心得或技術干貨。我們的目的只有一個,讓知識真正流動起來。
?????來稿標準:
? 稿件確系個人原創(chuàng)作品,來稿需注明作者個人信息(姓名+學校/工作單位+學歷/職位+研究方向)?
? 如果文章并非首發(fā),請在投稿時提醒并附上所有已發(fā)布鏈接?
? PaperWeekly 默認每篇文章都是首發(fā),均會添加“原創(chuàng)”標志
?????投稿郵箱:
? 投稿郵箱:hr@paperweekly.site?
? 所有文章配圖,請單獨在附件中發(fā)送?
? 請留下即時聯(lián)系方式(微信或手機),以便我們在編輯發(fā)布時和作者溝通
????
現(xiàn)在,在「知乎」也能找到我們了
進入知乎首頁搜索「PaperWeekly」
點擊「關注」訂閱我們的專欄吧
關于PaperWeekly
PaperWeekly 是一個推薦、解讀、討論、報道人工智能前沿論文成果的學術平臺。如果你研究或從事 AI 領域,歡迎在公眾號后臺點擊「交流群」,小助手將把你帶入 PaperWeekly 的交流群里。
總結
以上是生活随笔為你收集整理的关于Transformer和BERT,在面试中有哪些细节问题?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 抗击疫情为什么是人民战争
- 下一篇: NeurIPS 2020 | 自步对比学