Bert模型詳解


BERT 模型詳解

本篇文章共 15326 個詞,一個字一個字手碼的不容易,轉載請標明出處:
BERT 模型詳解 - 二十三歲的有德

一、BERT 引入

BERT 在自然語言處理(NLP)領域刷新了 11 個任務的記錄,萬眾矚目,成為異常火熱的一個預訓練語言模型。

今天我們就來詳細講解下 BERT 這個預訓練語言模型,雖然 BERT 刷新了各個任務的記錄,但是 BERT 並不是一個具有極大創新的算法,更多的是一個集大成者,把 BERT 之前各個語言模型的優點集於一身,並作出了適當的改進,而擁有了如今無與倫比的能力。

BERT 既然是集大成者,那么集了哪些大成呢?

  1. BERT 作為一個預訓練語言模型,它的預訓練思想借鑒了圖像領域中的預訓練的思想;
  2. 作者說的是借鑒了完形填空任務的思想(雙向編碼),但我感覺應該也借鑒了 Word2Vec 的 CBOW 的思想,因為兩者本質上是相同的;
  3. 沒有使用傳統的類 RNN 模型作為特征提取器,而是使用了最近火熱的 Transformer 作為特征提取器,而 Transformer 又使用了 Attention 機制作為特征提取器,更是火上澆油
  4. 真要說創新,也許就是在 CBOW 的思想之上,添加了語言掩碼模型(MLM),減少了訓練階段和推理階段(測試階段)的不匹配,避免了過擬合;
  5. 由於單詞預測粒度的訓練到不了句子關系這個層級,為了學會捕捉句子之間的語義聯系,BERT 采用了下句預測(NSP )作為無監督預訓練的一部分,這也算是一個小小的創新吧。

既然是集大成者,那么我們只要把上述五點大成一一解釋清楚,相信再帶你看 BERT 時,你一定會豁然開朗:“BERT 不過如此”。

二、圖像領域的預訓練

在敘述圖像領域的預訓練之前,我們通過下圖來看看 CNN 是如何對圖片做特征提取的:一張圖片放入到 CNN 中,由淺層到深層

  • 淺層:淺層提取的特征對於 “人臉、汽車、大象、椅子” 這四個任務而言,非常的相似,都是 “橫豎撇捺” 之類的
  • 深層:深層提取的特征對於 “人臉、汽車、大象、椅子” 這四個任務而言,都是接近於任務本身,例如 “人臉” 任務的 CNN 深層提取的特征更接近於人臉的輪廓

通過上述分析,也就是說,CNN 淺層提取的特征對於各個任務而言都是通用的。

圖 1 - CNN 提取圖片特征

聰明的讀者應該想到了,什么是 “預訓練”,但很懵懵懂懂,下面我們來詳細解釋。

圖 2 - 預訓練在圖像領域的應用

假設我們擁有兩個盡量相似的任務 A 和 B(可以都為圖像處理任務),任務 A 是我們目標任務,任務 B 是可以提前訓練好的一個任務:

  1. 我們訓練任務 B 得到一個 CNN 模型 B
  2. 由於 CNN 淺層特征的通用性,我們可以做如下兩種處理:
    1. fine-tuning(微調):淺層參數使用模型 B 的參數,高層參數隨機初始化,利用任務 A 訓練模型 B,淺層參數隨着變化
    2. frozen(凍結):淺層參數使用模型 B 的參數,高層參數隨機初始化,利用任務 A 訓練模型 B,淺層參數一直不變

上述兩個步驟即是預訓練的思想,那么預訓練有什么好處呢?

  1. 如果我們還有相似任務 C,可以利用模型 B 的參數直接啟動任務的訓練,進而可以加快任務 C 訓練的收斂速度
  2. 如果我們還有一個相似任務但數據量很小的任務 D,由於數據量小的任務很難訓練出一個深度神經網絡模型,然而利用預訓練的思想,小數據量的任務也可以利用深度神經網絡模型解決

三、詞向量 Word Embedding

在講解 CBOW 思想之前,我們不得不講解下詞向量的發展史,這算是預訓練語言模型的始祖,語言模型的預訓練的思想最早來源於此,並且 CBOW 模型就是為了生成單詞的詞向量應運而生。

3.1 One-hot 編碼

One-hot 編碼相信大家都很熟悉了,一個很簡單的小知識,讓計算機認識現實世界中的單詞。

由於計算機並不認識單詞 “time、fruit……”,為此,人們構建一個詞典 \(V\) ,如下圖所示詞典包含 8 個單詞,對於詞典中的每個單詞,都有之對應的 \(|V|\)(詞典大小的)維度的向量表示,如下圖的 “time” 對應的向量為 8 維的 “1000 0000”。

圖 3 - 詞的 One-hot 編碼

One-hot 編碼雖然解決了計算機不認識單詞的這一缺陷,但是 One-hot 編碼本身也是有問題的,對於上圖 “fruit” 和 “banana” 的 One-hot 編碼,可以通過余弦相似度計算兩者的相似性,可以發現結果為 0,也就是兩者毫不相關,然而實際上兩者是相關的,由此,詞向量應運而生。

3.2 神經網絡語言模型 - 詞向量的起源

圖 4 - 神經網絡語言模型架構

現在讓我們看看詞向量到底是個什么玩意兒,對於上述的 3 層神經網絡語言模型(NNLM),它的學習任務是輸入某個句中單詞 \(w_t = banana\)​ 前的 \(t-1\)​ 個單詞,要求網絡正確預測單詞 “banana”,即最大化:

\[P(w_t=bert|w_1,w_2,\cdots,w_{t-1};\theta) \]

其中 \(\theta\)​ 是 NNLM 的參數。

首先輸入前 \(t-1\)​ 個單詞的 One-hot 編碼

  1. 單詞的 One-hot 編碼經過第一層,輸入層,One-hot 編碼左乘矩陣 Q 得到詞向量 \(C(w_i)\)​​​

    1. 矩陣 Q 是一個隨機初始化的參數矩陣
  2. 詞向量 \(C(w_i)\) 經過第二層,隱層(相當於全連接層),隱層的輸出為 \(\tanh(Wx+d)\),其中 \(x\) 為輸入的詞向量,\(W\) 為權重矩陣,\(d\) 為偏置,\(\tanh\) 為激活函數。

    1. 假設詞典大小為 8,輸出為一個 8 維的向量 [11, 22, 55, 44, 87, 84, 88]
  3. 第二層輸出的向量經過第三層,輸出層,經過 Softmax 函數歸一化。

    1. 假設輸入為一個輸出為一個 8 維的向量 [11, 22, 55, 44, 87, 84, 88],則該層輸出為 [0.000, 0.000, 0.000, 0.000, 0.265, 0.013, 0.721],對應圖三,則該層輸出的對應的詞為 “banana”

    2. y = torch.FloatTensor([11, 22, 55, 44, 87, 84, 88])
      print(functional.softmax(y, dim=0))
      # 輸出: [0.000, 0.000, 0.000, 0.000, 0.265, 0.013, 0.721]
      

