李宏毅2021春機器學習課程筆記——自注意力機制(Self-Attention)


本文作為自己學習李宏毅老師2021春機器學習課程所做筆記,記錄自己身為入門階段小白的學習理解,如果錯漏、建議,還請各位博友不吝指教,感謝!!


全連接網絡的輸入是一個向量,但是當輸入是一個變長的向量序列時,就不能再使用全連接網絡了。這種情況通常可以使用卷積網絡或循環網絡進行編碼來得到一個相同長度的輸出向量序列

基於卷積或循環網絡的序列編碼都是一種局部的編碼方式,只建模了輸入信息的局部依賴關系。雖然循環網絡理論上可以建立長距離依賴關系,但是由於信息傳遞的容量以及梯度消失問題,實際上也只能建立短距離依賴關系。

要建立輸入序列之間的長距離依賴關系,可以通過如下兩種方法:

  1. 增加網絡的層數,通過一個深層網絡來獲取遠距離的信息交互;
  2. 使用全連接網絡。

全連接網絡是一種非常直接的建模遠距離依賴的模型,但是如上邊所說無法處理變長的輸入序列。不同的輸入長度(此處指的是向量序列的長度),其連接權重的大小也是不同的。這種情況我們就可以利用注意力機制來“動態”地生成不同連接地權重,即自注意力模型(Self-Attention Model)


輸入/輸出

  1. 自注意力模型輸入:如下圖所示,左側的變長的輸入序列即是自注意力模型的輸入數據,注意這個向量序列的長度不是固定的
  1. 自注意力模型輸出:自注意力模型的輸出有三種情況:
  • 輸出序列長度和輸入序列長度一樣,這種情況下,輸入序列中的向量和結果序列中的元素一一對應,也就是為每一個輸入序列中的向量給出一個label。如下圖所示:
  • 輸出序列的長度為1,此時相當於一個分類人物,比如像對正面/負面評論的分析。如下圖所示:
  • 輸出序列的長度是不定的,這種情況其實也就是Seq2Seq模型,比如機器翻譯。如下圖所示:

Attention函數

因為要建立輸入向量序列的長依賴關系,所以模型要考慮整個向量序列的信息。如下圖所示,Self-Attention的輸出序列長度是和輸入序列的長度一樣的,對應的輸出向量考慮了整個輸入序列的信息。然后將輸出向量輸入到Fully-Connected網絡中,做后續處理。

當然Self-Attention可以和Fully-Connected交替使用多次以提高網絡的性能,如下圖所示。

上邊我們提到,Self-Attention可以使用多次,那么輸入可能是整個網絡的輸入,也可能是前一個隱藏層的輸出,這里我們使用\([a^1, a^2, a^3, a^4]\)來表示輸入,使用\(b^1\)表示輸出為例。

首先Self-Attention會計算\(a^1\)分別與\([a^1, a^2, a^3, a^4]\)的相關性\([\alpha_{1,1}, \alpha_{1,2}, \alpha_{1,3}, \alpha_{1,4}]\)。相關性表示了輸入\([a^1, a^2, a^3, a^4]\)\(a^1\)是哪一個label的影響大小。而相關性\(\alpha\)的計算方式共有Dot-product和Additive兩種。

Dot-product

在Dot-product中,輸入的兩個向量,左邊的向量乘上矩陣\(W^q\)得到矩陣\(q\),右邊的向量乘上矩陣\(W^k\)得到矩陣\(k\),然后將矩陣\(q\)和矩陣\(k\)對應元素相乘並求和得到相關性\(\alpha\)

Additive

在Additive中同樣也是先將兩個輸入向量與矩陣\(W^q\)和矩陣\(W^k\)相乘得到矩陣\(q\)\(k\)。然后將矩陣\(q\)\(k\)串起來輸入到一個激活函數(tanh)中,在經過Transform得到相關性\(\alpha\)


Self-Attention計算過程

