百面Bert
Q1. Bert與Transformer有什么關系
Bert是基于Transformer架構中的Encoder進行搭建的。
具體來說,Bert的核心組件是幾個Encoder layer的堆疊。Encoder layer中,也是兩個子層,分別是注意力層和intermediate層(Bert中的叫法,實際就是前饋層)。
注意力層中,有一點不同的是,當Q和K計算了相似度之后,要和一個可訓練的position embedding相加。Transformer中的Position embedding是不可訓練的。這也導致Bert處理的序列長度是有限的,不能超過訓練時的最大長度。
在intermediate層中,是一個線性層+激活函數+輸出層。這里的激活函數是GELU激活函數,?斯誤差線性單元激活函數。
Q2. Bert采用了什么預訓練+微調的范式
從2018年的ELMo開始,預訓練+微調的范式開始走入NLP領域。ELMo是基于雙向的LSTM,在訓練數據進行預訓練,在下游任務進行微調。
Bert也采用了該范式,一是將模型結構換為了Transformer,二是采用了新的預訓練任務。 因為傳統的LM預訓練,是在無監督數據上進行,即對一段無標注的文本,采用上文預測下文的方式,這是單向建模。雖然有Position embedding,但是模型仍然不能擬合雙向的語義關系。
- MLM(Masked Language Modeling): 隨機對句子中15%的token進行遮蔽,在訓練時預測這些被遮蔽的token,即“完形填空”,這樣模型就可以學習到雙向的語義。
但是這里有一個問題,Bert在微調時,并沒有Mask過程,因此預訓練和微調的不一致會影響模型的表現。因此15%的token中,每個token有80%進行遮蔽,10%被隨機替換為其他token,10%保持不變。這里保持不變就意味和下游微調任務對齊,隨機替換則是希望模型不只關注被預測的token,也要關注其他token,進而對整個句子進行建模。 - NSP(Next Sentence Prediction):下一個句子預測,希望模型在句子級別進行建模,完成問答匹配、自然語言推理等任務。核心任務是判斷一個句子對是否是連續的上下文。這樣的訓練語料可以從文本中摘取,并通過隨機替換的方式獲取負樣本。
Input: “I love you”
“Because you are beauty”
Output:“1”
Q3. 下游任務微調
所謂微調,其實和訓練時更新模型參數的策略?致,只不過在特定的任務、更少的訓練數據、更?。
的 batch_size 上進?訓練,更新參數的幅度更?。
BERT 設計了更通?的輸?和輸出層來適配多任務下的遷移學習。對每?個輸?的?本序列,BERT 會
在其?部加??個特殊 token 。在后續編碼中,該 token 代表的即是整句的狀態,也就是句級的語義表
征。在進? NSP 預訓練時,就使?了該 token 對應的特征向量來作為最后分類器的輸?。
Q4. 預訓練任務都有效嗎
Bert的變體, 由Facebook開發的RoBERTa,對此進行實驗,發現NSP任務并不一定有效,因為其太簡單。甚至會影響模型的性能。因此后續去掉了該任務。
Bert的變體,ALBERT,也認為NSP過于簡單,不過并沒有直接去掉該任務,而是對其進行優化。正樣本為連續的兩個句子,組成一個句子對。負樣本是將正樣本中的兩個句子先后順序顛倒。
輸?:
Sentence A:I love you.
Sentence B: Because you are wonderful.
輸出:
1(正樣本)
輸?:
Sentence A:Because you are wonderful.
Sentence B: I love you.
輸出:
0(負樣本)
Q5. Mask具體是怎么做的
Bert中,是在數據預處理階段進行Mask,也就是在訓練時,Masked的位置已經確定,因為Bert訓練了40epoch,其每10個epoch使用一組masked的結果,這樣可以使訓練數據更豐富。
在后續的變體中,廣泛采用了訓練時Mask的做法,實驗表明,這樣做會帶來微弱的提升,但是因為這樣的工程實驗更簡潔。
Q6. Tokenizer編碼策略
RoBERTa、BERT 和 Transformer ?樣,都使?了 BPE 作為 Tokenizer 的編碼策略。BPE,即 Byte Pair
Encoding,字節對編碼,是指以?詞對作為分詞的單位。例如,對“Hello World”這句話,可能會切分為“Hel,lo,
Wor,ld”四個?詞對。?對于以字為基本單位的中?,?般會按照 字節編碼進?切分。例如,在 UTF-8 編碼中,
“我”會被編碼為“E68891”,那么在 BPE 中可能就會切分成“E68”,“891”兩個字詞對。
一般來說,詞表越大,性能越好,但是這也會帶來embedding參數的增加,因為embedding表的shape為(vocab_size,hidden_size)