在講解 NNLM 的過程中,可以看到該模型的一個副產品詞向量 \(C(w_i)\)​,這就是大名鼎鼎的詞向量。

這個詞向量是如何解決 One-hot 編碼對於本應該相似的單詞而不相似的問題的呢?假設矩陣 Q 己經被成功訓練,下面我們來計算 “banana” 的詞向量:

\[\begin{bmatrix} 0&0&0&0&0&0&0&1 \end{bmatrix} \begin{bmatrix} 17&24&1\\ 23&5&7\\ 4&6&13\\ 10&12&19\\ 11&18&25 \\ 23&36&24 \\ 5&34&23 \\ 7&6&18 \end{bmatrix} = \begin{bmatrix} 7&6&18 \end{bmatrix} \]

同理 “fruit” 的詞向量為 [23,5,7],兩者的余弦相似度為 “0.638”,可以發現詞向量順利的解決了詞相似的問題。

y1 = torch.FloatTensor([7, 6, 18])
y2 = torch.FloatTensor([23, 5, 7, ])
print(torch.cosine_similarity(y1, y2, dim=0)) # 輸出:0.638

上過構建詞向量的過程被稱作 Word Embedding,而且細心地讀者應該發現訓練矩陣 Q 並得到詞向量的過程其實就是一個預訓練的過程,對於未來的 NLP 的任務,直接使用訓練得到的矩陣 Q 和詞向量即可。

下圖給出網上找的幾個例子,可以看出有些效果還是蠻不錯的:

圖 5 - Word Embedding 例子

四、Word2Vec 模型

NNLM 的學習任務是輸入某個句中單詞 \(w_t = banana\) 前的 \(t-1\)​ 個單詞,要求網絡正確預測單詞 “banana”,矩陣 Q 和詞向量都只是它的副產品。

為此,2013 年出現了一個最火的用語言模型專門做 Word Embedding 的工具 Word2Vec ,它的架構如下圖所示:

圖 6 - Word2Vec 模型

由於 Word2Vec 專門用來做 Word Embedding,它不再是利用前 \(t-1\)​ 個單詞,而是利用了上下文信息,這個也是很好理解的,對於一個單詞的解釋,利用上下文的信息作出的解釋會更合理。

其實 Word2Vec 和 NNLM 非常類似,都是三層架構,除了利用了上下文信息,Word2Vec 還提供了 2 種訓練方法:

  1. 第一種叫 CBOW,核心思想是從一個句子里面把一個詞摳掉,用這個詞的上文和下文去預測被摳掉的這個詞;
  2. 第二種叫做 Skip-gram,和 CBOW 正好反過來,輸入某個單詞,要求網絡預測它的上下文單詞。

當你看到 CBOW 的時候,想必你也想到了為什么要在這里講講 Word2Vec 的原因,因為未來的 BERT 將會用到 CBOW 的思想:利用單詞 \(w_t\) 上下文的信息,預測單詞 \(w_t\)

五、Attention 機制

Attention 機制來源於人類的視覺注意力機制:人類視覺通過快速掃描全局圖像,獲得需要重點關注的目標區域,也就是一般所說的注意力焦點,而后對這一區域投入更多注意力資源,以獲取更多所需要關注目標的細節信息,而抑制其他無用信息。

對於下圖,如果只關心顏色,我們可能第一眼就會把重心放在顯眼的紅色上,然后再觀察其他地方。

圖 7 - 嬰兒圖像

通過對人類視覺注意力機制的描述,Attention 機制簡單點講就是:通過一個 Query(查詢變量)從一堆信息(Key-Value 表示的信息,可以把 Key 看作信息的地址,Value 表示信息的內容)中找到對於 Query 而言重要的信息,以此獲取更多對於 Query 而言更重要的細節信息,進而抑制其他無用信息。

Attention 的具體做法如下圖所示:

圖 8 - Attention 計算圖

  1. 計算 Q 和 K 的相似度,用 f 來表示:\(f(Q,K_i)\quad i=1,2,\cdots,m\)​,Self-Attention 模型中 \(f(Q,K_i) = Q^TK_i\)

  2. 第二步:將得到的相似度進行 softmax 操作,進行歸一化:\(\alpha_i = softmax(\frac{f(Q,K_i)}{\sqrt d_k})\)

    1. 這里簡單講解除以 \(\sqrt d_k\) 的作用:假設 \(Q\) , \(K\) 里的元素的均值為0,方差為 1,那么 \(A^T=Q^TK\) 中元素的均值為 0,方差為 d。當 d 變得很大時, \(A\) 中的元素的方差也會變得很大,如果 \(A\) 中的元素方差很大(分布的方差大,分布集中在絕對值大的區域),在數量級較大時, softmax 將幾乎全部的概率分布都分配給了最大值對應的標簽,由於某一維度的數量級較大,進而會導致 softmax 未來求梯度時會消失。總結一下就是 \(\operatorname{softmax}\left(A\right)\) 的分布會和d有關。因此 \(A\) 中每一個元素乘上 \(\frac{1}{\sqrt{d_k}}\) 后,方差又變為 1,並且 \(A\) 的數量級也將會變小。

    2. y1 = torch.FloatTensor([11, 22, 55, 44, 87, 84, 88])
      y2 = torch.FloatTensor([11, 22, 55, 44, 80, 80, 88])
      print(functional.softmax(y1, dim=0))
      # 輸出: [0.000, 0.000, 0.000, 0.000, 0.265, 0.013, 0.721]
      print(functional.softmax(y2, dim=0))
      # 輸出:[0.000, 0.000, 0.000, 0.000, 0.000, 0.000, 0.999]
      
      
  3. 針對計算出來的權重 \(\alpha_i\),對 \(V\) 中的所有 values 進行加權求和計算,得到 Attention 向量:\(Attention = \sum_{i=1}^m \alpha_i V_i\)

六、Self-Attention 模型

6.1 Self-Attention 的向量運算

Self-Attention 模型是 Attention 機制的具體應用,下面我們給出 Self-Attention 的架構圖:

圖 9 - Self-Attention 模型架構圖

通過上圖可以看到 Self Attention 有三個輸入 Q、K、V:對於 Self Attention,Q、K、V 來自輸入句子 X 的 詞向量 x 的線性轉化,即對於詞向量 x,給定三個可學習的矩陣參數 \(W_Q,W_k,W_v\),x 分別右乘上述矩陣得到 Q、K、V。這也是Self-Attention 名字的來源:Q、K、V 三個矩陣由同一個詞向量線性轉化而得。