為了提高模型能力,自注意力模型經常采用查詢-鍵-值(Query-Key-Value,QKV)模型,其計算過程如下所示:

  1. 首先計算\(a^1\)\([a^2, a^3, a^4]\)的關聯性\(\alpha\)(實踐時一般也會計算與\(a^1\)自己的相關性)。以Dot-product為例,我們分別將\([a^1, a^2]\),\([a^1, a^3]\),\([a^1, a^4]\)作為Dot-product的輸入,求得對應的相關性\([\alpha_{1,2}, \alpha_{1,3}, \alpha_{1,4}]\),如下圖所示:
  1. 計算出\(a^1\)跟每一個向量的關聯性之后,將得到的關聯性輸入的softmax中,這個softmax和分類使用的softmax時一樣的,得到對應數量的\(\alpha'\)。(當然這里使用ReLU或其他激活函數代替softmax也是可以的,根據實際效果來)
  1. 先將\([a^1, a^2, a^3, a^4]\)每一個向量分別乘上矩陣\(W^v\)得到新的向量\(v^1, v^2, v^3, v^4\),然后把\(v^1, v^2, v^3, v^4\)都乘上Attention的分數\(\alpha'\),然后相加得到\(b^1 = \sum_{i} \alpha'_{1, i}v^i\)

假設\(a^1\)\(a^2\)的關聯性很強,則由這兩個向量計算得到的\(\alpha'_{1,2}\)的值就很大,最后求得的\(b^1\)的值,就可能會比較接近\(v^2\)。所以哪一個向量的Attention的分數最大,那一個向量的\(v\)就會主導最后計算出來的結果\(b\)


Self-Attention計算矩陣

由上邊計算過程可知,每個輸入\(a\)都會產生\(q\)\(k\)\(v\)三個矩陣。這里還是以\([a^1, a^2, a^3, a^4]\)為輸入為例:

  1. 我們將\([a^1, a^2, a^3, a^4]\)按照公式\(q^i = W^q a^i\)依次乘以矩陣\(W^q\)得到\([q^1, q^2, q^3, q^4]\),那我們將\([a^1, a^2, a^3, a^4]\)作為4列拼成一個矩陣\(I\),將\([q^1, q^2, q^3, q^4]\)作為4列拼成一個矩陣\(Q\)得到計算矩陣如下:(矩陣\(k\)\(v\)的計算方式一樣)
  1. 我們得到\(Q\)\(K\)\(V\)三個矩陣之后,下一步就是由矩陣\(Q\)\(K\)計算關聯性\(\alpha\),先以計算\(q^1\)的關聯性為例,將矩陣\(q^1\)分別與矩陣\([k^1, k^2, k^3, k^4]\)相乘得到\([\alpha_{1,1}, \alpha_{1,2}, \alpha_{1,3}, \alpha_{1, 4}]\)(我們現在是看作矩陣運算,為了方便計算,我們先對矩陣\(k^i\)進行轉置,在和矩陣\(q^1\)相乘):
  1. 我們將第一步中得到的矩陣\(K\)整體轉置,與矩陣\(Q\)相乘,得到所有的相關性矩陣\(A\);然后對attention分數(相關性)做normalization,即每次對\(A\)中的一列(每列對應着一個\(q^i\))做softmax(也可以是其他激活函數),讓每一列的值相加為1,得到矩陣\(A'\),如下圖所示:
  1. 我們將矩陣\(V\)依次乘以矩陣\(A'\)中的每一列得到輸出\([b^1, b^2, b^3, b^4]\),如下圖所示:

綜上所述,矩陣計算公式如下:

  1. 計算\(Q\)\(K\)\(V\)三個矩陣

\[\begin{aligned} & Q = W^qI \\ & K = W^kI \\ & V = W^vI \\ \end{aligned} \]

  1. 計算相關性並使用softmax作normalization:

\[\begin{aligned} & A = K^TQ \\ & A' = softmax \left(A \right) \end{aligned} \]

  1. 計算最后的輸出

\[O = VA' \]

通過上述計算過程,我們可以看出只有\(W^q\)\(W^k\)\(W^v\)三個矩陣是未知的,需要我們通過訓練資料將他們學習出來


Multi-head Self-Attention

Self-Attention有一個使用非常廣泛的的進階版Multi-head Self-Attention,具體使用多少個head,是一個需要我們自己調節的超參數(hyper parameter)。

在Self-Attention中,我們是使用\(q\)去尋找與之相關的\(k\),但是這個相關性並不一定有一種。那多種相關性體現到計算方式上就是有多個矩陣\(q\),不同的\(q\)負責代表不同的相關性。我們以2 heads為例,先使用\(a\)計算得到\(q\),然后讓\(q\)乘以兩個矩陣\(W^{q,1}\)\(W^{q,2}\)得到\(q^{i,1}\)\(q^{i,2}\),代表2 heads,以同樣的方式處理\(k\)\(v\),如下圖所示:

在后續的計算中,我們只將屬於相同相關性的矩陣進行運算,如下圖所示:

  1. \(q^{i,1}\)分別與\(k^{i,1}\)\(k^{j,1}\)計算得到\(\alpha_{1,1}^1\)\(\alpha_{1,2}^1\)
  2. 然后將\(\alpha_{1,1}^1\)\(\alpha_{1,2}^1\)分別與\(v^{i,1}\)\(v^{j,1}\)相乘得到\(b^{i,1}\)
  3. 我們以同樣的方式,得到矩陣\(b^{i,2}\),將\(b^{i,1}\)\(b^{i,2}\)拼起來乘以一個矩陣\(W^O\)得到最后的輸入\(b^i\)

Positional Encoding

通過前邊的了解,可以發現對於每一個input是出現在sequence的最前面,還是最后面這樣的位置信息,Self-Attention是無法獲取到的。這樣子可能會出現一些問題,比如在做詞性標記(POS tagging)的時候,像動詞一般不會出現在句首的位置這樣的位置信息還是非常重要的。

我們可以使用positional encoding的技術,將位置信息加入到Self-Attention中。

如上圖所示,我們可以為每個位置設定一個專屬的positional vector,用\(e^i\)表示,上標\(i\)代表位置。我們先將\(e^i\)\(a^i\)相加,然后再進行后續的計算就可以了。\(e^i\)向量既可以人工設置,也可以通過某些function或model來生成,具體可以查閱相關論文。


參考資料:
《神經網絡與深度學習》 邱錫鵬


免責聲明!

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



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