A. 注意力機制
本文大部分的內容來自於 深度學習中的注意力機制
意力機制借鑒了人類注意力的說法,比如我們在閱讀過程中,會把注意集中在重要的信息上。在訓練過程中,輸入的權重也都是不同的,注意力機制就是學習到這些權重。最開始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如下圖所示:
B. 注意力機制與外部記憶
根據通用近似定理,前饋網路和循環網路都有很強的能力。但由於優化演算法和計算能力的限制,在實踐中很難陪褲達到通用近似的能力。
神經網路中可以存儲的信息量稱為 網路容量(Network Capacity) 。一般來講,利用一組神經元來存儲信息時,其 存儲容量和神經元的數量以及網路的復雜度成正比 。如果要存儲越多的信息,神經元數量就要越多或者網路要越復雜,進而導致神經網路的參數成倍地增加。
大腦神經系統有兩個重要機制可以解決信息過載問題: 注意力和記憶機制 。我們可以借鑒人腦解決信息過載的機制,從兩方面來提高神經網路處理信息的能力。 一方面是注意力,通過自上而下的信息選擇機制來過濾掉大量的無關信息;另一方面是引入額外的外部記憶,優化神經網路的記憶結構來提高神經網路存儲信息的容量 。
在計算能力有限情況下,注意力機制(Attention Mechanism)作為一種資源分配方案,將計算資源分配給更重要的任務,是解決信息超載問題的主要手段。
注意力是一種人類不可或缺的復雜認知功能,指人可以在關注一些信息的同時忽略另一些信息的選擇能力 。
注意力一般分為兩種:一種是自上而下的有意識的注意力,稱為 聚焦式(Focus)注意力 。聚焦式注意力是指有預定目的、依賴任務的、主動地有意識地聚焦於某一對象的注意力;另一種是自下而上的無意識的注意力,稱為 基於顯著性(Saliency-Based)的注意力 。基於顯著性的注意力是由外界刺激驅動的注意,不需要主動干預,也和任務無關。
一個和注意力有關的例子是 雞尾酒會效應 。當一個人在吵鬧的雞尾酒會上和朋友聊天時,盡管周圍噪音干擾很多,他還是可以聽到朋友的談話內容,而忽略其他人的聲音(聚焦式注意力)。同時,如果未注意到的背景聲中有重要的詞(比如他的名字),他會馬上注意到(顯著性注意力)。
在目前的神經網路中,我們 可以將最大匯聚(Max Pooling)、門控(Gating)機制來近似地看作是自下而上的基於顯著性的注意力機制 。除此之外,自上而下的會聚式注意力也是一種有效的信息選擇方式。
用 表示 組輸入信息,其中每個向量 都表示一組輸入信息。為了節省計算資源,不需要將所有信息都輸入到神經網路,只需要從 中選擇一些和任務相關的信息。 注意力機制的計算可以分為兩步:一是在所有輸入信息上計算注意力分布,二是根據注意力分布來計算輸入信息的加權平均 。
給定一個和任務相關的查詢向量 ,我們用注意力變數 來表示被選擇信息的索引位置,即 表示選擇了第 個輸入向量。為了方便計算,我們採用一種「軟性」的信息選擇機制,首先計算在給定 和 下,選擇第 個輸入向量的概率 :
其中 稱為注意力分布(Attention Distribution), 為 注意力打分函數 ,可以使用以下幾種方式來計算:
其中 為可學習的網路參數, 為輸入向量的維度。理論上,加性模型和點積模型的復雜度差不多,但是點積模型在實現上可以更好地利用矩陣乘積,從而計算效率更高。但當輸入向量的維念廳度 比較高,點積模型的值通常有比較大方差,從而導致 函數的梯度會比較小。因此,縮放點積模型蘆高簡可以較好地解決這個問題。
上式稱為 軟性注意力機制(Soft Attention Mechanism) 。下圖給出了軟性注意力機制的示例。
上面提到的注意力是 軟性注意力,其選擇的信息是所有輸入向量在注意力分布下的期望。此外,還有一種注意力是只關注到某一個輸入向量,叫做硬性注意力 。
硬性注意力有兩種實現方式:
其中 為概率最大的輸入向量的下標,即
硬性注意力的一個缺點是基於最大采樣或隨機采樣的方式來選擇信息。因此最終的損失函數與注意力分布間的函數關系不可導,因此無法用反向傳播演算法進行訓練(硬性注意力需要通過強化學習來進行訓練) 。為了使用反向傳播演算法,一般使用軟性注意力來代替硬性注意力。
更一般地,我們可以用 鍵值對(key-value pair) 格式來表示輸入信息,其中「鍵」用來計算注意力分布 ,「值」用來計算聚合信息。
用 表示 組輸入信息,給定任務相關的查詢向量 時,注意力函數為:
下圖給出鍵值對注意力機制的示例。當 時,鍵值對模式就等價於普通的注意力機制。
多頭注意力(Multi-Head Attention)是利用多個查詢 ,來平行地計算從輸入信息中選取多組信息。每個注意力關注輸入信息的不同部分 。
其中 表示向量拼接。
在之前介紹中,我們假設所有的輸入信息是同等重要的,是一種扁平(Flat)結構,注意力分布實際上是在所有輸入信息上的多項分布。但 如果輸入信息本身具有層次結構,比如文本可以分為詞、句子、段落、篇章等不同粒度的層次,我們可以使用層次化的注意力來進行更好的信息選擇 。
注意力機制一般可以用作一個神經網路中的組件。
注意力機制可以分為兩步:一是計算注意力分布 ,二是根據 來計算輸入信息的加權平均。我們可以只利用注意力機制中的第一步,並 將注意力分布作為一個軟性的指針(pointer)來指出相關信息的位置 。
指針網路(Pointer Network) 是一種序列到序列模型, 輸入是長度為 的向量序列 , 輸出是下標序列 。
和一般的序列到序列任務不同,這里的輸出序列是輸入序列的下標(索引) 。比如輸入一組亂序的數字,輸出為按大小排序的輸入數字序列的下標。比如輸入為20, 5, 10,輸出為1, 3, 2。
條件概率 可以寫為:
其中條件概率 可以通過注意力分布來計算。假設用一個循環神經網路對 進行編碼得到向量 ,則:
其中 為在解碼過程的第 步時,每個輸入向量的未歸一化的注意力分布:
其中 為可學習的參數。下圖給出指針網路的示例。
當使用神經網路來處理一個變長的向量序列時,我們通常可以使用卷積網路或循環網路進行編碼來得到一個相同長度的輸出向量序列。
基於卷積或循環網路的序列編碼都是可以看做是一種局部的編碼方式,只建模了輸入信息的局部依賴關系。雖然循環網路理論上可以建立長距離依賴關系,但是由於信息傳遞的容量以及梯度消失問題,實際上也只能建立短距離依賴關系 。如果要建立輸入序列之間的長距離依賴關系,可以使用以下兩種方法:一種方法是 增加網路的層數 ,通過一個深層網路來獲取遠距離的信息交互;另一種方法是 使用全連接網路 。全連接網路是一種非常直接的建模遠距離依賴的模型,但是無法處理變長的輸入序列。不同的輸入長度,其連接權重的大小也是不同的。這時我們就可以 利用注意力機制來「動態」地生成不同連接的權重,這就是自注意力模型(Self-Attention Model) 。
假設輸入序列為 ,輸出序列為 ,首先我們可以通過線性變換得到三組向量序列:
其中 分別為查詢向量序列,鍵向量序列和值向量序列, 分別為可學習的參數矩陣。
利用鍵值對的注意力函數,可以得到輸出向量 :
其中 為輸出和輸入向量序列的位置, 連接權重 由注意力機制動態生成 。
下圖給出全連接模型和自注意力模型的對比,其中實線表示為可學習的權重,虛線表示動態生成的權重。 由於自注意力模型的權重是動態生成的,因此可以處理變長的信息序列 。
自注意力模型可以作為神經網路中的一層來使用,既可以用來替換卷積層和循環層,也可以和它們一起交替使用。
為了增強網路容量,我們可以 引入輔助記憶單元,將一些信息保存輔助記憶中,在需要時再進行讀取,這樣可以有效地增加網路容量 。這個引入輔助記憶單元一般稱為 外部記憶(External Memory) ,以區別與循環神經網路的內部記憶(即隱狀態)。
生理學家發現信息是作為一種 整體效應(collective effect) 存儲在大腦組織中。當大腦皮層的不同部位損傷時,其導致的不同行為表現似乎取決於損傷的程度而不是損傷的確切位置。 大腦組織的每個部分似乎都攜帶一些導致相似行為的信息。也就是說,記憶在大腦皮層是分布式存儲的,而不是存儲於某個局部區域 。
人腦中的記憶具有 周期性 和 聯想性 。
長期記憶可以類比於人工神經網路中的權重參數,而短期記憶可以類比於人工神經網路中的隱狀態 。
除了長期記憶和短期記憶,人腦中還會存在一個「緩存」,稱為 工作記憶(Working Memory) 。在執行某個認知行為(比如記下電話號碼,算術運算)時,工作記憶是一個記憶的臨時存儲和處理系統,維持時間通常為幾秒鍾。
和之前介紹的LSTM中的記憶單元相比,外部記憶可以存儲更多的信息,並且不直接參與計算,通過讀寫介面來進行操作。而 LSTM模型中的記憶單元包含了信息存儲和計算兩種功能,不能存儲太多的信息。因此,LSTM中的記憶單元可以類比於計算機中寄存器,而外部記憶可以類比於計算機中的存儲器:內存、磁帶或硬碟等 。
借鑒人腦中工作記憶,可以在神經網路中引入一個外部記憶單元來提高網路容量。 外部記憶的實現途徑有兩種:一種是結構化的記憶,這種記憶和計算機中的信息存儲方法比較類似,可以分為多個記憶片段,並按照一定的結構來存儲;另一種是基於神經動力學的聯想記憶,這種記憶方式具有更好的生物學解釋性 。
一個不太嚴格的類比表格如下:
為了增強網路容量,一種比較簡單的方式是引入結構化的記憶模塊, 將和任務相關的短期記憶保存在記憶中,需要時再進行讀取 。這種裝備外部記憶的神經網路也稱為 記憶網路(Memory Network,MN) 或 記憶增強神經網路(Memory Augmented Neural Network,MANN) 。
記憶網路結構如圖:
一般有以下幾個模塊構成:
這種結構化的外部記憶是帶有地址的,即每個記憶片段都可以按地址讀取和寫入。要實現類似於人腦神經網路的聯想記憶能力,就需要按內容定址的方式進行定位,然後進行讀取或寫入操作。 按內容定址通常使用注意力機制來進行。通過注意力機制可以實現一種「軟性」的定址方式,即計算一個在所有記憶片段上的分布,而不是一個單一的絕對地址 。比如讀取模型 的實現方式可以為:
其中 是主網路生成的查詢向量, 為打分函數。類比於計算機的存儲器讀取, 計算注意力分布的過程相當於是計算機的「定址」過程,信息加權平均的過程相當於計算機的「內容讀取」過程 。因此,結構化的外部記憶也是一種聯想記憶,只是其結構以及讀寫的操作方式更像是受計算機架構的啟發。
通過引入外部記憶,可以將神經網路的參數和記憶容量的「分離」,即在少量增加網路參數的條件下可以大幅增加網路容量。 注意力機制可以看做是一個介面,將信息的存儲與計算分離 。
端到端記憶網路(End-To-End Memory Network,MemN2N) 採用一種可微的網路結構,可以多次從外部記憶中讀取信息。 在端到端記憶網路中,外部記憶單元是只讀的 。
給定一組需要存儲的信息 ,首先將其轉換成兩組記憶片段 和 ,分別存放在兩個外部記憶單元中,其中 用來進行定址, 用來進行輸出。
主網路根據輸入 生成 ,並使用注意力機制來從外部記憶中讀取相關信息 :
並產生輸出:
其中 為預測函數。當應用到分類任務時, 可以設為softmax 函數。
為了實現更新復雜的計算,我們可以讓主網路和外部記憶進行多輪交互。在第 輪交互中,主網路根據上次從外部記憶中讀取的信息 ,產生新的查詢向量:
其中 為初始的查詢向量, 。
假設第 輪交互的外部記憶為 和 ,主網路從外部記憶讀取信息為:
端到端記憶網路結構如圖:
C. CA:用於移動端的高效坐標注意力機制 | CVPR 2021
論文: Coordinate Attention for Efficient Mobile Network Design
目前,輕量級網路的注意力機制大都採用SE模塊,僅考慮了通道間的信息,忽略了位置信息。盡管後來的BAM和CBAM嘗試在降低通道數後通過卷積來提取位置注意力信息,但卷積只能提取局部關系,缺乏長距離關系提取的能力。為此,論文提出了新的高效注意力機制coordinate attention,能夠將橫向和縱向的位置信息編碼到channel attention中,使得移動網路能夠關注大范圍的位置信息又不會帶來過多的計算量。
coordinate attention的優勢主要有以下幾點:
Coordinate Attention可看作增強移動網路特徵表達能力的計算單元培蘆,接受中間特徵 作為輸入,輸出與 大小相同的增強特徵 。
Coordinate Attention基於coordinate information embedding和coordinate attention generation兩個步驟來編碼通道關系和長距離關系。
channel attention常用全局池化編碼全局空間信息,將全局信息壓縮成一個標量,難以保留重要的空間信息。為此,論文將全局池化改造成兩個1維向量的編碼操作。對於輸入 ,使用池化核 和 來編碼水平方向和垂直方向特徵,即第 維特徵的輸出為:
上面的公式從不同的方向集成特徵,輸出一對方向可知的特徵圖。對比全局缺中游池化的壓縮方式,這樣能夠允許attention block捕捉單方向上的長距離關系同時保留另一個方向上的空間信息,幫助網路更准確地定位目標。
為了更好地利用上述的coordinate infomation,論文提出了配套的coordinate attention generation操作,主要基於以下三點准則進行設計:
首先將公式4和公式5的輸出concatenate起來,使用 卷積、BN和非線性激活進行特徵轉化:
為包含橫向和縱向空間信息的中間特徵, 為縮減因子。這里兩個方向的特徵沒有做激烈的融合,concatenate的主要目的我覺得是進行統一的BN操作。隨後將 分為兩個獨立的特徵 和 ,使用另外兩個 卷積和sigmoid函數進行特徵轉化,使其維度與輸入 一致:
將輸出 和 合並成權重矩陣,用於計算coordinate attention block輸出:
coordinate attention block與se block的最大區別是,coordinate attention block的每個權重都包含了通道間信息、橫向空間信息和縱向空間信息,能夠幫助網路伏銷更准確地定位目標信息,增強識別能力。
將coordinate attention block應用於MobileNetV2和MobileNeXt上,block結構如圖3所示。
基於MobileNetV2進行模塊設置的對比實驗。
不同注意力結構在不同主幹網路上的性能對比。
對目標檢測網路的性能對比。
對語義分割任務的性能對比。
論文提出新穎的輕量級通道注意力機制coordinate attention,能夠同時考慮通道間關系以及長距離的位置信息。通過實驗發現,coordinate attention可有效地提升模型的准確率,而且僅帶來少量的計算消耗,十分不錯。
D. Attention注意力機制介紹
Attention機制通俗的講就是把注意力集中放在重要的點上,而忽略其他不重要的因素。其中重要程度的判斷取決於應用場景,拿個現實生活中的例子,比如1000個人眼中有1000個哈姆雷特。根據應用場景的不同,Attention分為空間注意力和時間注意力,前者用於圖像處理,後者用於自然語言處理。本文主要介紹Attention機制在Seq2seq中的應用。
我們知道在Seq2seq模型中,原始編解碼模型的encode過程會生成一個中間向量C,用於保存原序列的語義信息。但是這個向量長度是固定的,當輸入原序列的長度比較長時,向量C無法保存全部的語義信息,上下文語義信息受到了限制,這也限制了模型的理解能力。所以使用Attention機制來打破這種原始編解碼模型對固定向量的限制。
Attention的原理就橡伍是計算當前輸入序列與輸出向量的匹配程度,匹配度高也就是注意力集中點其相對的得分越高。其中Attention計算得到的匹配度權重,只限於當前序列對,不是像網路模型權重這樣的整體權重。
1)encode對輸入序列編碼得到最後一個時間步的狀態c,和每個時間步的輸出h,其中c又作為decode的初始狀態z0。
2)對於每個時間步的輸出h與z0做匹配也就是match操作,得到每個時間步的匹配向量α01,如圖1。
3)對所有時間步的輸出h與z0的匹配度α0,使用softmax做歸一化處理,得到各個時間步對於z0的匹配分蘆扮數。
4)求各個時間步的輸出h與匹配分數的加權求和得到c0,作為decode的下一個時間步的輸入,如圖2。
5)計算各個時間步的輸出h與z1的匹配度得到c1作為decode下一個時間步的輸入,如此一步一步重復下去,如圖3。
這樣就可以把每個時間步重要的信息傳給decode中,以上就是Attention機制的處理過程。其中match操作一般是求兩個向量的相似度,通常有如下方法:
1)餘弦相似度
2)一個簡單的 神經網路,輸入為hh和ww,輸出為α
3)或者矩陣變換α=hTWzα=hTWz (Multiplicative attention,Luong et al., 2015)
在tensorflow1.0版本以後的api seq2seq庫中,包含了兩種Attention演算法,他們的區別就是match操作的不同,因此也有人稱他們為加法Attention和乘法Attention,具體內容下:
1)BahdanauAttention:論文 https://arxiv.org/abs/1409.0473 中的實現:
2)LuongAttention:論文 https://arxiv.org/abs/1508.04025 中的實現 :
由於圖片來自不同地方,所以符號有些不同,圖4和圖5中的h是上文所說的每個梁嘩或時間步的輸出向量,d是decode中每個時間步的狀態,也就是上文中的z,c是match後計算的權值加和後的向量用於decode中每個時間步的輸入,a就是match操作中經過softmax後的匹配權重,v是一個向量,相當於w一樣的權重需要去學習。有上面兩個公式可以看出,BahdanauAttention和LuongAttention的區別就是在match過程中的計算方式不同,一個是將decode的狀態與encode的輸出求和,一個是求乘,所以才有了加法Attention和乘法Attention的叫法。
------------------------------------------------------------------更新---------------------------------------------------------------------
最近一段時間的學習,發現Attention的各種形式與用法,但是歸根結底,都是同一種形式---Google的一般化Attention.
其中Q是query,K和V是一一對應的,相當於Key-Value的關系.一般情況下都會說求誰對誰的Attention,比如上面提到的Seq2seq中,decoder的隱狀態z對encoder輸出h的attention,那麼隱狀態z就相當於該式中的query,encoder的輸出h就是key和value(這里key和value相等,也有不等的情況).所以如果說A對B的attention,那麼A就是query,B就是key-value(key-value怎麼分配看實際情況).這樣,上文提到的內容就可以很容易的代入到一般會Attention中.先用query(decoder隱藏狀態z)和key(encoder輸出h)做點乘然後歸一化,使用softmax計算權重得分,再與value(encoder輸出h)相乘得到最後的向量.(attention的機制像極了key-value記憶網路的原理, 或者更准確的說是key-value記憶網路像極了attention的機制,使用query與key做匹配運算,求得相關度得分,然後使用該得分與value運算,得到最後的向量).
特別注意的是,如果Q,K,V的值都是一個的話,那麼就稱為Self Attention.
參考:
台大李宏毅課程
E. se注意力機制優缺點
SE(Selective Encoding)注意力機制是一種在文本分類中廣泛使用的深度學習模型。余山它將注意力機制應用於神經編碼器中的每個顫孝時間步,以在輸入序列中選擇重要的部分。它的優點是:
1. 給出了一個直觀的方式,以便將不同程度的注意力分配到每個時間步的輸入中。豎洞中
2. SE注意力機制可以提高神經網路的分類性能,因為它可以讓網路自動地選取最具代表性的特徵進行分類。
3. SE注意力機制能夠幫助神經網路更好地理解輸入序列中的語義信息。
缺點是:
1. 需要更多的計算資源和時間才能運行。
2. 訓練一個高質量的注意力模型需要大量的數據,否則可能會導致過擬合。
F. 注意力機制詳解
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的本質就是重要/顯著區域定位,所以在目標檢測領域是非常有用的。
上圖展示了幾個顯著目標檢測的結果,可以看出對於有顯著目標的圖,概率圖非常聚焦於目標主體,在網路中添加註意力機制模塊,可以進一步提升這一類任務的模型。
G. Attention(注意力)機制
Attention(注意力)機制其實來源於人類的認識認知能力。比如當人們觀察一個場景或處理一件事情時,人們往往會關注場景的顯著性物體,處理事情時則希望抓塌宴高住主要矛盾。注意力機制使得人類能夠關注事物的重要部分,忽略次要部分,更高效的處理所面臨的各種事情。
注意力機制在NLP領域被真正的發揚光大,其具有參數少、速度快、效果好的特點,如2018年的BERT、GPT 領跑各項 NLP 任務效果。由此在此領域,transformer和attention結構受到了極大的重視。
第二步:使用權重對Value進行加權求和從而得到Attention Value。
注意力是一種機制,或者方法論,並沒有嚴格的數學定義。比如,傳統的局部圖像特徵提取、顯著性檢測、滑動窗口方法等都可以看作一種注意力機制。在神經網路中,注意力模塊通常是一個額外的神經網路,能夠硬性選擇輸入的某些部分,或者給輸入的不同部分分配不同的權重。
根據權重在特徵空間和通道上的應用方式不同,主要可分為
其增加了一個通道注意力模塊,學習每個通道的權重,通過抑制無關特徵提升卷積特徵的表示性能。SENet通過Squeeze模塊和Exciation模塊實現所述功能,首先通過Squeeze模塊對卷積特徵進行進行壓縮,即在通道維度上執行全局池化操作,在SENet中採用的是全局平均池化,作者提到該操作能夠使得靠近數據輸入的特徵也可以具有全局感受野,這一點在很多的任務中是非常有用的。然後是通過全連接網路進行Exciation操作,作者在全連接網路中降維操作的目的是一方面降低了網路計算量,一方面增加了網路的非線性能力。最後將得到通道attention應用到原始卷積特徵上,即通過乘法加權的方式乘到先前的特徵上,從而提升重要特徵,抑制不重要特徵。
從圖中可以看出,首先將輸入張量進行降維到C通道,與SENet不同的是採用二階pool的方式,計算得到C*C的協祥迅方差矩陣,這種計算方式引入了通團尺道之間的相互關系,然後進行線性卷積和非線性激活的兩個連續運算,得到通道注意力。
除此之外,還有很多的注意力機制相關的研究,比如殘差注意力機制,多尺度注意力機制,遞歸注意力機制等。
H. 注意力機制(Attention)Non-local Neural Networks
2018CVPR的一篇論文,主要解決的問題是通過Non-local的方法擴大傳統CNN,RNN方法的感知域(即傳統的CNN一個像素點對應的輸出只受其neighbor的影響,Non-local方法使每一點的輸出受所有像素點的影響)。模型結構簡單,效果提升顯著,且橋余可以方便的嵌入到現有網路中。對於一個視頻信息在時間域,空間域都有提升:
輸入數據X中每個點i對應的輸出Y,通過下式求得:
上述過程可以理解為一個加權平均過程,其中函數 看作對輸入數據的預處理過程,函數f理解敏族滾為數據各位置間的相關程度。文中給出了幾個 函數的實例,同時指出了最終效果對函數的選擇的敏感度穗激不高。
為簡化函數g選擇 做一個線性的embedding,函數f採用以下實例:
Gaussian: Embedded Gaussian:
Dot proct:
Concatenation:
模型的功能可以通過一個殘差塊實現,殘差塊定義為 ,結構如下
文中還提到了一個subsample trick,在 後加上一個最大池化層,可以有效地提升計算效率。
文章最後針對視頻分類,圖像識別,語義分割多個領域進行實驗,加入殘差塊的網路都取得了很大性能提升,同時對加入的位置進行實驗,得出加入殘差塊的位置在網路的淺層效果更加明顯(自己理解是淺層的future map維度比較大,全局獲得的信息更多)。