下面我們來詳細了解下 Self-Attention 的具體計算流程:

  1. 第一步,Q、K、V 的獲取

    圖 10 - Q、K、V 矩陣的獲取

    上圖操作:兩個單詞 Thinking 和 Machines。通過線性變換,即 \(x_i\)\(x_2\) 兩個向量分別與\(W_q,W_k,W_v\) 三個矩陣點乘得到 ${q_1,q_2},{k_1,k_2},{v_1,v_2} $ 共 6 個向量。矩陣 Q 則是向量 \(q_1,q_2\) 的拼接,K、V 同理。

  2. 第二步,MatMul

    1. 圖 11 - \(q_1\)\(k1、k_2\) 的計算

      上圖操作:向量 \({q_1,k_1}\) 做點乘得到得分 112, \({q_1,k_2}\) 做點乘得到得分96。注意:這里是通過 \(q_1\) 這個信息找到 \(x_1,x_2\) 中的重要信息。

  3. 第三步和第四步,Scale + Softmax

    圖 12 - \(q_1\)\(k1、k_2\) 的計算做 Softmax

    上圖操作:對該得分進行規范,除以 \(\sqrt {d_k} = 8\)

  4. 第五步,MatMul

    圖 13 - \(z_1\) 的計算

用得分比例 [0.88,0.12] 乘以 \([v_1,v_2]\) 值得到一個加權后的值,將這些值加起來得到 \(z_1\)

上述所說就是 Self Attention 模型所做的事,仔細感受一下,用 \(q_1\)​、\(K=[k_1,k_2]\)​ 去計算一個 Thinking 相對於 Thinking 和 Machine 的權重,再用權重乘以 Thinking 和 Machine 的 \(V=[v_1,v_2]\)​ 得到加權后的 Thinking 和 Machine 的 \(V=[v_1,v_2]\)​,最后求和得到針對各單詞的輸出 \(z_1\)​​​。

同理可以計算出 Machine 相對於 Thinking 和 Machine 的加權輸出 \(z_2\)

6.2 Self-Attention 的優點

上述所計算的結果 \(z_1\)​​ 就可以看作是查詢變量 Thinking 的詞向量,並且是 Thinking 從 Thinking Machine 這句話中找到了對於 Thinking 而言更為重要的信息,並且抑制了不重要的信息。這樣講,可能無法理解 Self-Attention 機制的好處,我們可以通過下圖來了解 Self-Attention 機制的優點到底在哪里:

圖 14 - attention 獲取句法特征

圖 15 - attention 獲取語義特征

從圖 14 可以看出,Self-Attention 捕獲了同一個句子中單詞之間的一些句法特征(有一定距離的短語結構);從圖 15 可以看出,Self-Attention 捕獲了同一個句子中單詞之間的語義特征(“its” 的指代對象 “Law”)。

並且從上面的計算步驟和圖片可以看出,無論句子序列多長,都可以很好的提取句子特征,並且既可以提取句法特征還可以提取語義特征,這很好的解決了 RNN 序列長距離依賴的問題,而且對於一個句子而言,每個單詞的計算是可以並行處理的

圖 16 - RNN 結構圖

6.3 Self-Attention 的矩陣運算

上述例子是 Self-Attention 單個向量運算的例子。下圖展示的是 Self-Attention 的矩陣運算的例子,輸入是一個 [2x4] 的矩陣(句子中每個單詞的詞向量的拼接),每個運算是 [4x3] 的矩陣,求得 Q、K、V。

Q 對 K 轉制做點乘,除以 \(\sqrt d_k\),做一個 softmax 得到合為 1 的比例,對 V 做點乘得到輸出 Z。那么這個 Z 就是一個考慮過 Thinking 周圍單詞 Machine 的輸出。

注意看這個公式,\(QK^T\) 其實就會組成一個 word2word 的 attention map!(加了 softmax 之后就是一個合為 1 的權重了)。比如說你的輸入是一句話 "i have a dream" 總共 4 個單詞,這里就會形成一張 4x4 的注意力機制的圖:

這樣一來,每一個單詞對應每一個單詞都會有一個權重,這也是 Self Attention 名字的來源,即 Attention 的計算來源於 Source(源句) 和 Source 本身,通俗點講就是 Q、K、V 都來源於輸入 X 本身。

6.4 Masked Self Attention 模型

趁熱打鐵,我們講講 Transformer 未來會用到的 Masked Self Attention 模型,這里的 Masked 就是要在做語言模型(或者像翻譯)的時候,不給模型看到未來的信息,它的結構如下圖所示:

上圖中和 Self Attention 重復的部分此處就不講了,主要講講 Mask 這一塊。

假設在此之前我們已經通過 scale 之前的步驟得到了一個 attention map,而 mask 就是沿着對角線把灰色的區域用0覆蓋掉,不給模型看到未來的信息,如下圖所示:

詳細來說:

  1. "i" 作為第一個單詞,只能有和 "i" 自己的 attention;
  2. "have" 作為第二個單詞,有和 "i、have" 前面兩個單詞的 attention;
  3. "a" 作為第三個單詞,有和 "i、have、a" 前面三個單詞的 attention;
  4. "dream" 作為最后一個單詞,才有對整個句子 4 個單詞的 attention。

並且在做完 softmax 之后,橫軸結果合為 1。如下圖所示:

具體為什么 在 Transformer 中要用到 Masked Self Attention,未來在講解 Transformer 的時候會詳細解釋。

6.5 Multi-head Self Attention 模型

由於 Transformer 使用的都是 Self Attention 的進階版 Multi-head Self Attention,我們簡單講講 Multi-head Self Attention 的架構,並且在該小節結尾處講講它的優點。

Multi-Head Attention 就是把 Self Attention的過程做 H 次,然后把輸出 Z 合起來。論文中,它的結構圖如下:

我們還是以上面的形式來解釋,首先,我們使用 8 組不同的 \(W_Q^i,W_k^i,W_V^i\quad i=1,2,\cdots,8\) ,重復 8 次和 Self Attention 相似的操作,得到 8 個 \(Z_i\) 矩陣:

為了使得輸出與輸入結構相同,拼接矩陣 \(Z_i\) 后乘以一個線性 \(W_0\) 得到最終的Z:

看完了 Multi-head Self Attention 的架構,發現它與 Self Attention 的區別,在於用了 \(n\)\(W_Q^i,W_k^i,W_V^i\quad i=1,2,\cdots,n\) 得到 \(n\)\(Q_i,K_i,V_i \quad i=1,2,\cdots,n\)

可以通過下圖看看 multi-head attention 的整個流程:

上述操作有什么好處呢?使用多套參數,多套參數相當於把原始信息 Source 放入了多個子空間中,也就是捕捉了多個信息,對於使用 multi-head(多頭) attention 的簡單回答就是,多頭保證了 attention 可以注意到不同子空間的信息,捕捉到更加豐富的特征信息。其實本質上是論文原作者發現這樣效果確實好。

七、Position Embedding

在 Attention 和 RNN 的對比中,我們說到 Attention 解決了長距離依賴問題,並且可以支持並行化,但是它就真的百利而無一害了嗎?

