① 自注意力機制(self-attention)——考慮全局又聚焦重點
有時候我們期望網路能夠看到全局,但是又要聚焦到重點信息上。比如在在做自然語言處理時,句子中的一個詞往往不是獨立的,和它上下文相關,但是和上下文中不同的詞的相關性是不同的,所以我們在處理這個詞時,在看到它的上下文的同時也要更加聚焦與它相關性更高的詞,這就要用到常說的 自注意力機制 。比如下面這兩幅圖,通過自注意力機制處理後,計算出了詞間的相關性,可以看到第一個圖的it與animal的相關性很強,第二個圖it與street的相關性很強。那麼如何實現自注意力機制呢?
自注意力機制的核心是捕捉向量之間的相關性。比如下面這幅圖,輸出一個向量 不只看 本身,還要看 、 、 ,但是看它們的程度不一樣。這就需要分別計算 與 、 、 之間的相關性 , 越大,相關性越高,給予的重視程度就越高。那麼如何讓網路自動計算出兩個向量之間的相關性呢?
通過上面計算出的注意力分數 ,我們已經知道 要給予 、 、 、 的關注程度了,接下來我們抽取這些向量中重要的信息以輸出 了。具體的做法如下圖所示。首先我們再將 、 、 、 乘以一個新的變換矩陣 得到向量 ,這里的 向量也有個專門的名字,叫做 「value」 。然後將向量 分別乘以對應的注意力分數 ,並進行求和,輸出向量 。從這里可以看出,所有向量都有參與計算,這樣就做到了看全局。但是各向量參與計算的程度不一樣, 就相當權重值,權重值越大的,對應向量參與計算的程度就越大,最後得到的輸出向量 就和該向量越相似。這樣就做到了看全局又聚焦重點。通過上述同樣的計算方式,也可以計算得到 ,而且 是可以並行計算的。以上就是自注意力機制的全部了,但是對自注意力機制的解析並沒有結束,下面從矩陣計算的角度來看自注意力機制。
前面提到將 、 、 、 分別乘以變換矩陣 得到向量 。我們將輸入向量 、 、 、 拼在一起,得到一個矩陣用 表示,即, 將key向量 、 、 、 拼在一起得到一個矩陣用 表示,即, 用矩陣相乘表示 矩陣的計算過程即, 同理,query向量拼成的矩陣 等於, value向量拼成的矩陣 等於, 。下圖展示了上述計算過程。
前面提到將 和四個key向量 分別做點積,得到四個相關性數值 。注意這里的向量都是列向量,所以點積可以寫成,
用矩陣計算表示上述計算過程為 將 與 相乘可以得到相似的結果,即, 矩陣通過softmax層歸一化後得到 。上述計算過程如下圖所示。
前面講到將向量 分別乘以對應的注意力分數 ,並進行求和,輸出向量 ,這個過程用矩陣計算可表示為,
通過相似的計算,也可以得到 ,即,
綜上,自注意力機制的計算過程可總結為,
(1)計算 矩陣
(2)計算注意力分數矩陣
(3)計算輸出矩陣
自注意力機制還有一個進階版,叫 多頭自注意力機制(multi-head self-attention) 。為什麼要多頭呢?自注意力機制實質上是用過 向量去找相關的 向量,但是相關性可能有多種,一個 只能找到一種相關的 向量,因此就要引入多個 向量和 向量來捕捉多種相關性。多頭自注意力機制很簡單,設置多組矩陣 ,每一組 只進行內部計算,得到相應的輸出 ,如下圖所示。
② 為什麼說Transformer的注意力機制是相對廉價的注意力機制相對更對於RNN系列及CNN系列演算法有何優勢
QA形式對自然語言處理中注意力機制(Attention)進行總結,並對Transformer進行深入解析。
二、Transformer(Attention Is All You Need)詳解
1、Transformer的整體架構是怎樣的?由哪些部分組成?
2、Transformer Encoder 與 Transformer Decoder 有哪些不同?
3、Encoder-Decoder attention 與self-attention mechanism有哪些不同?
4、multi-head self-attention mechanism具體的計算過程是怎樣的?
5、Transformer在GPT和Bert等詞向量預訓練模型中具體是怎麼應用的?有什麼變化?
一、Attention機制剖析
1、為什麼要引入Attention機制?
根據通用近似定理,前饋網路和循環網路都有很強的能力。但為什麼還要引入注意力機制呢?
計算能力的限制:當要記住很多「信息「,模型就要變得更復雜,然而目前計算能力依然是限制神經網路發展的瓶頸。
優化演算法的限制:雖然局部連接、權重共享以及pooling等優化操作可以讓神經網路變得簡單一些,有效緩解模型復雜度和表達能力之間的矛盾;但是,如循環神經網路中的長距離以來問題,信息「記憶」能力並不高。
可以藉助人腦處理信息過載的方式,例如Attention機制可以提高神經網路處理信息的能力。
2、Attention機制有哪些?(怎麼分類?)
當用神經網路來處理大量的輸入信息時,也可以借鑒人腦的注意力機制,只 選擇一些關鍵的信息輸入進行處理,來提高神經網路的效率。按照認知神經學中的注意力,可以總體上分為兩類:
聚焦式(focus)注意力:自上而下的有意識的注意力,主動注意——是指有預定目的、依賴任務的、主動有意識地聚焦於某一對象的注意力;
顯著性(saliency-based)注意力:自下而上的有意識的注意力,被動注意——基於顯著性的注意力是由外界刺激驅動的注意,不需要主動干預,也和任務無關;可以將max-pooling和門控(gating)機制來近似地看作是自下而上的基於顯著性的注意力機制。
在人工神經網路中,注意力機制一般就特指聚焦式注意力。
3、Attention機制的計算流程是怎樣的?
Attention機制的實質其實就是一個定址(addressing)的過程,如上圖所示:給定一個和任務相關的查詢Query向量q,通過計算與Key的注意力分布並附加在Value上,從而計算Attention Value,這個過程實際上是Attention機制緩解神經網路模型復雜度的體現:不需要將所有的N個輸入信息都輸入到神經網路進行計算,只需要從X中選擇一些和任務相關的信息輸入給神經網路。
step1-信息輸入:用X= [x1, · · · , xN ]表示N 個輸入信息;
step2-注意力分布計算:令Key=Value=X,則可以給出注意力分布
我們將稱之為注意力分布(概率分布),為注意力打分機制,有幾種打分機制:
step3-信息加權平均:注意力分布可以解釋為在上下文查詢q時,第i個信息受關注的程度,採用一種「軟性」的信息選擇機制對輸入信息X進行編碼為:
這種編碼方式為軟性注意力機制(soft Attention),軟性注意力機制有兩種:普通模式(Key=Value=X)和鍵值對模式(Key!=Value)。
4、Attention機制的變種有哪些?
與普通的Attention機制(上圖左)相比,Attention機制有哪些變種呢?
變種1-硬性注意力:之前提到的注意力是軟性注意力,其選擇的信息是所有輸入信息在注意力 分布下的期望。還有一種注意力是只關注到某一個位置上的信息,叫做硬性注意力(hard attention)。硬性注意力有兩種實現方式:(1)一種是選取最高概率的輸入信息;(2)另一種硬性注意力可以通過在注意力分布式上隨機采樣的方式實現。硬性注意力模型的缺點:
變種2-鍵值對注意力:即上圖右邊的鍵值對模式,此時Key!=Value,注意力函數變為:
變種3-多頭注意力:多頭注意力(multi-head attention)是利用多個查詢Q = [q1, · · · , qM],來平行地計算從輸入信息中選取多個信息。每個注意力關注輸入信息的不同部分,然後再進行拼接:
5、一種強大的Attention機制:為什麼自注意力模型(self-Attention model)在長距離序列中如此強大?
(1)卷積或循環神經網路難道不能處理長距離序列嗎?
當使用神經網路來處理一個變長的向量序列時,我們通常可以使用卷積網路或循環網路進行編碼來得到一個相同長度的輸出向量序列,如圖所示:
從上圖可以看出,無論卷積還是循環神經網路其實都是對變長序列的一種「局部編碼」:卷積神經網路顯然是基於N-gram的局部編碼;而對於循環神經網路,由於梯度消失等問題也只能建立短距離依賴。
(2)要解決這種短距離依賴的「局部編碼」問題,從而對輸入序列建立長距離依賴關系,有哪些辦法呢?
由上圖可以看出,全連接網路雖然是一種非常直接的建模遠距離依賴的模型, 但是無法處理變長的輸入序列。不同的輸入長度,其連接權重的大小也是不同的。
這時我們就可以利用注意力機制來「動態」地生成不同連接的權重,這就是自注意力模型(self-attention model)。由於自注意力模型的權重是動態生成的,因此可以處理變長的信息序列。
總體來說,為什麼自注意力模型(self-Attention model)如此強大:利用注意力機制來「動態」地生成不同連接的權重,從而處理變長的信息序列。
(3)自注意力模型(self-Attention model)具體的計算流程是怎樣的呢?
同樣,給出信息輸入:用X = [x1, · · · , xN ]表示N 個輸入信息;通過線性變換得到為查詢向量序列,鍵向量序列和值向量序列:
上面的公式可以看出,self-Attention中的Q是對自身(self)輸入的變換,而在傳統的Attention中,Q來自於外部。
注意力計算公式為:
自注意力模型(self-Attention model)中,通常使用縮放點積來作為注意力打分函數,輸出向量序列可以寫為:
二、Transformer(Attention Is All You Need)詳解
從Transformer這篇論文的題目可以看出,Transformer的核心就是Attention,這也就是為什麼本文會在剖析玩Attention機制之後會引出Transformer,如果對上面的Attention機制特別是自注意力模型(self-Attention model)理解後,Transformer就很容易理解了。
1、Transformer的整體架構是怎樣的?由哪些部分組成?
Transformer其實這就是一個Seq2Seq模型,左邊一個encoder把輸入讀進去,右邊一個decoder得到輸出:
Transformer=Transformer Encoder+Transformer Decoder
(1)Transformer Encoder(N=6層,每層包括2個sub-layers):
sub-layer-1:multi-head self-attention mechanism,用來進行self-attention。
sub-layer-2:Position-wise Feed-forward Networks,簡單的全連接網路,對每個position的向量分別進行相同的操作,包括兩個線性變換和一個ReLU激活輸出(輸入輸出層的維度都為512,中間層為2048):
每個sub-layer都使用了殘差網路:
(2)Transformer Decoder(N=6層,每層包括3個sub-layers):
sub-layer-1:Masked multi-head self-attention mechanism,用來進行self-attention,與Encoder不同:由於是序列生成過程,所以在時刻 i 的時候,大於 i 的時刻都沒有結果,只有小於 i 的時刻有結果,因此需要做Mask。
sub-layer-2:Position-wise Feed-forward Networks,同Encoder。
sub-layer-3:Encoder-Decoder attention計算。
2、Transformer Encoder 與 Transformer Decoder 有哪些不同?
(1)multi-head self-attention mechanism不同,Encoder中不需要使用Masked,而Decoder中需要使用Masked;
(2)Decoder中多了一層Encoder-Decoder attention,這與 self-attention mechanism不同。
3、Encoder-Decoder attention 與self-attention mechanism有哪些不同?
它們都是用了 multi-head計算,不過Encoder-Decoder attention採用傳統的attention機制,其中的Query是self-attention mechanism已經計算出的上一時間i處的編碼值,Key和Value都是Encoder的輸出,這與self-attention mechanism不同。代碼中具體體現:
4、multi-head self-attention mechanism具體的計算過程是怎樣的?
Transformer中的Attention機制由Scaled Dot-Proct Attention和Multi-Head Attention組成,上圖給出了整體流程。下面具體介紹各個環節:
Expand:實際上是經過線性變換,生成Q、K、V三個向量;
Split heads: 進行分頭操作,在原文中將原來每個位置512維度分成8個head,每個head維度變為64;
Self Attention:對每個head進行Self Attention,具體過程和第一部分介紹的一致;
Concat heads:對進行完Self Attention每個head進行拼接;
上述過程公式為:
5、Transformer在GPT和Bert等詞向量預訓練模型中具體是怎麼應用的?有什麼變化?
GPT中訓練的是單向語言模型,其實就是直接應用Transformer Decoder;
Bert中訓練的是雙向語言模型,應用了Transformer Encoder部分,不過在Encoder基礎上還做了Masked操作;
BERT Transformer 使用雙向self-attention,而GPT Transformer 使用受限制的self-attention,其中每個token只能處理其左側的上下文。雙向 Transformer 通常被稱為「Transformer encoder」,而左側上下文被稱為「Transformer decoder」,decoder是不能獲要預測的信息的。
③ 注意力機制詳解
Attention機制在近幾年來在圖像,自然語言處理等領域中都取得了重要的突破,被證明有益於提高模型的性能。Attention機制本身也是符合人腦和人眼的感知機制,這里我們主要以計算機視覺領域為例,講述Attention機制的原理,應用以及模型的發展。
所謂Attention機制,便是聚焦於局部信息的機制,比如圖像中的某一個圖像區域。隨著任務的變化,注意力區域往往會發生變化。
面對上面這樣的一張圖,如果你只是從整體來看,只看到了很多人頭,但是你拉近一個一個仔細看就了不得了,都是天才科學家。
圖中除了人臉之外的信息其實都是無用的,也做不了什麼任務, Attention機制便是要找到這些最有用的信息 ,可以想見最簡單的場景就是從照片中檢測人臉了。
和注意力機制相伴而生的一個任務便是顯著目標檢測,即salient object detection。它的輸入是一張圖,輸出是一張概率圖,概率越大的地方,代表是圖像中重要目標的概率越大,即人眼關注的重點,一個典型的顯著圖如下:
右圖就是左圖的顯著圖,在頭部位置概率最大,另外腿部,尾巴也有較大概率,這就是圖中真正有用的信息。
顯著目標檢測需要一個數據集,而這樣的數據集的收集便是通過追蹤多個實驗者的眼球在一定時間內的注意力方向進行平均得到,典型的步驟如下:
於是就能得到下面這樣的圖,第二行是眼球追蹤結果,第三行就是顯著目標概率圖。
上面講述的都是空間上的注意力機制,即關注的是不同空間位置,而在CNN結構中,還有不同的特徵通道,因此不同特徵通道也有類似的原理,下面一起講述。
注意力機制的本質就是定位到感興趣的信息,抑制無用信息,結果通常都是以概率圖或者概率特徵向量的形式展示,從原理上來說,主要分為 空間注意力模型,通道注意力模型,空間和通道混合注意力模型 三種, 這里不區分soft和hard attention 。
不是圖像中所有的區域對任務的貢獻都是同樣重要的,只有任務相關的區域才是需要關心的,比如分類任務的主體,空間注意力模型就是尋找網路中最重要的部位進行處理。
我們在這里給大家介紹兩個具有代表性的模型,第一個就是Google DeepMind提出的STN網路(Spatial Transformer Network[1])。它通過學習輸入的形變,從而完成適合任務的預處理操作,是一種基於空間的Attention模型,網路結構如下:
這里的Localization Net用於生成仿射變換系數,輸入是C×H×W維的圖像,輸出是一個空間變換系數,它的大小根據要學習的變換類型而定,如果是仿射變換,則是一個6維向量。
這樣的一個網路要完成的效果如下圖:
即定位到目標的位置,然後進行旋轉等操作,使得輸入樣本更加容易學習。這是一種一步調整的解決方案,當然還有很多迭代調整的方案,感興趣可以去有三知識星球星球中閱讀。
相比於Spatial Transformer Networks 一步完成目標的定位和仿射變換調整,Dynamic Capacity Networks[2]則採用了兩個子網路,分別是低性能的子網路(coarse model)和高性能的子網路(fine model)。低性能的子網路(coarse model)用於對全圖進行處理,定位感興趣區域,如下圖中的操作fc。高性能的子網路(fine model)則對感興趣區域進行精細化處理,如下圖的操作ff。兩者共同使用,可以獲得更低的計算代價和更高的精度。
由於在大部分情況下我們感興趣的區域只是圖像中的一小部分,因此空間注意力的本質就是定位目標並進行一些變換或者獲取權重。
對於輸入2維圖像的CNN來說,一個維度是圖像的尺度空間,即長寬,另一個維度就是通道,因此基於通道的Attention也是很常用的機制。
SENet(Sequeeze and Excitation Net)是2017屆ImageNet分類比賽的冠軍網路,本質上是一個基於通道的Attention模型,它通過建模各個特徵通道的重要程度,然後針對不同的任務增強或者抑制不同的通道,原理圖如下。
在正常的卷積操作後分出了一個旁路分支,首先進行Squeeze操作(即圖中Fsq(·)),它將空間維度進行特徵壓縮,即每個二維的特徵圖變成一個實數,相當於具有全局感受野的池化操作,特徵通道數不變。
然後是Excitation操作(即圖中的Fex(·)),它通過參數w為每個特徵通道生成權重,w被學慣用來顯式地建模特徵通道間的相關性。在文章中,使用了一個2層bottleneck結構(先降維再升維)的全連接層+Sigmoid函數來實現。
得到了每一個特徵通道的權重之後,就將該權重應用於原來的每個特徵通道,基於特定的任務,就可以學習到不同通道的重要性。
將其機制應用於若干基準模型,在增加少量計算量的情況下,獲得了更明顯的性能提升。作為一種通用的設計思想,它可以被用於任何現有網路,具有較強的實踐意義。而後SKNet等方法將這樣的通道加權的思想和Inception中的多分支網路結構進行結合,也實現了性能的提升。
通道注意力機制的本質,在於建模了各個特徵之間的重要性,對於不同的任務可以根據輸入進行特徵分配,簡單而有效。
前述的Dynamic Capacity Network是從空間維度進行Attention,SENet是從通道維度進行Attention,自然也可以同時使用空間Attention和通道Attention機制。
CBAM(Convolutional Block Attention Mole)是其中的代表性網路,結構如下:
通道方向的Attention建模的是特徵的重要性,結構如下:
空間方向的Attention建模的是空間位置的重要性,結構如下:
首先將通道本身進行降維,分別獲取最大池化和均值池化結果,然後拼接成一個特徵圖,再使用一個卷積層進行學習。
這兩種機制,分別學習了通道的重要性和空間的重要性,還可以很容易地嵌入到任何已知的框架中。
除此之外,還有很多的注意力機制相關的研究,比如 殘差注意力機制,多尺度注意力機制,遞歸注意力機制 等。
從原理上來說,注意力機制在所有的計算機視覺任務中都能提升模型性能,但是有兩類場景尤其受益。
我們知道細粒度分類任務中真正的難題在於如何定位到真正對任務有用的局部區域,如上示意圖中的鳥的頭部。Attention機制恰巧原理上非常合適,使用了注意力機制,對模型的提升效果很明顯。
我們又回到了開頭,沒錯,Attention的本質就是重要/顯著區域定位,所以在目標檢測領域是非常有用的。
上圖展示了幾個顯著目標檢測的結果,可以看出對於有顯著目標的圖,概率圖非常聚焦於目標主體,在網路中添加註意力機制模塊,可以進一步提升這一類任務的模型。
④ 注意力機制
注意力模型最近幾年在深度學習各個領域被廣泛使用,無論是圖像處理、語音識別還是自然語言處理的各種不同類型的任務中,都很容易遇到注意力模型的身影。
視覺注意力機制是人類視覺所特有的大腦信號處理機制。人類視覺通過快速掃描全局圖像,獲得需要重點關注的目標區域,也就是一般所說的注意力焦點,而後對這一區域投入更多注意力資源,以獲取更多所需要關注目標的細節信息,而抑制其他無用信息。
深度學習中的注意力機制從本質上講和人類的選擇性視覺注意力機制類似,核心目標也是從眾多信息中選擇出對當前任務目標更關鍵的信息。
分為: 硬注意力、軟注意力、此外,還有高斯注意力、空間變換
就注意力的可微性來分:
1. Hard-attention, 就是0/1問題,哪些區域是被 attentioned,哪些區域不關注.硬注意力在圖像中的應用已經被人們熟知多年:圖像裁剪(image cropping)
硬注意力(強注意力) 與軟注意力不同點在於,首先強注意力是更加關注點,也就是圖像中的每個點都有可能延伸出注意力,同時強注意力是一個隨機的預測過程,更強調動態變化。當然,最關鍵是強注意力是一個不可微的注意力,訓練過程往往是通過增強學習(reinforcement learning)來完成的。
2. Soft-attention ,[0,1]間連續分布問題,每個區域被關注的程度高低,用0~1的score表示.
軟注意力 的關鍵點在於,這種注意力更關注區域或者通道,而且軟注意力是確定性的注意力,學習完成後直接可以通過網路生成,最關鍵的地方是軟注意力是可微的,這是一個非常重要的地方。可以微分的注意力就可以通過神經網路算出梯度並且前向傳播和後向反饋來學習得到注意力的權重。
⑤ Attention(注意力)機制
Attention(注意力)機制其實來源於人類的認識認知能力。比如當人們觀察一個場景或處理一件事情時,人們往往會關注場景的顯著性物體,處理事情時則希望抓住主要矛盾。注意力機制使得人類能夠關注事物的重要部分,忽略次要部分,更高效的處理所面臨的各種事情。
注意力機制在NLP領域被真正的發揚光大,其具有參數少、速度快、效果好的特點,如2018年的BERT、GPT 領跑各項 NLP 任務效果。由此在此領域,transformer和attention結構受到了極大的重視。
第二步:使用權重對Value進行加權求和從而得到Attention Value。
注意力是一種機制,或者方法論,並沒有嚴格的數學定義。比如,傳統的局部圖像特徵提取、顯著性檢測、滑動窗口方法等都可以看作一種注意力機制。在神經網路中,注意力模塊通常是一個額外的神經網路,能夠硬性選擇輸入的某些部分,或者給輸入的不同部分分配不同的權重。
根據權重在特徵空間和通道上的應用方式不同,主要可分為
其增加了一個通道注意力模塊,學習每個通道的權重,通過抑制無關特徵提升卷積特徵的表示性能。SENet通過Squeeze模塊和Exciation模塊實現所述功能,首先通過Squeeze模塊對卷積特徵進行進行壓縮,即在通道維度上執行全局池化操作,在SENet中採用的是全局平均池化,作者提到該操作能夠使得靠近數據輸入的特徵也可以具有全局感受野,這一點在很多的任務中是非常有用的。然後是通過全連接網路進行Exciation操作,作者在全連接網路中降維操作的目的是一方面降低了網路計算量,一方面增加了網路的非線性能力。最後將得到通道attention應用到原始卷積特徵上,即通過乘法加權的方式乘到先前的特徵上,從而提升重要特徵,抑制不重要特徵。
從圖中可以看出,首先將輸入張量進行降維到C通道,與SENet不同的是採用二階pool的方式,計算得到C*C的協方差矩陣,這種計算方式引入了通道之間的相互關系,然後進行線性卷積和非線性激活的兩個連續運算,得到通道注意力。
除此之外,還有很多的注意力機制相關的研究,比如殘差注意力機制,多尺度注意力機制,遞歸注意力機制等。
⑥ 注意力機制
本文大部分的內容來自於 深度學習中的注意力機制
意力機制借鑒了人類注意力的說法,比如我們在閱讀過程中,會把注意集中在重要的信息上。在訓練過程中,輸入的權重也都是不同的,注意力機制就是學習到這些權重。最開始attention機制在CV領域被提出來,但後面廣泛應用在NLP領域。
需要注意的是,注意力機制是一種通用的思想和技術,不依賴於任何模型,換句話說,注意力機制可以用於任何模型。只是我們介紹注意力機制的時候更多會用encoder-decoder框架做介紹。
Encoder-Decoder 框架可以看作是一種深度學習領域的研究模式,應用場景異常廣泛。下圖是文本處理領域里Encoder-Decoder 框架最抽象的一種表示。
在NLP領域,可以把Encoder-Decoder框架看作是:將一個句子(篇章)轉換成另一個句子(篇章)。最直觀的例子就是機器翻譯,將一種語言的表達翻譯成另一種語言。對於句子對<source,target>,將給定輸入句子
source,通過Encoder-Decoder框架生成目標句子target。其中,source和target都是一組單詞序列:
Encoder是對source進行編碼,轉換成中間語義 :
對於解碼器Decoder,其任務是根據中間語義C和當前已經生成的歷史信息來生成下一時刻要生成的單詞:
我們從最常見的Soft Attention模型開始介紹attention的基本思路。
在上一節介紹的Encoder-Decoder框架是沒有體現出「注意力模型」的,為什麼這么說呢?我們可以看下target的生成過程:
其中, 是Decoder的非線性變換函數。從上面式子中可以看出,在生成目標句子的單詞時,不論生成哪個單詞,它們使用的輸入句子source的語義編碼 都是一樣的,沒有任何區別。而語義編碼 又是通過對source經過Encoder編碼產生的,因此對於target中的任何一個單詞,source中任意單詞對某個目標單詞 來說影響力都是相同的,這就是為什麼說圖1中的模型沒有體現注意力的原因。
下面從一個例子入手,具體說明下注意力機制是怎麼做的。
比如機器翻譯任務,輸入source是英文句子:Tom chase Jerry;輸出target想得到中文:湯姆 追逐 傑瑞。在翻譯「Jerry」這個單詞的時候,在普通Encoder-Decoder模型中,source里的每個單詞對「傑瑞」的貢獻是相同的,很明顯這樣不太合理,因為「Jerry」對於翻譯成「傑瑞」更重要。如果引入Attention模型,在生成「傑瑞」的時候,應該體現出英文單詞對於翻譯當前中文單詞不同的影響程度,比如給出類似下面一個概率分布值:
每個英文單詞的概率代表了翻譯當前單詞「傑瑞」時注意力分配模型分配給不同英文單詞的注意力大小。同理,對於target中任意一個單詞都應該有對應的source中的單詞的注意力分配概率,可以把所有的注意力概率看作 ,其中 表示source長度, 表示target長度。而且,由於注意力模型的加入,原來在生成target單詞時候的中間語義 就不再是固定的,而是會根據注意力概率變化的 ,加入了注意力模型的Encoder-Decoder框架就變成了如圖2所示。
根據圖2,生成target的過程就變成了下面形式:
因為每個 可能對應著不同的注意力分配概率分布,比如對於上面的英漢翻譯來說,其對應的信息可能如下:
其中, 表示Encoder對輸入英文單詞的某種變換函數,比如如果Encoder是用RNN模型的話,這個 函數的結果往往是某個時刻輸入 後隱層節點的狀態值;g代表Encoder根據單詞的中間表示合成整個句子中間語義表示的變換函數,一般的做法中,g函數就是對構成元素加權求和,即:
其中, 代表輸入句子Source的長度, 代表在Target輸出第 個單詞時Source輸入句子第 個單詞的注意力分配系數,而 則是Source輸入句子中第 個單詞的語義編碼。假設下標 就是上面例子所說的「湯姆」生成如下圖:
那另一個問題來了:注意力概率分布是怎麼得到的呢?為了便於說明,我們假設圖1的Encoder-Decoder框架中,Encoder和Decoder都採用RNN模型,那麼圖1變成下圖4:
那麼注意力分配概率分布值的通用計算過程如圖5:
上面就是經典的soft Attention模型的基本思想,區別只是函數 會有所不同。
從我的角度看,其實Attention機制可以看作,Target中每個單詞是對Source每個單詞的加權求和,而權重是Source中每個單詞對Target中每個單詞的重要程度。因此,Attention的本質思想會表示成下圖6:
將Source中的構成元素看作是一系列的<Key, Value>數據對,給定Target中的某個元素Query,通過計算Query和各個Key的相似性或者相關性,即權重系數;然後對Value進行加權求和,並得到最終的Attention數值。將本質思想表示成公式如下:
其中, 表示Source的長度。
深度學習中的注意力機制 中提到:
因此,Attention機制的具體計算過程實際上分成了3個階段,如圖7:
第一階段可以引入不同的函數和計算機制,根據Query和某個 ,計算兩者的相似性或者相關性,最常見的方法包括:求兩者的向量點積、求兩者的向量cosine相似性或者引入額外的神經網路來求值,如下:
第二階段引入類似SoftMax的計算方式,對第一階段的得分進行數值轉換,一方面可以進行歸一化,將原始計算分值整理成所有元素權重之和為1的概率分布;另一方面也可以通過SoftMax的內在機制更加突出重要元素的權重。即一般採用的公式如下:
第三階段的計算結果 即為 對應的權重系數,然後進行加權求和即可得到Attention數值:
通過如上三個階段的計算,就可以求出針對Query的Attention數值。
上面介紹的是soft Attention,hard Attention的區別在於soft Attention中 是概率分布,而hard Attention取值為0/1。Hard Attention在圖像上有使用,具體可見 引入attention機制 。
這里的global attention其實就是soft Attention,global attention需要考慮encoder中所有的 ;而local Attention直觀上理解是只考慮局部的 。
Self-attention是Google在transformer模型中提出的,上面介紹的都是一般情況下Attention發生在Target元素Query和Source中所有元素之間。而Self Attention,指的是Source內部元素之間或者Target內部元素之間發生的Attention機制,也可以理解為Target=Source這種特殊情況下的注意力機制。當然,具體的計算過程仍然是一樣的,只是計算對象發生了變化而已。
上面內容也有說到,一般情況下Attention本質上是Target和Source之間的一種單詞對齊機制。那麼如果是Self Attention機制,到底學的是哪些規律或者抽取了哪些特徵呢?或者說引入Self Attention有什麼增益或者好處呢?仍然以機器翻譯為例來說明,如圖8和圖9:
具體做法是點乘 和 ,然後除以 ,並經過Softmax,以此得到 的權重。也就是說Attention計算過程如下式,其中 是scaled factor:
注意力的計算一般有兩種:加性注意力(additive attention)、乘法(點積)注意力(multiplicative attention)。(這里可以和第3部分計算相似度對應)
加性注意力是最經典的注意力機制,它使用了有一個隱藏層的前饋網路(全連接)來計算注意力; 乘法注意力就是Transformer用的方式。這兩種注意力在復雜度上是相似的,但是乘法注意力在實踐中要更快速、具有高效的存儲,因為它可以使用矩陣操作更高效地實現。
Transformer原文:
Multi-Head Attention是用不同的 得到不同的Attention,最後將這些Attention拼接起來作為輸出。公式如下:
其中, ;在Transformer模型中, 。
Scaled Dot-Proct Attention和Multi-Attention如下圖所示:
⑦ 多圖+公式全面解析RNN,LSTM,Seq2Seq,Attention注意力機制
我們知道人類並不是從零開始思考東西,就像你讀這篇文章的時候,你對每個字的理解都是建立在前幾個字上面。你讀完每個字後並不是直接丟棄然後又從零開始讀下一個字,因為你的思想是具有持續性的,很多東西你要通過上下文才能理解。
然而傳統的神經網路並不能做到持續記憶理解這一點,這是傳統神經網路的主要缺點。舉個例子,你打算使用傳統的神經網路去對電影里每個時間點發生的事情進行分類的時候,傳統的神經網路先讓不能使用前一個事件去推理下一個事件。
RNN(遞歸神經網路)可以解決這個問題。他們是帶有循環的神經網路,允許信息在其中保留。
這些循環讓遞歸神經網路看起來有點神秘,然而如果你再思考一下,RNN其實和傳統的神經網路並沒有太多的不同。RNN可以看作是一個網路的多次拷貝,其中每次網路的輸出都是下一次的輸入。我們可以思考一下我們如果展開這個循環結構會是什麼樣的:
這種像是鏈狀的網路結構表明RNN和序列以及列表有著天然的聯系,他們是處理這些序列數據的天然的神經網路。而且很明顯我們可以看出,輸入輸出的序列是具有相同的時間長度的,其中的每一個權值都是共享的(不要被鏈式形狀誤導,本質上只有一個cell)。
在最近的幾年,RNN在很多問題上都取得了成功:比如語音識別,語音模型,翻譯,圖片注釋等等,但是RNN存在著梯度消息/爆炸以及對長期信息不敏感的問題,所以LSTM就被提出來了。現在很多問題的成功都必須歸功於LSTM,它是遞歸神經網路的一種,它在許多的任務中表現都比普通的RNN更好,所以接下來我們來探索一下這個神奇的網路。
人們希望RNN可以將一些之前的信息連接到當前的任務中來,比如使用之前的視頻幀來幫助理解當前幀。如果RNN可以做到將會非常有用。那實際RNN能做到嗎?這要視情況而定。
有時候,我們只需要當前的信息來完成當前的任務。舉個例子,一個語音模型試圖基於之前的單詞去預測下一個單詞。如果我們嘗試預測「the clouds are in the sky」,我們不需要太多的上下文信息——很明顯最後一個單詞會是sky。在像這樣不需要太多的相關信息的場合下,RNN可以學習到之前使用的信息。
但是我們要注意,也有很多場景需要使用更多的上下文。當我們試圖去預測「I grew up in France… I speak fluent French」這句話的最後一個單詞,最近的信息會表明這應該是一種語言的名字,但是如果我們需要知道具體是哪一種語語言,我們需要France這個在句子中比較靠前的上下文信息,相關信息和需要預測的點的間隔很大的情況是經常發生的。
不幸的是,隨著間隔變大,RNN變得無法連接到太前的信息。
理論上RNN完全可以處理這種長期依賴(long-term dependencies)的問題。人們可以通過小心地選擇參數來解決這個問題。令人悲傷的是,實踐表明RNN並不能很好地解決這個問題,Hochreiter (1991) [German] and Bengio, et al. (1994)發現了RNN為什麼在這些問題上學習很困難的原因。
而LSTM則沒有這個問題。
長期短期記憶網路-通常叫做LSTM-是一種特殊結構的RNN,它能夠學習長期依賴。它在大量的問題有驚人的效果,現在已經被廣泛使用。
LSTM被明確設計來避免長期依賴問題,記住長時間的信息對LSTM來說只是常規操作,不像RNN那樣費力不討好。
所有的RNN都有不斷重復網路本身的鏈式形式。在標準的RNN中,這個重復復制的模塊只有一個非常簡單的結果。例如一個tanh層:
LSTM也有這樣的鏈式結構,但是這個重復的模塊和上面RNN重復的模塊結構不同:LSTM並不是只是增加一個簡單的神經網路層,而是四個,他們以一種特殊的形式進行交互:
在上圖中,每條線表示一個向量,從一個輸出節點到其他節點的輸入節點。粉紅色的圓圈表示逐點式操作,就像向量加法。黃色的盒子是學習好的神經網路層。線條合代表聯結,線條分叉則表示內容被復制到不同的地方。
LSTM的核心之處就是它的cell state(神經元狀態),在下圖中就是那條貫穿整個結果的水平線。這個cell state就像是一個傳送帶,他只有很小的線性作用,但卻貫穿了整個鏈式結果。信息很容易就在這個傳送帶上流動但是狀態卻不會改變。cell state上的狀態相當於長期記憶,而下面的 則代表短期記憶。
門限是一種讓信息選擇性通過的方式,它們是由sigmoid神經網路層和逐點相乘器做成的。
sigmoid層輸出0和1之間的數字來描述一個神經元有多少信息應該被通過。輸出0表示這些信息全部不能通過,而輸出1則表示讓所有信息都通過。
一個LSTM有三個這樣的門限,去保護和控制神經元的狀態。
LSTM的第一步就是決定什麼信息應該被神經元遺忘。這是一個被稱為「遺忘門層」的sigmod層組成。他輸入 和 (上一次的輸出以及這輪的輸入),然後在 的每個神經元狀態輸出0和1之間的數字。同理1表示完全保留這些信息,0表示完全遺忘這個信息。
讓我們再次回到一開始舉的例子:根據之前的詞語去預測下一個單詞的語言模型。在這個問題中,cell state或許包括當前主語中的性別信息,所以我們可以使用正確的代詞。而當我們看到一個新的主語(輸入),我們會去遺忘之前的性別信息。我們使用下圖中的公式計算我們的「遺忘系數」
在那個語言模型例子中,我們想給cell state增加主語的性別,來替換我們將要遺忘的舊的主語。
我們給舊的狀態乘一個遺忘系數 ,來遺忘掉我們之前決定要遺忘的信息,然後我們增加 。這是新的候選值,由我們想多大程度更新每個狀態的值決定。
在語言模型中,就像上面描述的,這是我們實際上要丟棄之前主語的性別信息,增加新的主語的性別信息的地方。
最後,我們需要決定我們要輸出什麼。這個輸出是建立在我們的cell state的基礎上,但是這里會有一個濾波器。首先,我們使用sigmoid層決定哪一部分的神經元狀態需要被輸出;然後我們讓cell state經過tanh(讓輸出值變成-1到1之間)層並且乘上sigmod門限的輸出,這樣我們就只輸出我們想要輸出的。
對於那個語言模型的例子,當我們看到一個新的主語的時候,或許我們想輸出相關動詞的信息,因為動詞是跟在主語後面的。例如,它或許要輸出主語是單數還是復數的,然後我們就知道主語後動詞的語態了。
上面講的都是一些常規的LSTM,但並不是所有的LSTM都是上面這種形式。實際上現在很多包含LSTM的論文都有小的差異,但是它值得一提。
Gers & Schmidhuber (2000) 引入了一個流行的LSTM變體,它增加了一個窺視孔連接。這意味著我們讓門限層監視cell state的狀態。
另外一個變體是使用組合遺忘和輸入門,而不是分開決定哪些神經元需要遺忘信息,哪些需要增加新的信息,我們組合起來決定。我們只遺忘那些需要被放入新信息的狀態,同樣我們旨在舊信息被遺忘之後才輸入新的信息。
一個更神奇的LSTM變體是門遞歸單元(也就是大家常說的GRU),它組合遺忘門和輸入門為一個更新門,它合並了cell state和隱層狀態,並且做了一些其他的改變。最終這個模型比標準的LSTM更簡單,並且變得越來越流行。
我們一開始提到人們使用RNN取得了卓越的成果,但其實本質上都是使用LSTM取得的,他們的確在多數任務上表現得更好。
寫下來一系列等式以後,LSTM看起來挺嚇人,但在文中一步步解釋後它變得可以理解了。我們不禁想問:是否有比LSTM更好的模型?學者一致認為:那就是attention注意力機制。核心觀點就是讓RNN每一步都監視一個更大的信息集合並從中挑選信息。例如:如果你使用RNN去為一個圖像生成注釋,它會從圖像中挑選一部分去預測輸出的單詞。接下來在講解attention之前,我們會先聊聊Seq2Seq。
我將會結合一個機器翻譯的例子來給大家形象地介紹Seq2Seq。
在這個例子中,我們試圖將英語轉換為德語,這里要注意這里是一個多對多的模型,而且輸入和輸出的長度都不固定。
Seq2Seq有一個編碼器和一個解碼器,編碼器一般是LSTM或者其他模型用於提取特徵,它的最後一個輸出就是從這句話得出的最後的特徵,而其他的隱層輸出都被丟棄。
同樣,我們先把句子輸入到我們的Encoder裡面,Encoder會輸入最後狀態 ,作為這句話的特徵送給Decoder。
Seq2Seq模型有一個encoder網路和一個Decoder網路,在我們的例子中encoder的輸入是英語句子,每輸入一個詞RNN就會更新狀態並記錄下來,encoder最後一個狀態就是這個句子的特徵,並把之前的狀態丟棄。把這個狀態作為decoder的初始狀態,初始化後decoder就知道這個句子了,首先把起始符作為decoder的輸入,然後一步步更新,輸出狀態和概率分布預測下一個字元,再把預測的字元作為下一個輸入,重復這個過程,最後直到預測終止符就返回輸出的這個序列。
我們的encoder和decoder都是LSTM,encoder把所有句子的特徵壓縮到最後一個狀態,理想情況下encoder最後一個狀態包含完整的信息,假如句子很長,那麼句子有些信息就會被遺忘,那麼Decoder就沒有完整的句子信息,那decoder輸出的德語句子就不完整。
一種簡單方法就是使用雙向LSTM,雙向LSTM簡單來說就是用兩條鏈,從左到右這條鏈可能會遺忘最左邊的信息,而從右往左的這條鏈可能會遺忘右邊的信息,這樣結合起來就不容易遺忘句子信息,這里要注意只是encoder用雙向LSTM,decoder是單向LSTM,他要生成正確順序的序列。
另外一種方法改進就是multi-Task learning,我們還可以多加入幾個任務,比如讓英語句子讓他自己翻譯成英語句子,這樣encoder只有一個但是數據多了一倍,這樣encoder就能被訓練的更好,當然你還可以添加其他語言的任務,通過藉助其他語言更好訓練encoder,這樣雖然decoder沒有變得更好,但是因為encoder提取的更好最後效果也會變好。
當然還有一個方法就是使用注意力機制,這個對機器翻譯提高作用很大,我們接下來就講解這個注意力機制。
我們知道Seq2Seq模型有一個缺點就是句子太長的話encoder會遺忘,那麼decoder接受到的句子特徵也就不完全,我們看一下下面這個圖,縱軸BLUE是機器翻譯的指標,橫軸是句子的單詞量,我們可以看出用了attention之後模型的性能大大提升。
用了注意力機制,Decoder每次更新狀態的時候都會再看一遍encoder所有狀態,還會告訴decoder要更關注哪部分,這也是attention名字的由來。但是缺點就是計算量很大。
在encoder結束之後,attention和decoder同時工作,回憶一下,decoder的初始狀態 是encoder最後一個狀態,不同於常規的Seq2Seq,encoder所有狀態都要保留,這里需要計算 與每個狀態的相關性,我使用 這個公式表示計算兩者相關性,把結果即為 ,記做Weight,encoder有m個狀態,所以一共有m個 ,這里所有的值都是介於0和1的實數,全部加起來為1。
這張圖下面是encoder,上面是decoder,attention會把decoder所有狀態與encoder所有狀態計算相似性,也就是 .在這張圖中每條線就對應一個 ,線越粗說明相關性越高。
這次僅僅是從機器翻譯的角度介紹了attention的一個應用,還有一些比如self-attention,Transformer應用,希望以此為印子能夠打開讀者attention的大門。
1.colah's blog http://colah.github.io/posts/2015-08-Understanding-LSTMs/
2.CS583 https://github.com/wangshusen/DeepLearning
⑧ 通俗理解注意力機制中的Q、K和V表示的具體含義
以翻譯為例
比如翻譯目標單詞為 I 的時候,Q為I
而source中的 「我」 「是」 「中國人」都是K,
那麼Q就要與每一個source中的K進行對齊(相似度計算);"I"與"我"的相似度,"I"與"是"的相似度;"I"與"中國人"的相似度;
相似度的值進行歸一化後會生成對齊概率值(「I"與source中每個單詞的相似度(和為1)),也可以注意力值;
而V代表每個source中輸出的context vector;如果為RNN模型的話就是對應的狀態向量;即key與value相同;
然後相應的V與相應的P進行加權求和,就得到了context vetor;
從網上找到了一張圖更能證明我的理解的正確性;
這里的v與上面的V是不一樣的,這屬於一個單隱藏層的前饋神經網路;v屬於隱藏層激活後的一個計算得分的權重系數矩陣;
w屬於激活前的權重系數矩陣;
這里應該是輸出神經元為一個得分值;所以需要多個前饋神經網路同時計算每個hi的得分;與我預想的不同,以為一個前饋神經網路就可以輸出所有對應的得分,即輸出層的維度是與input序列長度一樣;(目前的理解);為什麼不與預想的一致呢?
然後對所有得分進行歸一化,一般選擇softmax方法;讓權重系數為1
第二階段:將hi與對應的權重系數相乘得到一個context vector;即注意力值.
[PS:本文談論的Q、K、V只限於seq2seq結構]
看到這里,是不是只想直呼卧槽,這什麼鬼。不急,先看一個例子
由於討論的是seq2seq任務,於是來看看機器翻譯。
假如我們要將 我喜歡看電影 翻譯成 I like watching movies ,步驟則會如下
⑨ Attention機制知識匯總
圖1形象化展示了人類在看到一副圖像時是如何高效分配有限的注意力資源的,其中紅色區域表明視覺系統更關注的目標。
深度學習中的注意力機制從本質上講和人類的選擇性視覺注意力機制類似,核心目標也是 從眾多信息中選擇出對當前任務目標更關鍵的信息 。
深度學習中常用的第一類注意力機制
具體數學形式表示如下:
注意力機制主要體現在 系數上,其反映對於一次查詢當前資源中不同數據的重要程度,通過softmax等形式計算出該系數;實現聚焦重要數據,忽略不相關數據的注意力作用
理解:soft attention通過softmax獲得注意力權重,之後進行加權計算,即計算注意力分布下的期望。hard attention則是利用注意力權重進行采樣選取信息(根據權重大小做采樣)。
Self-Attention結構如下
知乎-目前主流的Attention方法都有哪些:張俊林的回答
知乎-目前主流的Attention方法都有哪些:JayLou的回答
知乎專欄-模型匯總24 - 深度學習中Attention Mechanism詳細介紹:原理、分類及應用
Attention機制詳解(二)——Self-Attention與Transformer