Attention的計算過程


本文參考以及圖片來源Transformer詳解

首先假設我們有序列 x1、x2、x3 和 x4 這四個序列,首先我們進行一次權重的乘法 \({a^i} = W{x^i}\) ,得到新的序列 a1、a2、a3 和 a4。示意圖如下所示:

然后我們將輸入 a 分別乘以三個不同的權重矩陣 W 分別得到 q、k、 v 三個向量,公式分別是\({q^i} = {W^q}{a^i}\)、${k^i} = {W^k} {v^i} \(、\)v^i = {Wv}{ai}$,這里面 q 表示的是 query,是需要 match 其他的向量的;k 表示的是 key,是需要被 q 來match的,v 表示 value,表示需要被抽取出來的信息。示意圖如下所示:

transformer

接下來我們需要做的就是將每一個query q 對每一個key k 做 attention 操作,那么 attention 操作是如何做呢,目的是輸入兩個向量,輸出一個數,那么我們可以將這兩個向量做內積:q1 和 k1 做attention 得到\(\alpha_{1,1}\) ,q1 和 k2 做attention 得到 \(\alpha_{1,2}\),q1 和 k3 做attention 得到 \(\alpha_{1,3}\),q1 和 k4 做attention 得到\(\alpha_{1,4}\)。其中,attention 的操作可以用很多方法來做,這里我們可以用到一種叫做 scaled 點積,公式是\({\alpha _{1,i}} = q1 \cdot ki/\sqrt d\),這里的 d 表示 q 和 v 的維度。做 attention 的流程如下圖所示:

transformer

最后我們將\(\alpha _{1,1}\)\(\alpha _{1,2},\)\(\alpha _{1,3}\)\(\alpha _{1,4}\),這四個值進行一個 softmax 操作,得到\({\hat \alpha _{1,1}}\)\({\hat \alpha _{1,2}}\)\({\hat \alpha _{1,3}}\)\({\hat \alpha _{1,4}}\),如圖所示:

transformer

有了 softmax 的輸出之后,我們再通過公式\(\sum\limits_i {{{\hat \alpha }_{1,i}} \cdot vi}\) ,將\({{{\hat \alpha }_{1,i}}}\) 分別和\(v_i\)進行點乘之后再求和可以得到 \(b_1\)。整個流程如圖所示:

img

由上圖可以知道,我們求得 b1 的時候,已經看到了a2、a3 和 a4 的輸入。所以這個時候的輸出,有機會瀏覽到整個序列。但是每一個輸出的序列都有自己重點關注的地方,這個就是 attention 機制的精髓所在,我們可以通過控制\({\hat \alpha _{1,1}}\)\({\hat \alpha _{1,2}}\)\({\hat \alpha _{1,3}}\)\({\hat \alpha _{1,4}}\) 來控制我們當前輸出所關注的序列權重,如果某一塊序列需要被關注,那么就賦予對應\(\alpha\) 值的高權重,反之則相反。這是用 q1 做attention 可以求得 整個的輸出 b1,同理我們可以用 q2、q3 和 q4 分別做 attention 求得 b2、b3 和 b4。而且b1、b2、b3 和 b4 是平行被計算出來的,互相是沒有先后順序的影響的。所以整個中間的計算過程可以看做是一個 self-attention layer,輸入 x1、x2、x3 和 x4,輸出是 b1、b2、b3 和 b4。示意圖如圖所示:

transformer


免責聲明!

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



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