其實不然,我們往前回顧,Self Attention 的 Q、K、V 三個矩陣是由同一個輸入 \(X_1=(x_1,x_2,\cdots,x_n)\) 線性轉換而來,也就是說對於這樣的一個被打亂序列順序的 \(X_2=(x_2,x_1,\cdots,x_n)\) 而言,由於 Attention 值的計算最終會被加權求和,也就是說兩者最終計算的 Attention 值都是一樣的,進而也就表明了 Attention 丟掉了 \(X_1\) 的序列順序信息。

如上圖所示,為了解決 Attention 丟失的序列順序信息,Transformer 的提出者提出了 Position Embedding,也就是對於輸入 \(X\) 進行 Attention 計算之前,在 \(X\) 的詞向量中加上位置信息,也就是說 \(X\) 的詞向量為 \(X_{final\_embedding} = Embedding + Positional\, Embedding\)

但是如何得到 \(X\) 的位置向量呢?

其中位置編碼公式如下圖所示:

其中 pos 表示位置、i 表示維度、\(d_{model}\)表示位置向量的向量維度 、\(2i、2i+1\) 表示的是奇偶數(奇偶維度),上圖所示就是偶數位置使用 \(\sin\) 函數,奇數位置使用 \(\cos\) 函數。

有了位置編碼,我們再來看看位置編碼是如何嵌入單詞編碼的(其中 512 表示編碼維度),通過把單詞的詞向量和位置向量進行疊加,這種方式就稱作位置嵌入,如下圖所示:

Position Embedding 本身是一個絕對位置的信息,但在語言模型中,相對位置也很重要。那么為什么位置嵌入機制有用呢?

我們不要去關心三角函數公式,可以看看下圖公式(3)中的第一行,我們做如下的解釋,對於 “我愛吃蘋果” 這一句話,有 5 個單詞,假設序號分別為 1、2、3、4、5。

假設 \(pos=1=我、k=2=愛、pos+k=3=吃\),也就是說 \(pos+k=3\) 位置的位置向量的某一維可以通過 \(pos=1\) 位置的位置向量的某一維線性組合加以線性表示,通過該線性表示可以得出 “吃” 的位置編碼信息蘊含了相對於前兩個字 “我” 的位置編碼信息。

總而言之就是,某個單詞的位置信息是其他單詞位置信息的線性組合,這種線性組合就意味着位置向量中蘊含了相對位置信息。

八、Transformer

8.1 Transformer 的結構

萬事俱備,只欠東風,下面我們來講講我們的重點之一,Transformer,你可以先記住這一句話:Transformer 簡單點看其實就是 self-attention 模型的疊加,首先我們來看看 Transformer 的整體框架。

Transformer 的整體框架如下圖所示:

上圖所示的整體框架乍一眼一看非常復雜,由於 Transformer 起初是作為翻譯模型,因此我們以翻譯舉例,簡化一下上述的整體框架:

從上圖可以看出 Transformer 相當於一個黑箱,左邊輸入 “Je suis etudiant”,右邊會得到一個翻譯結果 “I am a student”。

再往細里講,Transformer 也是一個 Seq2Seq 模型(Encoder-Decoder 框架的模型),左邊一個 Encoders 把輸入讀進去,右邊一個 Decoders 得到輸出,如下所示:

在這里,我們穿插描述下 Encoder-Decoder 框架的模型是如何進行文本翻譯的:

  1. 將序列 \((x_1,x_2,\cdots,x_n)\) 作為 Encoders 的輸入,得到輸出序列 \((z_1,z_2,\cdots,z_n)\)
  2. 把 Encoders 的輸出序列 \((z_1,z_2,\cdots,z_n)\) 作為 Decoders 的輸入,生成一個輸出序列 \((y_1,y_2,\cdots,y_m)\)。注:Decoders 每個時刻輸出一個結果

第一眼看到上述的 Encodes-Decoders 框架圖,隨之產生問題就是 Transformer 中 左邊 Encoders 的輸出是怎么和右邊 Decoders 結合的。因為decoders 里面是有N層的,再畫張圖直觀的看就是這樣:

也就是說,Encoders 的輸出,會和每一層的 Decoder 進行結合

現在我們取其中一層進行詳細的展示:

通過上述分析,發現我們想要詳細了解 Transformer,只要了解 Transformer 中的 Encoder 和 Decoder 單元即可,接下來我們將詳細闡述這兩個單元。

8.2 Encoder

有了上述那么多知識的鋪墊,我們知道 Eecoders 是 N=6 層,通過上圖我們可以看到每層 Encoder 包括兩個 sub-layers:

  • 第一個 sub-layer 是 multi-head self-attention,用來計算輸入的 self-attention;
  • 第二個 sub-layer 是簡單的前饋神經網絡層 Feed Forward;

注意:在每個 sub-layer 我們都模擬了殘差網絡(在下面的數據流示意圖中會細講),每個sub-layer的輸出都是 \(LayerNorm(x+Sub\_layer(x))\),其中 \(sub\_layer\) 表示的是該層的上一層的輸出

現在我們給出 Encoder 的數據流示意圖,一步一步去剖析

  1. 深綠色的 \(x_1\) 表示 Embedding 層的輸出,加上代表 Positional Embedding 的向量之后,得到最后輸入 Encoder 中的特征向量,也就是淺綠色向量 \(x_1\)
  2. 淺綠色向量 \(x_1\) 表示單詞 “Thinking” 的特征向量,其中 \(x_1\) 經過 Self-Attention 層,變成淺粉色向量 \(z_1\)
  3. \(x_1\) 作為殘差結構的直連向量,直接和 \(z_1\) 相加,之后進行 Layer Norm 操作,得到粉色向量 \(z_1\)
    1. 殘差結構的作用:避免出現梯度消失的情況
    2. Layer Norm 的作用:為了保證數據特征分布的穩定性,並且可以加速模型的收斂
  4. \(z_1\) 經過前饋神經網絡(Feed Forward)層,經過殘差結構與自身相加,之后經過 LN 層,得到一個輸出向量 \(r_1\)
    1. 該前饋神經網絡包括兩個線性變換和一個ReLU激活函數:\(FFN(x) = max(0,xW_1+b_1)W_2+b2\)
  5. 由於 Transformer 的 Encoders 具有 6 個 Encoder,\(r_1\) 也將會作為下一層 Encoder 的輸入,代替 \(x_1\) 的角色,如此循環,直至最后一層 Encoder。

需要注意的是,上述的 \(x、z、r\) 都具有相同的維數,論文中為 512 維。

8.3 Decoder

