注意力机制--转载自我的学生隆兴写的博客
原文鏈接為:https://a-egoist.com/posts/a44b8419/,學(xué)生自己搭建的博客,點贊!
1 Attention
1.1 什么是 Attention
靈長類動物的視覺系統(tǒng)中的視神經(jīng)接受了大量的感官輸入。在檢查視覺場景時,我們的視覺神經(jīng)系統(tǒng)大約每秒收到 10810^8108 位的信息,這遠(yuǎn)遠(yuǎn)超過了大腦能夠完全處理的水平。但是,并非所有刺激的影響都是相等的。意識的聚集和專注使靈長類動物能夠在復(fù)雜的視覺環(huán)境中將注意力引向感興趣的物體,例如獵物和天敵。
在心理學(xué)框架中,人類根據(jù)隨意(有意識)線索和不隨意(無意識)線索選擇注意點。下面兩張圖展現(xiàn)了在隨意線索和不隨意線索的影響下,眼的注意力集中的位置。
卷積、全連接層、池化層基本上都只考慮不隨意線索,注意力機制則顯式地考慮隨意線索。
在注意力機制中,定義以下三點:
- 隨意線索被稱為查詢(query)
- 每個輸入是一個不隨意線索(key)和值(value)的 pair
- 通過注意力池化層來有偏向性的選擇某些輸入
- 一般寫作 f(x)=∑iα(x,xi)yif(x)=\sum_i\alpha(x,x_i)y_if(x)=∑i?α(x,xi?)yi?,其中 α(x,xi)\alpha(x,x_i)α(x,xi?) 表示注意力權(quán)重
1.2 非參注意力池化層
早在 60 年代就出現(xiàn)了非參數(shù)的注意力機制。假設(shè)給定數(shù)據(jù) (xi,yi),i=1,…,n(x_i,y_i),i=1,\dots,n(xi?,yi?),i=1,…,n,其中 xix_ixi? 表示 key,yiy_iyi? 表示 value,要想根據(jù) query 將數(shù)據(jù)進(jìn)行池化
最簡單的方案——平均池化:
f(x)=1n∑iyi(1)f(x)=\frac{1}{n}\sum_iy_i\tag{1} f(x)=n1?i∑?yi?(1)
無論輸入的 xxx 是什么,每次都返回所有 value 的均值。
Nadaraya-Waston 核回歸:
f(x)=∑i=1nK(x?xi)∑j=1nK(x?xj)yi(2)f(x)=\sum_{i=1}^{n} \frac{K\left(x-x_{i}\right)}{\sum_{j=1}^{n} K\left(x-x_{j}\right)} y_{i}\tag{2} f(x)=i=1∑n?∑j=1n?K(x?xj?)K(x?xi?)?yi?(2)
其中,f(?)f(\cdot)f(?) 中的 xxx 表示 query,K(?)K(\cdot)K(?) 表示核函數(shù),用于衡量 query xxx 和 key xix_ixi? 之間的距離。這一個方法可以類比于 K-Nearest Neighbor,對于一個 query 函數(shù)的輸出跟傾向于與其最相關(guān)的 value,而這個相關(guān)性則通過 query 和 key 共同計算出來。
若公式 (2)(2)(2) 中的 K(?)K(\cdot)K(?) 使用的是高斯核:K(μ)=12πexp?(?μ22)K(\mu)=\frac{1}{\sqrt{2\pi}}\exp(-\frac{\mu^2}{2})K(μ)=2π?1?exp(?2μ2?),那么可得:
f(x)=∑i=1nexp?(?12(x?xi)2)∑j=1nexp?(?12(x?xj)2)yi=∑i=1nsoftmax?(?12(x?xi)2)yi(3)\begin{aligned} f(x) &=\sum_{i=1}^{n} \frac{\exp \left(-\frac{1}{2}\left(x-x_{i}\right)^{2}\right)}{\sum_{j=1}^{n} \exp \left(-\frac{1}{2}\left(x-x_{j}\right)^{2}\right)} y_{i} \\ &=\sum_{i=1}^{n} \operatorname{softmax}\left(-\frac{1}{2}\left(x-x_{i}\right)^{2}\right) y_{i} \end{aligned}\tag{3} f(x)?=i=1∑n?∑j=1n?exp(?21?(x?xj?)2)exp(?21?(x?xi?)2)?yi?=i=1∑n?softmax(?21?(x?xi?)2)yi??(3)
1.3 參數(shù)化的注意力機制
在公式 (3)(3)(3) 的基礎(chǔ)上引入可以學(xué)習(xí)的參數(shù) www:
f(x)=∑i=1nsoftmax?(?12((x?xi)w)2)yi(4)f(x)=\sum_{i=1}^{n} \operatorname{softmax}\left(-\frac{1}{2}\left(\left(x-x_{i}\right) w\right)^{2}\right) y_{i}\tag{4} f(x)=i=1∑n?softmax(?21?((x?xi?)w)2)yi?(4)
1.4 注意力分?jǐn)?shù)
由公式 (3)(3)(3) 可得:
f(x)=∑iα(x,xi)yi=∑i=1nsoftmax?(?12(x?xi)2)yi(5)f(x)=\sum_{i} \alpha\left(x, x_{i}\right) y_{i}=\sum_{i=1}^{n} \operatorname{softmax}\left(-\frac{1}{2}\left(x-x_{i}\right)^{2}\right) y_{i}\tag{5} f(x)=i∑?α(x,xi?)yi?=i=1∑n?softmax(?21?(x?xi?)2)yi?(5)
其中 α(?)\alpha(\cdot)α(?) 表示注意力權(quán)重,根據(jù)輸入的 query 和 key 來計算當(dāng)前 value 的權(quán)重;?12(x?xi)2-\frac{1}{2}\left(x-x_{i}\right)^{2}?21?(x?xi?)2 表示的就是注意力分?jǐn)?shù)。
計算注意力的過程如圖所示:
首先根據(jù)輸入的 query,來計算 query 和 key 之間的 attention score,然后將 score 進(jìn)行一次 softmax?\operatorname{softmax}softmax 得到 attention weight,attention weight 和對應(yīng)的 value 做乘法再求和得到最后的輸出。
拓展到高緯度
假設(shè) query q∈Rq\mathbf{q} \in \mathbb{R}^{q}q∈Rq,mmm 對 key-value (k1,v1),…,(\mathbf{k}_{1}, \mathbf{v}_{1}),\dots,(k1?,v1?),…, 這里 ki∈Rk\mathbf{k}_{i} \in \mathbb{R}^{k}ki?∈Rk,vi∈Rv\mathbf{v}_{i} \in \mathbb{R}^{v}vi?∈Rv
注意力池化層:
f(q,(k1,v1),…,(km,vm))=∑i=1mα(q,ki)vi∈Rvα(q,ki)=softmax?(a(q,ki))=exp?(a(q,ki))∑j=1mexp?(a(q,kj))∈R(6)\begin{array}{c} f\left(\mathbf{q},\left(\mathbf{k}_{1}, \mathbf{v}_{1}\right), \ldots,\left(\mathbf{k}_{m}, \mathbf{v}_{m}\right)\right)=\sum_{i=1}^{m} \alpha\left(\mathbf{q}, \mathbf{k}_{i}\right) \mathbf{v}_{i} \in \mathbb{R}^{v} \\ \alpha\left(\mathbf{q}, \mathbf{k}_{i}\right)=\operatorname{softmax}\left(a\left(\mathbf{q}, \mathbf{k}_{i}\right)\right)=\frac{\exp \left(a\left(\mathbf{q}, \mathbf{k}_{i}\right)\right)}{\sum_{j=1}^{m} \exp \left(a\left(\mathbf{q}, \mathbf{k}_{j}\right)\right)} \in \mathbb{R} \end{array}\tag{6} f(q,(k1?,v1?),…,(km?,vm?))=∑i=1m?α(q,ki?)vi?∈Rvα(q,ki?)=softmax(a(q,ki?))=∑j=1m?exp(a(q,kj?))exp(a(q,ki?))?∈R?(6)
其中 softmax?(?)\operatorname{softmax}(\cdot)softmax(?) 中的參數(shù) a(q,ki)a(\mathbf{q},\mathbf{k}_i)a(q,ki?) 表示注意力分?jǐn)?shù)。
從公式 (6)(6)(6) 可以看出,我們應(yīng)該關(guān)注 a(?)a(\cdot)a(?) 怎么設(shè)計,接下來介紹兩種思路。
1.4.1 Additive Attention
可學(xué)參數(shù):Wk∈Rh×k,Wq∈Rh×q,v∈Rh\mathbf{W}_{k}\in\mathbb{R}^{h\times k},\mathbf{W}_{q}\in\mathbb{R}^{h\times q},\mathbf{v}\in \mathbb{R}^{h}Wk?∈Rh×k,Wq?∈Rh×q,v∈Rh
a(k,q)=vTtanh?(Wkk+Wqq)a(\mathbf{k}, \mathbf{q})=\mathbf{v}^{T} \tanh \left(\mathbf{W}_{k} \mathbf{k}+\mathbf{W}_{q} \mathbf{q}\right) a(k,q)=vTtanh(Wk?k+Wq?q)
其中 tanh?(?)\operatorname{tanh}(\cdot)tanh(?) 表示 tanh 激活函數(shù)。等價于將 query 和 key 合并起來后放到一個隱藏層大小為 h 輸出大小為 1 的單隱藏層 MLP
該方法中 query、key 和 value 的長度可以不一樣。
1.4.2 Scaled Dot-Product Attention
如果 query 和 key 都是同樣的長度 q,ki∈Rd\mathbf{q},\mathbf{k}_i\in\mathbb{R}^dq,ki?∈Rd,那么可以:
a(q,ki)=?q,ki?/da\left(\mathbf{q}, \mathbf{k}_i\right)=\left\langle\mathbf{q}, \mathbf{k}_i\right\rangle/\sqrtze8trgl8bvbq a(q,ki?)=?q,ki??/d?
向量化版本
query Q∈Rn×d\mathbf{Q} \in \mathbb{R}^{n \times d}Q∈Rn×d, key K∈Rm×d\mathbf{K} \in \mathbb{R}^{m \times d}K∈Rm×d, value V∈Rm×v\mathbf{V} \in \mathbb{R}^{m \times v}V∈Rm×v
attention score: a(Q,K)=QKT/d∈Rn×ma(\mathbf{Q}, \mathbf{K})=\mathbf{Q K}^{T} / \sqrtze8trgl8bvbq \in \mathbb{R}^{n \times m}a(Q,K)=QKT/d?∈Rn×m
attention pooling: f=softmax?(a(Q,K))V∈Rn×vf=\operatorname{softmax}(a(\mathbf{Q}, \mathbf{K})) \mathbf{V} \in \mathbb{R}^{n \times v}f=softmax(a(Q,K))V∈Rn×v
2 Self-attention
2.1 什么是 Self-attention
下面三幅圖展示了 CNN、RNN 和 self-attention 如何處理一個序列的輸入。
CNN 會考慮當(dāng)前輸入和其前面的 n 個輸入以及后面 n 個輸入的關(guān)系。
RNN 會考慮當(dāng)前輸入和其前面的所有輸入的關(guān)系。
Self-attention 會考慮當(dāng)前輸入和全局輸入的關(guān)系。
總的來說,Self-attention 可以表述為:給定序列 x1,…,xn,?xi∈Rd\mathbf{x}_{1},\ldots,\mathbf{x}_{n},\forall \mathbf{x}_{i}\in\mathbb{R}^ze8trgl8bvbqx1?,…,xn?,?xi?∈Rd,自注意力池化層將 xi\mathbf{x}_{i}xi? 當(dāng)做 key, value, query 來對序列抽取特征得到 y1,…,yn\mathbf{y}_{1},\ldots,\mathbf{y}_{n}y1?,…,yn?,這里
yi=f(xi,(x1,x1),…,(xn,xn))∈Rd\mathbf{y}_{i}=f\left(\mathbf{x}_{i},\left(\mathbf{x}_{1}, \mathbf{x}_{1}\right), \ldots,\left(\mathbf{x}_{n}, \mathbf{x}_{n}\right)\right) \in \mathbb{R}^ze8trgl8bvbq yi?=f(xi?,(x1?,x1?),…,(xn?,xn?))∈Rd
2.2 Self-attention 怎樣運作
對于每一個輸入 aia^iai 在考慮其與全局的關(guān)聯(lián)性之后得到 bib^ibi
如何計算 a1a^1a1 和 a2,a3,a4a^2,a^3,a^4a2,a3,a4 的關(guān)聯(lián)性?在 1.4 節(jié)中介紹的注意力分?jǐn)?shù)計算方法就是用于計算 query 和 key 之間關(guān)聯(lián)性的方法。即常用的 Dot-product attention 和 Additive attention。
計算 a1a^1a1 和 a2,a3,a4a^2,a^3,a^4a2,a3,a4 的關(guān)聯(lián)性
對于輸入 aia^iai 將其分別左乘上矩陣 Wq,Wk,WvW^q,W^k,W^vWq,Wk,Wv 得到 qi,ki,viq^i,k^i,v^iqi,ki,vi,然后利用 qi,kjq^i,k^jqi,kj 計算 ai,aja^i,a^jai,aj 之間的關(guān)聯(lián)性,計算結(jié)果為 attention score,將 attention score 放入激活函數(shù)后得到 attention weight,attention weight 乘上 vjv^jvj 再求和可得到 bib^ibi,即 aia^iai 對應(yīng)的輸出。
矩陣化
通過上面的幾張圖可以看出,雖然 Self-attention 中間做了很多復(fù)雜的工作,但是在 Self-attention 中需要學(xué)習(xí)的參數(shù)只有 Wq,Wk,WvW^q,W^k,W^vWq,Wk,Wv,其他的參數(shù)都是預(yù)先設(shè)定好的。
2.3 Multi-head Self-attention
在 Self-attention 中,我們使用 query 去需要相關(guān)的 key,但是相關(guān)有很多種不同的定義,不同的定義與不同的 query 綁定,即同一個輸入需要有多個 query。
在上圖中,在 Self-attention 的基礎(chǔ)上對于每個 qi,ki,viq^i,k^i,v^iqi,ki,vi 其左乘上一個矩陣可以得到 qi,1,qi,2,ki,1,ki,2,vi,1,vi,2q^{i,1},q^{i,2},k^{i,1},k^{i,2},v^{i,1},v^{i,2}qi,1,qi,2,ki,1,ki,2,vi,1,vi,2,然后按照 Self-attention 中相同的計算方式可以得到 bi,1,bi,2b^{i,1},b^{i,2}bi,1,bi,2。
然后將得到的 bi,1,bi,2b^{i,1},b^{i,2}bi,1,bi,2 接起來左乘一個矩陣就可以得到 Multi-head Self-attention 的輸出 bib^ibi。
2.4 Position Encoding
因為 Self-attention 考慮的是全局的信息,而且即便輸入的順序改變了,也不會影響輸出的結(jié)果。但是在實際的應(yīng)用中,很多時候需要考慮位置信息,例如一個 sequence。因此,為了讓 Self-attention 能夠考慮到位置信息,為每個輸入加上一個 position encoding。
其中 eie^iei 表示在每個輸入上增加的 position encoding 信息,對于每個 aia^iai 都有一個專屬的 eie^iei 與之對應(yīng)。eie^iei 產(chǎn)生的方式有很多種,在論文 Learning to Encode Position for Transformer with Continuous Dynamical Model 中提出并比較了 position encoding。
2.5 Self-attention for Image
對于一張 shape = (5, 10, 3) 的 RGB 圖片,可以將其看成一個 vector set,其中的每一個 pixel 都可以看成一個 vector (r, g, b),然后就可以將其放入 Self-attention 模型進(jìn)行計算。
3 Self-attention v.s. CNN
CNN 和 Self-attention 都可以考慮一定范圍內(nèi)的信息,但是 CNN 只能夠考慮到感受野內(nèi)的信息,而 Self-attention 能夠考慮到全局的信息。因此可以把 CNN 看做 Self-attention 的簡化版本,Self-attention 看做 CNN 的復(fù)雜化版本。
從集合的角度來看,CNN 可以看做是 Self-attention 的子集。在論文 ON THE RELATIONSHIP BETWEEN SELF-ATTENTION AND CONVOLUTIONAL LAYERS 中詳細(xì)介紹了 Self-attention 和 CNN 的關(guān)系。
從下圖(出自論文 AN IMAGE IS WORTH 16X16 WORDS: TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE)中的數(shù)據(jù)可以看出,利用較小的數(shù)據(jù)量訓(xùn)練時,CNN 的效果優(yōu)于 Self-attention,但是隨著數(shù)據(jù)量的增大,Self-attention 的效果越來越好,在數(shù)據(jù)量達(dá)到 300 Million 的時候 Self-attention 的效果會優(yōu)于 CNN。
4 Summary
本篇博客對 attention 做了一個基本介紹,然后又介紹了 attention 最常用的一種實現(xiàn) Self-attention,Self-attention 在 Transformer 和 BERT 中有著舉足輕重的地位。我最開始學(xué)習(xí) attention 的目的,是為了了解其在 computer vision 方向的應(yīng)用,所以在之后的博客中我會更加詳細(xì)的介紹目前 attention 在 computer vision 方向的應(yīng)用以及遇到的問題。
References
《動手學(xué)深度學(xué)習(xí)》
64 注意力機制【動手學(xué)深度學(xué)習(xí)v2】
65 注意力分?jǐn)?shù)【動手學(xué)深度學(xué)習(xí)v2】
67 自注意力【動手學(xué)深度學(xué)習(xí)v2】
68 Transformer【動手學(xué)深度學(xué)習(xí)v2】
Transformer論文逐段精讀【論文精讀】
(強推)李宏毅2021春機器學(xué)習(xí)課程
[【機器學(xué)習(xí)2021】自注意力機制 (Self-attention) slides]
總結(jié)
以上是生活随笔為你收集整理的注意力机制--转载自我的学生隆兴写的博客的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php扑克牌排序,PHP实现判断扑克牌5
- 下一篇: 深度学习-自然语言处理中的近似训练