Transformer之encoder原理


前言

前幾天寫了一篇關於BERT的博文,里面用到了Transformer的編碼器,但是沒有具體講它的原理,所以在這篇文章里做一個補充。本文只闡述編碼器encoder的部分,只做一個重點部分流程的概括,具體的最好還是看看原論文,然后關於解碼器的部分之后有機會再講。

encoder原理

我們主要根據下面一張圖的流程來講解

encoder

1.首先假設我們有一組input:\(I = (I_1, I_2, ... I_n)\) 經過一個簡單的embedding,其實就是做一個線性變換 \(\alpha = WI\)

2.然后加入每個token的position信息,其實就是直接把兩個向量加起來 \(X = P + \alpha\)

3.下面就要進入一個循環體了(灰色框框內),也就是多層encode過程,我們提到過在BERT中有12層的base,也有24層的large。

3.1 第一步要經過一個multi-head attention,我們先從簡單入手,介紹一個self-attention的單個頭的情形。在這種最簡單的情況下,把X經過三種不同的線性變換\(W^q, W^k, W^v\),得到三個結果分別代表query,key和value,表示為\(Q = W^qX, K = W^kX, V = W^vX\)。然后我們將每個Q元素與每個K元素相乘,相當於是一種雙向的傳播,表示為 \(Q^TK\),經過一層softmax后再與對應的\(V\)相乘得到最后的結果 \(O = V^Tsoftmax(Q^TK)\)。下面這個手繪的圖展示了微觀上的操作,可以參考一下:

qkv

了解了單頭的情況,多頭也就容易了。multi-head只不過是把原來的輸入X切成n段(嗯,真的就是直接切開就好),然后分別去做線性變換,變換完了以后再把他們拼接回來,又變成了一個同維度的整體。那么你可能會問,這樣分開來做和一起做有什么區別嗎?根據原論文的闡述,”Multi-head attention allows the model to jointly attend to information from different representation subspaces at different positions. With a single attention head, averaging inhibits this.” 多頭注意允許模型在不同的位置共同關注來自不同表示子空間的信息。只有一個注意力集中的頭腦,平均化可以抑制這種情況。

3.2 接下來可以先做一個dropout的操作來防止過擬合,再把得到的輸出O和之前的輸入X做一個殘差和ADD,再做一個layer norm。如果你不清楚什么是layer norm,大概是這個形式 \(\beta_1 * \frac{x - mean(x)}{\sqrt{var(x) + \epsilon}} + \beta_2\)

3.3 然后,我們把norm完的結果輸入到全連接層中feed forward。這里的具體過程也很簡單,我大致畫了一下

feedforward

4.這樣一次循環就結束了,一共需要經過N次循環,就完成了encoder編碼任務。

補充點

  1. 這個encoder過程中有一些參數是人為規定好的,例如position embedding,有一些是需要通過學習得到的比如一些\(\beta\)

  2. 為了使用矩陣形式進行運算,對原始的句子是會做一些裁切和zero-padding的工作來確保長度一致。

  3. 關於attention中矩陣的shape,具體實踐中不是簡單的二維哦,里面還要加入batch維度,這個是由batch_size來決定的。假如batch size = N,token size = T,embedding size = E,那么輸入的shape就是(N,T,E)。

Reference

1.Vaswani, A., Shazeer, N., Parmar, N., Uszkoreit, J., Jones, L., Gomez, A. N., ... & Polosukhin, I. (2017). Attention is all you need. In Advances in neural information processing systems (pp. 5998-6008).


免責聲明!

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



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