Decoders 也是 N=6 層,通過上圖我們可以看到每層 Decoder 包括 3 個 sub-layers:

  • 第一個 sub-layer 是 Masked multi-head self-attention,也是計算輸入的 self-attention;
    • 在這里,先不解釋為什么要做 Masked,后面在 “Transformer 動態流程展示” 這一小節會解釋
  • 第二個 sub-layer 是 Encoder-Decoder Attention 計算,對 Encoder 的輸入和 Decoder 的Masked multi-head self-attention 的輸出進行 attention 計算;
    • 在這里,同樣不解釋為什么要對 Encoder 和 Decoder 的輸出一同做 attention 計算,后面在 “Transformer 動態流程展示” 這一小節會解釋
  • 第三個 sub-layer 是前饋神經網絡層,與 Encoder 相同。

8.4 Transformer 輸出結果

以上,就講完了 Transformer 編碼和解碼兩大模塊,那么我們回歸最初的問題,將 “機器學習” 翻譯成 “machine learing”,解碼器的輸出是一個浮點型的向量,怎么轉化成 “machine learing” 這兩個詞呢?讓我們來看看 Encoders 和 Decoders 交互的過程尋找答案:

從上圖可以看出,Transformer 最后的工作是讓解碼器的輸出通過線性層 Linear 后接上一個 softmax

  • 其中線性層是一個簡單的全連接神經網絡,它將解碼器產生的向量 A 投影到一個更高維度的向量 B 上,假設我們模型的詞匯表是10000個詞,那么向量 B 就有10000個維度,每個維度對應一個惟一的詞的得分。
  • 之后的softmax層將這些分數轉換為概率。選擇概率最大的維度,並對應地生成與之關聯的單詞作為此時間步的輸出就是最終的輸出啦!

假設詞匯表維度是 6,那么輸出最大概率詞匯的過程如下:

九、Transformer 動態流程展示

首先我們來看看拿 Transformer 作翻譯時,如何生成翻譯結果的:

繼續進行:

假設上圖是訓練模型的某一個階段,我們來結合 Transformer 的完整框架描述下這個動態的流程圖:

  1. 輸入 “je suis etudiant” 到 Encoders,然后得到一個 \(K_e\)\(V_e\) 矩陣;
  2. 輸入 “I am a student” 到 Decoders ,首先通過 Masked Multi-head Attention 層得到 “I am a student” 的 attention 值 \(Q_d\),然后用 attention 值 \(Q_d\) 和 Encoders 的輸出 \(K_e\)\(V_e\) 矩陣進行 attention 計算,得到第 1 個輸出 “I”;
  3. 輸入 “I am a student” 到 Decoders ,首先通過 Masked Multi-head Attention 層得到 “I am a student” 的 attention 值 \(Q_d\),然后用 attention 值 \(Q_d\) 和 Encoders 的輸出 \(K_e\)\(V_e\) 矩陣進行 attention 計算,得到第 2 個輸出 “am”;
  4. ……

現在我們來解釋我們之前遺留的兩個問題。

9.1 為什么 Decoder 需要做 Mask

  • 訓練階段:我們知道 “je suis etudiant” 的翻譯結果為 “I am a student”,我們把 “I am a student” 的 Embedding 輸入到 Decoders 里面,翻譯第一個詞 “I” 時

    • 如果對 “I am a student” attention 計算不做 mask,“am,a,student” 對 “I” 的翻譯將會有一定的貢獻
    • 如果對 “I am a student” attention 計算做 mask,“am,a,student” 對 “I” 的翻譯將沒有貢獻
  • 測試階段:我們不知道 “我愛中國” 的翻譯結果為 “I love China”,我們只能隨機初始化一個 Embedding 輸入到 Decoders 里面,翻譯第一個詞 “I” 時:

    • 無論是否做 mask,“love,China” 對 “I” 的翻譯都不會產生貢獻
    • 但是翻譯了第一個詞 “I” 后,隨機初始化的 Embedding 有了 “I” 的 Embedding,也就是說在翻譯第二詞 “love” 的時候,“I” 的 Embedding 將有一定的貢獻,但是 “China” 對 “love” 的翻譯毫無貢獻,隨之翻譯的進行,已經翻譯的結果將會對下一個要翻譯的詞都會有一定的貢獻,這就和做了 mask 的訓練階段做到了一種匹配

總結下就是:Decoder 做 Mask,是為了讓訓練階段和測試階段行為一致,不會出現間隙,避免過擬合

9.2 為什么 Encoder 給予 Decoders 的是 K、V 矩陣

我們在講解 Attention 機制中曾提到,Query 的目的是借助它從一堆信息中找到重要的信息。

現在 Encoder 提供了 \(K_e、V_e\) 矩陣,Decoder 提供了 \(Q_d\) 矩陣,通過 “我愛中國” 翻譯為 “I love China” 這句話詳細解釋下。

當我們翻譯 “I” 的時候,由於 Decoder 提供了 \(Q_d\) 矩陣,通過與 \(K_e、V_e\) 矩陣的計算,它可以在 “我愛中國” 這四個字中找到對 “I” 翻譯最有用的單詞是哪幾個,並以此為依據翻譯出 “I” 這個單詞,這就很好的體現了注意力機制想要達到的目的,把焦點放在對自己而言更為重要的信息上。

  • 其實上述說的就是 Attention 里的 soft attention機制,解決了曾經的 Encoder-Decoder 框架的一個問題,在這里不多做敘述,有興趣的可以參考網上的一些資料。
    • 早期的 Encoder-Decoder 框架中的 Encoder 通過 LSTM 提取出源句(Source) “我愛中國” 的特征信息 C,然后 Decoder 做翻譯的時候,目標句(Target)“I love China” 中的任何一個單詞的翻譯都來源於相同特征信息 C,這種做法是極其不合理的,例如翻譯 “I” 時應該着眼於 “我”,翻譯 “China” 應該着眼於 “中國”,而早期的這種做法並沒有體現出,然而 Transformer 卻通過 Attention 的做法解決了這個問題。

十、BERT 模型

10.1 BERT:公認的里程碑

BERT 模型可以作為公認的里程碑式的模型,但是它最大的優點不是創新,而是集大成者,並且這個集大成者有了各項突破,下面讓我們看看 BERT 是怎么集大成者的。

  • BERT 的意義在於:從大量無標記數據集中訓練得到的深度模型,可以顯著提高各項自然語言處理任務的准確率。
  • 近年來優秀預訓練語言模型的集大成者:參考了 ELMO 模型的雙向編碼思想、借鑒了 GPT 用 Transformer 作為特征提取器的思路、采用了 word2vec 所使用的 CBOW 方法
  • BERT 和 GPT 之間的區別:
    • GPT:GPT 使用 Transformer Decoder 作為特征提取器、具有良好的文本生成能力,然而當前詞的語義只能由其前序詞決定,並且在語義理解上不足
    • BERT:使用了 Transformer Encoder 作為特征提取器,並使用了與其配套的掩碼訓練方法。雖然使用雙向編碼讓 BERT 不再具有文本生成能力,但是 BERT 的語義信息提取能力更強
  • 單向編碼和雙向編碼的差異,以該句話舉例 “今天天氣很{},我們不得不取消戶外運動”,分別從單向編碼和雙向編碼的角度去考慮 {} 中應該填什么詞:
    • 單向編碼:單向編碼只會考慮 “今天天氣很”,以人類的經驗,大概率會從 “好”、“不錯”、“差”、“糟糕” 這幾個詞中選擇,這些詞可以被划為截然不同的兩類
    • 雙向編碼:雙向編碼會同時考慮上下文的信息,即除了會考慮 “今天天氣很” 這五個字,還會考慮 “我們不得不取消戶外運動” 來幫助模型判斷,則大概率會從 “差”、“糟糕” 這一類詞中選擇

