文章目錄
什麼是Attention
- Attention(注意力機制)是一種機制,可以應用到許多不同的模型中,像CNN、RNN、seq2seq等。Attention通過權重給模型賦予了區分辨別的能力,從而抽取出更加關鍵及重要的信息,使模型做出更加準確的判斷,同時不會對模型的計算和存儲帶來更大的開銷。
- Attention模型的基本表述可以這樣理解成:當我們人在看一樣東西的時候,我們當前時刻關注的一定是我們當前正在看的這樣東西的某一地方,換句話說,當我們目光移到別處時,注意力隨着目光的移動野在轉移,這意味着,當人們注意到某個目標或某個場景時,該目標內部以及該場景內每一處空間位置上的注意力分佈是不一樣的。
- 這一點在如下情形下同樣成立:當我們試圖描述一件事情,我們當前時刻說到的單詞和句子和正在描述的該事情的對應某個片段最先關,而其他部分隨着描述的進行,相關性也在不斷地改變。
舉個例子:
Attention 機制很像人類看圖片的邏輯,當我們看一張圖片的時候,我們並沒有看清圖片的全部內容,而是將注意力集中在了圖片的焦點上。大家看一下下面這張圖:像上面這張圖,密碼這倆個字比較大,我們一般先看到的是密碼,其次是上面的NLP智慧語言的魔力人際溝通的…,但是很少會有人注意到右下角的https://blog.csdn.net/qq_19409848這個網址。
這就是我們的視覺系統就是一種 Attention機制,將有限的注意力集中在重點信息上,從而節省資源,快速獲得最有效的信息。
爲什麼需要Attention?
- 最基本的seq2seq模型包含一個encoder和一個decoder,通常的做法是將一個輸入的句子編碼成一個固定大小的state,然後作爲decoder的初始狀態(當然也可以作爲每一時刻的輸入),但這樣的一個狀態對於decoder中的所有時刻都是一樣的。
- 序列輸入時,隨着序列的不斷增長,原始根據時間步的方式的表現越來越差,這是由於原始的這種時間步模型設計的結構有缺陷,即所有的上下文輸入信息都被限制到固定長度,整個模型的能力都同樣收到限制,我們暫且把這種原始的模型稱爲簡單的編解碼器模型。
- 編解碼器的結構無法解釋,也就導致了其無法設計。
- 在RNN的原始問題中,對於長序列的文本效果不是很好,因爲長時間的長序列導致長時依賴爲題。前面的一些信息被丟失
下圖中是沒有加入Attention時的seq2seq:
- attention即爲注意力,需要attention的原因是非常直觀的。比如,我們期末考試的時候,我們需要老師劃重點,劃重點的目的就是爲了儘量將我們的attention放在這部分的內容上,以期用最少的付出獲取儘可能高的分數;
下圖中是加入Attention時的seq2seq:動圖:
Attention 的3大優點
- 參數少:模型複雜度跟 CNN、RNN 相比,複雜度更小,參數也更少。所以對算力的要求也就更小。
- 速度快:Attention 解決了 RNN 不能並行計算的問題。Attention機制每一步計算不依賴於上一步的計算結果,因此可以和CNN一樣並行處理。
- 效果好:在 Attention 機制引入之前,有一個問題大家一直很苦惱:長距離的信息會被弱化,就好像記憶能力弱的人,記不住過去的事情是一樣的。Attention 是挑重點,就算文本比較長,也能從中間抓住重點,不丟失重要的信息。下圖紅色的預期就是被挑出來的重點。
Seq2Seq Attention計算過程
在計算Attention的時候使用的是編碼器的輸出,在計算狀態的時候使用的是編碼器的狀態信息。
- Encoder hidden states(編碼器的輸出)/output values(狀態):; 總Encoder時刻n個。
- 時刻t,Decoder hidden states(解碼器的狀態): ;
- 基於每個時刻Encoder輸出以及上一個時刻Decoder的狀態來構建Attention Scores(評分/置信度):
- 對e進行softmax轉換,得到概率分佈:
- 基於概率分佈以及所有Encoder的狀態計算出Attention值:
- 將Decoder當前時刻的輸入和Attention值結合形成新的輸入數據然後進行普通的RNN Decoder操作
Attention Scores計算方式
乘法Attention:
加法Attention:
一種更通用的Attention的計算方式(QKV)
-
此時給定Target中的某個元素Query,通過計算Query和各個Key的相似性或 者相關性,得到每個Key對應Value的權重係數,然後對Value進行加權求和, 即得到了最終的Attention數值。
-
所以本質上Attention機制是對Source中元素 的Value值進行加權求和,而Query和Key用來計算對應Value的權重係數。
-
第一步: query 和 key 進行相似度計算,得到權值
-
第二步:將權值進行歸一化,得到直接可用的權重
-
第三步:將權重和 value 進行加權求和
Attention又一種計算方式
Seq2Seq Attention形狀
形狀一
形狀二
形狀三
Attention的計算區域
根據Attention的計算區域,可以分成以下幾種:
Soft Attention
計算Attention的時候,是與編碼器所有時刻輸出計算,受序列長度的影響,序列越長計算量就越大,運行數度就慢
- 這是比較常見的Attention方式,對所有key求權重概率,每個key都有一個對應的權重,是一種全局的計算方式(也可以叫Global Attention)。這種方式比較理性,參考了所有key的內容,再進行加權。但是計算量可能會比較大一些。
Hard Attention
把概率最大的設置爲1,剩下的設置爲0解決Soft Attention序列太長計算量大的問題
- 這種方式是直接精準定位到某個key,其餘key就都不管了,相當於這個key的概率是1,其餘key的概率全部是0。因此這種對齊方式要求很高,要求一步到位,如果沒有正確對齊,會帶來很大的影響。另一方面,因爲不可導,一般需要用強化學習的方法進行訓練。(或者使用gumbel softmax之類的)
Local Attention
- 這種方式其實是以上兩種方式的一個折中,對一個窗口區域進行計算。先用Hard方式定位到某個地方,以這個點爲中心可以得到一個窗口區域,在這個小區域內用Soft方式來算Attention。
- 和Global Attention在同一篇論文中被提出;相當於Soft Attention 和Hard Attention中間狀態(半硬半軟Attention)
- 對於時刻t的詞彙,模型首先產生一個對齊位置pt(aligned position), context vector c由編碼器中的隱狀態計算得到,編碼 器的隱狀態不是所有的隱狀態,而是在區間[pt-D, pt+D]中,D的 大小由經驗給定。
D是超參數,人爲給定。在計算Attention的時候是計算前後左右的D個Attention
Local Attention,這種方式只使用內部信息,key和value以及query只和輸入原文有關,在self attention中,key=value=query。既然沒有外部信息,那麼在原文中的每個詞可以跟該句子中的所有詞進行Attention計算,相當於尋找原文內部的關係。
Attention層次結構
結構方面根據是否劃分層次關係,分爲單層attention,多層attention和多頭attention:
- 單層Attention,這是比較普遍的做法,用一個query對一段原文進行一次attention。
- 多層Attention,一般用於文本具有層次關係的模型,假設我們把一個document劃分成多個句子,
- 在第一層,我們分別對每個句子使用attention計算出一個句向量(也就是單層attention);
- 在第二層,我們對所有句向量再做attention計算出一個文檔向量(也是一個單層attention),
- 最後再用這個文檔向量去做任務。
- 多頭Attention,這是Attention is All You Need中提到的multi-head attention,用到了多個query對一段原文進行了多次attention,每個query都關注到原文的不同部分,相當於重複做多次單層attention:
- 最後再把這些結果拼接起來:
模型方面
從模型上看,Attention一般用在CNN和LSTM上,也可以直接進行純Attention計算。
CNN+Attention
CNN的卷積操作可以提取重要特徵,我覺得這也算是Attention的思想,但是CNN的卷積感受視野是局部的,需要通過疊加多層卷積區去擴大視野。另外,Max Pooling直接提取數值最大的特徵,也像是hard attention的思想,直接選中某個特徵。
CNN上加Attention可以加在這幾方面:
- a. 在卷積操作前做attention,比如Attention-Based BCNN-1,這個任務是文本蘊含任務需要處理兩段文本,同時對兩段輸入的序列向量進行attention,計算出特徵向量,再拼接到原始向量中,作爲卷積層的輸入。
- b. 在卷積操作後做attention,比如Attention-Based BCNN-2,對兩段文本的卷積層的輸出做attention,作爲pooling層的輸入。
- c. 在pooling層做attention,代替max pooling。比如Attention pooling,首先我們用LSTM學到一個比較好的句向量,作爲query,然後用CNN先學習到一個特徵矩陣作爲key,再用query對key產生權重,進行attention,得到最後的句向量。
LSTM+Attention
LSTM內部有Gate機制,其中input gate選擇哪些當前信息進行輸入,forget gate選擇遺忘哪些過去信息,我覺得這算是一定程度的Attention了,而且號稱可以解決長期依賴問題,實際上LSTM需要一步一步去捕捉序列信息,在長文本上的表現是會隨着step增加而慢慢衰減,難以保留全部的有用信息。
LSTM通常需要得到一個向量,再去做任務,常用方式有:
-
a. 直接使用最後的hidden state(可能會損失一定的前文信息,難以表達全文)
-
b. 對所有step下的hidden state進行等權平均(對所有step一視同仁)。
-
c. Attention機制,對所有step的hidden state進行加權,把注意力集中到整段文本中比較重要的hidden state信息。性能比前面兩種要好一點,而方便可視化觀察哪些step是重要的,但是要小心過擬合,而且也增加了計算量。
純Attention
Attention is all you need,沒有用到CNN/RNN,乍一聽也是一股清流了,但是仔細一看,本質上還是一堆向量去計算attention。
相似度計算方式
在做attention的時候,我們需要計算query和某個key的分數(相似度),常用方法有:
- 點乘:最簡單的方法,
- 矩陣相乘:
- cos相似度:
- 串聯方式:把q和k拼接起來,
- 用多層感知機也可以:
引用
https://easyai.tech/ai-definition/attention/