10.2 BERT 的結構:強大的特征提取能力

  • 如下圖所示,我們來看看 ELMo、GPT 和 BERT 三者的區別

    • ELMo 使用自左向右編碼和自右向左編碼的兩個 LSTM 網絡,分別以 \(P(w_i|w_1,\cdots,w_{i-1})\)\(P(w_i|w_{i+1},\cdots,w_n)\) 為目標函數獨立訓練,將訓練得到的特征向量以拼接的形式實現雙向編碼,本質上還是單向編碼,只不過是兩個方向上的單向編碼的拼接而成的雙向編碼
    • GPT 使用 Transformer Decoder 作為 Transformer Block,以 \(P(w_i|w_1,\cdots,w_{i-1})\) 為目標函數進行訓練,用 Transformer Block 取代 LSTM 作為特征提取器,實現了單向編碼,是一個標准的預訓練語言模型,即使用 Fine-Tuning 模式解決下游任務。
    • BERT 也是一個標准的預訓練語言模型,它以 \(P(w_i|w_1,\cdots,w_{i-1},w_{i+1},\cdots,w_n)\) 為目標函數進行訓練,BERT 使用的編碼器屬於雙向編碼器
      • BERT 和 ELMo 的區別在於使用 Transformer Block 作為特征提取器,加強了語義特征提取的能力;
      • BERT 和 GPT 的區別在於使用 Transformer Encoder 作為 Transformer Block,並且將 GPT 的單向編碼改成雙向編碼,也就是說 BERT 舍棄了文本生成能力,換來了更強的語義理解能力。

BERT 的模型結構如下圖所示:

從上圖可以發現,BERT 的模型結構其實就是 Transformer Encoder 模塊的堆疊。在模型參數選擇上,論文給出了兩套大小不一致的模型。

\(BERT_{BASE}\) :L = 12,H = 768,A = 12,總參數量為 1.1 億

\(BERT_{LARGE}\):L = 24,H = 1024,A = 16,總參數量為 3.4 億

其中 L 代表 Transformer Block 的層數;H 代表特征向量的維數(此處默認 Feed Forward 層中的中間隱層的維數為 4H);A 表示 Self-Attention 的頭數,使用這三個參數基本可以定義 BERT的量級。

BERT 參數量級的計算公式:

\[\begin{align*} & 詞向量參數+ 12 * (Multi-Heads參數 + 全連接層參數 + layernorm參數)\\ & = (30522+512 + 2)* 768 + 768 * 2 \\ & + 12 * (768 * 768 / 12 * 3 * 12 + 768 * 768 + 768 * 3072 * 2 + 768 * 2 * 2) \\ & = 108808704.0 \\ & \approx 110M \end{align*} \]

訓練過程也是很花費計算資源和時間的,總之表示膜拜,普通人即便有 idea 沒有算力也只能跪着。

10.3 BERT 之無監督訓練

BERT 采用二段式訓練方法:

  1. 第一階段:使用易獲取的大規模無標簽余料,來訓練基礎語言模型;
  2. 第二階段:根據指定任務的少量帶標簽訓練數據進行微調訓練。

不同於 GPT 等標准語言模型使用 \(P(w_i|w_1,\cdots,w_{i-1})\) 為目標函數進行訓練,能看到全局信息的 BERT 使用 \(P(w_i|w_1,\cdots,w_{i-1},w_{i+1},\cdots,w_n)\) 為目標函數進行訓練。

並且 BERT 用語言掩碼模型(MLM)方法訓練詞的語義理解能力;用下句預測(NSP)方法訓練句子之間的理解能力,從而更好地支持下游任務。

10.4 BERT 之語言掩碼模型(MLM)

BERT 作者認為,使用自左向右編碼和自右向左編碼的單向編碼器拼接而成的雙向編碼器,在性能、參數規模和效率等方面,都不如直接使用深度雙向編碼器強大,這也是為什么 BERT 使用 Transformer Encoder 作為特征提取器,而不使用自左向右編碼和自右向左編碼的兩個 Transformer Decoder作為特征提取器的原因。

由於無法使用標准語言模型的訓練模式,BERT 借鑒完形填空任務和 CBOW 的思想,使用語言掩碼模型(MLM )方法訓練模型。

MLM 方法也就是隨機去掉句子中的部分 token(單詞),然后模型來預測被去掉的 token 是什么。這樣實際上已經不是傳統的神經網絡語言模型(類似於生成模型)了,而是單純作為分類問題,根據這個時刻的 hidden state 來預測這個時刻的 token 應該是什么,而不是預測下一個時刻的詞的概率分布了。

隨機去掉的 token 被稱作掩碼詞,在訓練中,掩碼詞將以 15% 的概率被替換成 [MASK],也就是說隨機 mask 語料中 15% 的 token,這個操作則稱為掩碼操作。注意:在CBOW 模型中,每個詞都會被預測一遍。

但是這樣設計 MLM 的訓練方法會引入弊端:在模型微調訓練階段或模型推理(測試)階段,輸入的文本中將沒有 [MASK],進而導致產生由訓練和預測數據偏差導致的性能損失。

考慮到上述的弊端,BERT 並沒有總用 [MASK] 替換掩碼詞,而是按照一定比例選取替換詞。在選擇 15% 的詞作為掩碼詞后這些掩碼詞有三類替換選項:

  • 80% 練樣本中:將選中的詞用 [MASK] 來代替,例如:
“地球是[MASK]八大行星之一”
  • 10% 的訓練樣本中:選中的詞不發生變化,該做法是為了緩解訓練文本和預測文本的偏差帶來的性能損失,例如:
“地球是太陽系八大行星之一”
  • 10% 的訓練樣本中:將選中的詞用任意的詞來進行代替,該做法是為了讓 BERT 學會根據上下文信息自動糾錯,例如:
“地球是蘋果八大行星之一”

作者在論文中提到這樣做的好處是,編碼器不知道哪些詞需要預測的,哪些詞是錯誤的,因此被迫需要學習每一個 token 的表示向量,另外作者也表示雙向編碼器比單項編碼器訓練要慢,進而導致BERT 的訓練效率低了很多,但是實驗也證明 MLM 訓練方法可以讓 BERT 獲得超出同期所有預訓練語言模型的語義理解能力,犧牲訓練效率是值得的。

10.5 BERT 之下句預測(NSP)

在很多自然語言處理的下游任務中,如問答和自然語言推斷,都基於兩個句子做邏輯推理,而語言模型並不具備直接捕獲句子之間的語義聯系的能力,或者可以說成單詞預測粒度的訓練到不了句子關系這個層級,為了學會捕捉句子之間的語義聯系,BERT 采用了下句預測(NSP )作為無監督預訓練的一部分。

NSP 的具體做法是,BERT 輸入的語句將由兩個句子構成,其中,50% 的概率將語義連貫的兩個連續句子作為訓練文本(連續句對一般選自篇章級別的語料,以此確保前后語句的語義強相關),另外 50% 的概率將完全隨機抽取兩個句子作為訓練文本。

連續句對:[CLS]今天天氣很糟糕[SEP]下午的體育課取消了[SEP]

隨機句對:[CLS]今天天氣很糟糕[SEP]魚快被烤焦啦[SEP]

其中 [SEP] 標簽表示分隔符。 [CLS] 表示標簽用於類別預測,結果為 1,表示輸入為連續句對;結果為 0,表示輸入為隨機句對。

通過訓練 [CLS] 編碼后的輸出標簽,BERT 可以學會捕捉兩個輸入句對的文本語義,在連續句對的預測任務中,BERT 的正確率可以達到 97%-98%。

10.6 BERT 之輸入表示

BERT 在預訓練階段使用了前文所述的兩種訓練方法,在真實訓練中一般是兩種方法混合使用

由於 BERT 通過 Transformer 模型堆疊而成,所以 BERT 的輸入需要兩套 Embedding 操作:

  1. 一套為 One-hot 詞表映射編碼(對應下圖的 Token Embeddings);
  2. 另一套為位置編碼(對應下圖的 Position Embeddings),不同於 Transformer 的位置編碼用三角函數表示,BERT 的位置編碼將在預訓練過程中訓練得到(訓練思想類似於Word Embedding 的 Q 矩陣)
  3. 由於在 MLM 的訓練過程中,存在單句輸入和雙句輸入的情況,因此 BERT 還需要一套區分輸入語句的分割編碼(對應下圖的 Segment Embeddings),BERT 的分割編碼也將在預訓練過程中訓練得到

對於分割編碼,Segment Embeddings 層只有兩種向量表示。前一個向量是把 0 賦給第一個句子中的各個 token,后一個向量是把 1 賦給第二個句子中的各個 token ;如果輸入僅僅只有一個句子,那么它的 segment embedding 就是全 0,下面我們簡單舉個例子描述下:

[CLS]I like dogs[SEP]I like cats[SEP] 對應編碼 0 0 0 0 0 1 1 1 1

[SEP]I Iike dogs and cats[SEP] 對應編碼 0 0 0 0 0 0 0

十一、BERT 下游任務改造

BERT 根據自然語言處理下游任務的輸入和輸出的形式,將微調訓練支持的任務分為四類,分別是句對分類、單句分類、文本問答和單句標注,接下來我們將簡要的介紹下 BERT 如何通過微調訓練適應這四類任務的要求。

11.1 句對分類

給定兩個句子,判斷它們的關系,稱為句對分類,例如判斷句對是否相似、判斷后者是否為前者的答案。

針對句對分類任務,BERT 在預訓練過程中就使用了 NSP 訓練方法獲得了直接捕獲句對語義關系的能力。

如下圖所示,句對用 [SEP] 分隔符拼接成文本序列,在句首加入標簽 [CLS],將句首標簽所對應的輸出值作為分類標簽,計算預測分類標簽與真實分類標簽的交叉熵,將其作為優化目標,在任務數據上進行微調訓練。

針對二分類任務,BERT 不需要對輸入數據和輸出數據的結構做任何改動,直接使用與 NSP 訓練方法一樣的輸入和輸出結構就行。

針對多分類任務,需要在句首標簽 [CLS] 的輸出特征向量后接一個全連接層和 Softmax 層,保證輸出維數與類別數目一致,最后通過 arg max 操作(取最大值時對應的索引序號)得到相對應的類別結果。

下面給出句對分相似性任務的實例:

任務:判斷句子 “我很喜歡你” 和句子 “我很中意你” 是否相似

輸入改寫:“[CLS]我很喜歡你[SEP]我很中意你”

取 “[CLS]” 標簽對應輸出:[0.02, 0.98]

通過 arg max 操作得到相似類別為 1(類別索引從 0 開始),即兩個句子相似

11.2 單句分類

給定一個句子,判斷該句子的類別,統稱為單句分類,例如判斷情感類別、判斷是否為語義連貫的句子。

針對單句二分類任務,也無須對 BERT 的輸入數據和輸出數據的結構做任何改動。

如下圖所示,單句分類在句首加入標簽 [CLS],將句首標簽所對應的輸出值作為分類標簽,計算預測分類標簽與真實分類標簽的交叉熵,將其作為優化目標,在任務數據上進行微調訓練。

同樣,針對多分類任務,需要在句首標簽 [CLS] 的輸出特征向量后接一個全連接層和 Softmax 層,保證輸出維數與類別數目一致,最后通過 argmax 操作得到相對應的類別結果。

下面給出語義連貫性判斷任務的實例:

任務:判斷句子“海大球星飯茶吃” 是否為一句話

輸入改寫:“[CLS]海大球星飯茶吃”

取 “[CLS]” 標簽對應輸出:[0.99, 0.01]

通過 arg max 操作得到相似類別為 0,即這個句子不是一個語義連貫的句子

11.3 文本問答

給定一個問句和一個蘊含答案的句子,找出答案在后這種的位置,稱為文本問答,例如給定一個問題(句子 A),在給定的段落(句子 B)中標注答案的其實位置和終止位置。

文本問答任何和前面講的其他任務有較大的差別,無論是在優化目標上,還是在輸入數據和輸出數據的形式上,都需要做一些特殊的處理。

為了標注答案的起始位置和終止位置,BERT 引入兩個輔助向量 s(start,判斷答案的起始位置) 和 e(end,判斷答案的終止位置)。

如下圖所示,BERT 判斷句子 B 中答案位置的做法是,將句子 B 中的每一個次得到的最終特征向量 \(T_i'\) 經過全連接層(利用全連接層將詞的抽象語義特征轉化為任務指向的特征)后,分別與向量 s 和 e 求內積,對所有內積分別進行 softmax 操作,即可得到詞 Tok m(\(m\in [1,M]\))作為答案其實位置和終止位置的概率。最后,去概率最大的片段作為最終的答案

文本回答任務的微調訓練使用了兩個技巧:

  1. 用全連接層把 BERT 提取后的深層特征向量轉化為用於判斷答案位置的特征向量
  2. 引入輔助向量 s 和 e 作為答案其實位置和終止位置的基准向量,明確優化目標的方向和度量方法

下面給出文本問答任務的實例:

任務:給定問句 “今天的最高溫度是多少”,在文本 “天氣預報顯示今天最高溫度 37 攝氏度” 中標注答案的起始位置和終止位置

輸入改寫:“[CLS]今天的最高溫度是多少[SEP]天氣預報顯示今天最高溫度 37 攝氏度”

BERT Softmax 結果:

篇章文本 天氣 預報 顯示 今天 最高溫 37 攝氏度
起始位置概率 0.01 0.01 0.01 0.04 0.10 0.80 0.03
終止位置概率 0.01 0.01 0.01 0.03 0.04 0.10 0.80

對 Softmax 的結果取 arg max,得到答案的起始位置為 6,終止位置為 7,即答案為 “37 攝氏度”

11.4 單句標注

給定一個句子,標注每個次的標簽,稱為單句標注。例如給定一個句子,標注句子中的人名、地名和機構名。

單句標注任務和 BERT 預訓練任務具有較大差異,但與文本問答任務較為相似。

如下圖所示,在進行單句標注任務時,需要在每個詞的最終語義特征向量之后添加全連接層,將語義特征轉化為序列標注任務所需的特征,單句標注任務需要對每個詞都做標注,因此不需要引入輔助向量,直接對經過全連接層后的結果做 Softmax 操作,即可得到各類標簽的概率分布。

由於 BERT 需要對輸入文本進行分詞操作,獨立詞將會被分成若干子詞,因此 BERT 預測的結果將會是 5 類(細分為 13 小類):

  • O(非人名地名機構名,O 表示 Other)
  • B-PER/LOC/ORG(人名/地名/機構名初始單詞,B 表示 Begin)
  • I-PER/LOC/ORG(人名/地名/機構名中間單詞,I 表示 Intermediate)
  • E-PER/LOC/ORG(人名/地名/機構名終止單詞,E 表示 End)
  • S-PER/LOC/ORG(人名/地名/機構名獨立單詞,S 表示 Single)

將 5 大類的首字母結合,可得 IOBES,這是序列標注最常用的標注方法。

下面給出命名實體識別(NER)任務的示例:

任務:給定句子 “愛因斯坦在柏林發表演講”,根據 IOBES 標注 NER 結果

輸入改寫:“[CLS]愛 因 斯坦 在 柏林 發表 演講”

BERT Softmax 結果:

BOBES 斯坦 柏林 發表 演講
O 0.01 0.01 0.01 0.90 0.01 0.90 0.90
B-PER 0.90 0.01 0.01 0.01 0.01 0.01 0.01
I-PER 0.01 0.90 0.01 0.01 0.01 0.01 0.01
E-PER 0.01 0.01 0.90 0.01 0.01 0.01 0.01
S-LOC 0.01 0.01 0.01 0.01 0.01 0.01 0.01

對 Softmax 的結果取 arg max,得到最終地 NER 標注結果為:“愛因斯坦” 是人名;“柏林” 是地名

11.5 BERT效果展示

無論如何,從上述講解可以看出,NLP 四大類任務都可以比較方便地改造成 Bert 能夠接受的方式,總之不同類型的任務需要對模型做不同的修改,但是修改都是非常簡單的,最多加一層神經網絡即可。這其實是 Bert 的非常大的優點,這意味着它幾乎可以做任何NLP的下游任務,具備普適性,這是很強的。

但是講了這么多,一個新模型好不好,效果才是王道。那么Bert 采用這種兩階段方式解決各種 NLP 任務效果如何?

在 11 個各種類型的 NLP 任務中達到目前最好的效果,某些任務性能有極大的提升。

十二、BERT 總結

最后,我講講我對Bert的評價和看法,我覺得 Bert 是 NLP 里里程碑式的工作,對於后面 NLP 的研究和工業應用會產生長久的影響,這點毫無疑問。但是從上文介紹也可以看出,從模型或者方法角度看,Bert 借鑒了 ELMO,GPT 及 CBOW,主要提出了 Masked 語言模型及 Next Sentence Prediction,但是這里 Next Sentence Prediction 基本不影響大局,而 Masked LM 明顯借鑒了 CBOW 的思想。所以說 Bert 的模型沒什么大的創新,更像最近幾年 NLP 重要進展的集大成者,這點如果你看懂了上文估計也沒有太大異議,如果你有大的異議,杠精這個大帽子我隨時准備戴給你。

如果歸納一下這些進展就是:首先是兩階段模型,第一階段雙向語言模型預訓練,這里注意要用雙向而不是單向,第二階段采用具體任務 Fine-tuning 或者做特征集成;第二是特征抽取要用Transformer 作為特征提取器而不是 RNN 或者 CNN;第三,雙向語言模型可以采取 CBOW 的方法去做(當然我覺得這個是個細節問題,不算太關鍵,前兩個因素比較關鍵)。Bert 最大的亮點在於效果好及普適性強,幾乎所有 NLP 任務都可以套用 Bert 這種兩階段解決思路,而且效果應該會有明顯提升。可以預見的是,未來一段時間在 NLP 應用領域,Transformer 將占據主導地位,而且這種兩階段預訓練方法也會主導各種應用。

另外,我們應該弄清楚預訓練這個過程本質上是在做什么事情,本質上預訓練是通過設計好一個網絡結構來做語言模型任務,然后把大量甚至是無窮盡的無標注的自然語言文本利用起來,預訓練任務把大量語言學知識抽取出來編碼到網絡結構中,當手頭任務帶有標注信息的數據有限時,這些先驗的語言學特征當然會對手頭任務有極大的特征補充作用,因為當數據有限的時候,很多語言學現象是覆蓋不到的,泛化能力就弱,集成盡量通用的語言學知識自然會加強模型的泛化能力。如何引入先驗的語言學知識其實一直是 NLP 尤其是深度學習場景下的 NLP 的主要目標之一,不過一直沒有太好的解決辦法,而 ELMO/GPT/Bert 的這種兩階段模式看起來無疑是解決這個問題自然又簡潔的方法,這也是這些方法的主要價值所在。

對於當前 NLP 的發展方向,我個人覺得有兩點非常重要:

  1. 一個是需要更強的特征抽取器,目前看 Transformer 會逐漸擔當大任,但是肯定還是不夠強的,需要發展更強的特征抽取器;
  2. 第二個就是如何優雅地引入大量無監督數據中包含的語言學知識,注意我這里強調地是優雅,而不是引入,此前相當多的工作試圖做各種語言學知識的嫁接或者引入,但是很多方法看着讓人牙疼,就是我說的不優雅。

目前看預訓練這種兩階段方法還是很有效的,也非常簡潔,當然后面肯定還會有更好的模型出現。

完了,這就是預訓練語言模型的前世今生。

由於個人剛入門 NLP 方向,就不妄自總結,上述總結全部來自知乎文章:從Word Embedding到Bert模型—自然語言處理中的預訓練技術發展史-張俊林

十三、參考資料

我只是知識的搬運工,想詳細了解各個知識點的讀者可以自行選擇參考下列資料。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM