此文源自一個博客,筆者用黑體作了註釋與解讀,方便本身和你們深刻理解Attention model,寫的不對地方歡迎批評指正。。html
深度學習裏的Attention model其實模擬的是人腦的注意力模型,舉個例子來講,當咱們觀賞一幅畫時,雖然咱們能夠看到整幅畫的全貌,可是在咱們深刻仔細地觀察時,其實眼睛聚焦的就只有很小的一塊,這個時候人的大腦主要關注在這一小塊圖案上,也就是說這個時候人腦對整幅圖的關注並非均衡的,是有必定的權重區分的。這就是深度學習裏的Attention Model的核心思想。算法
這個思路很符合直覺,認爲重要的部分咱們就更加註意,不重要的就忽略。網絡
所謂encoder-decoder模型,又叫作編碼-解碼模型。這是一種應用於seq2seq問題的模型。seq2seq問題簡單的說,就是根據一個輸入序列x,來生成另外一個輸出序列y。常見的應用有機器翻譯,文檔提取,問答系統等。Encoder-Decoder模型中的編碼,就是將輸入序列轉化成一個固定長度的向量;解碼,就是將以前生成的固定向量再轉化成輸出序列。架構
Encoder-Decoder(編碼-解碼)是深度學習中很是常見的一個模型框架,好比無監督算法的auto-encoding就是用編碼-解碼的結構設計並訓練的;好比這兩年比較熱的image caption的應用,就是CNN-RNN的編碼-解碼框架;再好比神經網絡機器翻譯NMT模型,每每就是LSTM-LSTM的編碼-解碼框架。所以,準確的說,Encoder-Decoder並非一個具體的模型,而是一類框架。Encoder和Decoder部分能夠是任意的文字,語音,圖像,視頻數據,模型能夠採用CNN,RNN,BiRNN、LSTM、GRU等等。因此基於Encoder-Decoder,咱們能夠設計出各類各樣的應用算法。app
Encoder-Decoder框架能夠看做是一種文本處理領域的研究模式,應用場景異常普遍,下圖是文本處理領域裏經常使用的Encoder-Decoder框架最抽象的一種表示:框架
對於句子對<X,Y>,咱們的目標是給定輸入句子X,期待經過Encoder-Decoder框架來生成目標句子Y。X和Y能夠是同一種語言,也能夠是兩種不一樣的語言。而X和Y分別由各自的單詞序列構成:函數
Encoder顧名思義就是對輸入句子X進行編碼,將輸入句子經過非線性變換轉化爲中間語義表示C:學習
對於解碼器Decoder來講,其任務是根據句子X的中間語義表示C和以前已經生成的歷史信息y1, y2….yi-1來生成i時刻要生成的單詞yi 優化
可是Encoder-Decoder框架會有一個明顯的缺點,Encoder會把輸入句子X編碼爲一個固定長度的隱向量(語義編碼c),會致使隱向量沒法徹底表示輸入句子X的信息。能夠從兩個方面理解,1.隱向量的大小有限,沒法表示語義豐富的句子,2.因爲RNN類網絡特色,網絡會更加看中句子後面的信息,沒法總攬全局。編碼
最簡單的解決思路就是把全部RNNcell的輸出組合起來使用,而不僅使用最後一個RNNcell的輸出,這個能夠作到充分利用句子信息,能夠必定程度解決問題。可是通常越明確的網絡學習目標能夠得到越好的效果,若是能夠得到每一個RNNcell的輸出的權重來加權編碼,就能夠更加明確學習目標提高學習效果。Attention Model的思路就是如此。
如何設計網絡,進行加權操做,而且使用合理的loss就是Attention Model的重難點,也是咱們要學習理解的內容了。請繼續往下看。。
在Encoder-Decoder框架中,在預測每個encode時對應的語義編碼c都是同樣的,也就意味着不管句子X中的每一個單詞對輸出Y中的每個單詞的影響都是相同的。這樣就會產生兩個弊端:一是語義向量沒法徹底表示整個序列的信息,再者就是先輸入的內容攜帶的信息會被後輸入的信息稀釋掉,或者說,被覆蓋了。輸入序列越長,這個現象就越嚴重。這就使得在解碼的時候一開始就沒有得到輸入序列足夠的信息, 那麼解碼的準確度天然也就要打個折扣了。
爲了解決上面的弊端,就須要用到咱們的Attention Model(注意力模型)來解決該問題。在機器翻譯的時候,讓生成詞不是隻能關注全局的語義編碼向量c,而是增長了一個「注意力範圍」,表示接下來輸出詞時候要重點關注輸入序列中的哪些部分,而後根據關注的區域來產生下一個輸出。模型結構以下:
此時生成目標句子單詞的過程就成了下面的形式:
好比輸入的是英文句子:Tom chase Jerry,Encoder-Decoder框架逐步生成中文單詞:「湯姆」,「追逐」,「傑瑞」。在沒加入Attention Model以前,生成的語義編碼C是一致的,而加入以後,對應的語義編碼可能以下:
其中,f2函數表明Encoder對輸入英文單詞的某種變換函數,好比若是Encoder是用的RNN模型的話,這個f2函數的結果每每是某個時刻輸入xi後隱層節點的狀態值;g表明Encoder根據單詞的中間表示合成整個句子中間語義表示的變換函數,通常的作法中,g函數就是對構成元素加權求和,也就是經常在論文裏看到的下列公式:
假設Ci中那個i就是上面的「湯姆」,那麼Tx就是3,表明輸入句子的長度,h1=f(「Tom」),h2=f(「Chase」),h3=f(「Jerry」),對應的注意力模型權值分別是0.6, 0.2, 0.2,因此g函數就是個加權求和函數。若是形象表示的話,翻譯中文單詞「湯姆」的時候,數學公式對應的中間語義表示Ci的造成過程相似下圖:
這裏還有一個問題:生成目標句子某個單詞,好比「湯姆」的時候,你怎麼知道AM模型所須要的輸入句子單詞注意力分配機率分佈值呢?就是說「湯姆」對應的機率分佈:
此時的Encoder和Decoder都採用RNN模型,咱們來看看如今的Encoder-Decoder模型結構:
用下圖能夠較爲便捷地說明注意力分配機率分佈值的通用計算過程:
對於採用RNN的Decoder來講,若是要生成yi單詞,在時刻t = i,咱們是能夠知道在生成Yi以前的隱層節點t = i時刻的輸出值Hi的,而咱們的目的是要計算生成Yi時的輸入句子單詞「Tom」、「Chase」、「Jerry」對Yi來講的注意力分配機率分佈,那麼能夠用t = i時刻的隱層節點狀態Hi去一一和輸入句子中每一個單詞對應的RNN隱層節點狀態hj進行對比,即經過函數F(hj, Hi)來得到目標單詞Yi和每一個輸入單詞對應的對齊可能性,這個F函數在不一樣論文裏可能會採起不一樣的方法,而後函數F的輸出通過Softmax進行歸一化就獲得了符合機率分佈取值區間的注意力分配機率分佈數值。絕大多數AM模型都是採起上述的計算框架來計算注意力分配機率分佈信息,區別只是在F的定義上可能有所不一樣。
上述中提出的解決方法是對於每個Decoder輸出都加權Encoder的信息,以Tom chase Jerry,Encoder-Decoder 「湯姆」,「追逐」,「傑瑞」爲例子,不計算起止符號,輸出爲3個單元,輸入爲3個單元。有時輸入單元與輸出數目會不一致,這裏咱們假設輸入爲X,m個,輸出爲Y,n個。對於每一個yj都會綜合全部x的信息共m個,同時m個X的信息權重之和爲1(由於每一個yj由X決定)。一共有n個y,因此有n組,n*m個權重要計算。
就會有這些問題:
1.每組權重如何合理化表示?利用softMax能夠幫助咱們權重之和爲1
2.彙總權重信息時使用add仍是concat(私覺得add更加合適)?
3.如何表示權重?
4.如何優化權重?
咱們繼續往下看就會找到答案。。
論文中的模型結構圖以下:
Encoder層:採用了雙向的RNN網絡,最後隱層的輸出是兩個向量的拼接 ht=[←ht,→ht]。
Attention層:
其中
在上面公式中 hj 是Encoder層的隱層第 j 時刻的輸出,si−1 是Decoder層第 i−1 時刻隱層的輸出。能夠發如今計算 ci 的模型其實是一個線性模型,並且 ci 事實上是Encoder層中各時刻隱層的輸出的加權平均值。
Decoder層:採用了單向的RNN模型,第 ii 時刻的隱層的輸出是 si 。第 i 時刻的輸出和 si,yi−1,ci 有關
所以引入Attention 機制,在機器翻譯中,模型會本身去學得在不一樣時刻不一樣的權重係數 aij 。
如今咱們對3中提出的問題作些總結:
1.每組權重如何合理化表示?利用softMax能夠幫助咱們權重之和爲1
2.彙總權重信息時使用add仍是concat(私覺得add更加合適)?
3.如何表示權重?
4.如何優化權重?
解答:
1.經過使用softMax來歸一化權重
2.由此公式
3.權重表示是使用
4..權重如何優化,只要把權重表示好,使得網絡能夠經過前向傳播,使用Encoder-Decoder框架的loss就能夠把權重與其餘網絡參數優化好。
若是把Attention機制從上文講述例子中的Encoder-Decoder框架中剝離,並進一步作抽象,能夠更容易看懂Attention機制的本質思想。
圖9 Attention機制的本質思想
咱們能夠這樣來看待Attention機制(參考圖9):將Source中的構成元素想象成是由一系列的<Key,Value>數據對構成,此時給定Target中的某個元素Query,經過計算Query和各個Key的類似性或者相關性,獲得每一個Key對應Value的權重係數,而後對Value進行加權求和,即獲得了最終的Attention數值。因此本質上Attention機制是對Source中元素的Value值進行加權求和,而Query和Key用來計算對應Value的權重係數。便可以將其本質思想改寫爲以下公式:
其中,
固然,從概念上理解,把Attention仍然理解爲從大量信息中有選擇地篩選出少許重要信息並聚焦到這些重要信息上,忽略大多不重要的信息,這種思路仍然成立。聚焦的過程體如今權重係數的計算上,權重越大越聚焦於其對應的Value值上,即權重表明了信息的重要性,而Value是其對應的信息。
從圖9能夠引出另一種理解,也能夠將Attention機制看做一種軟尋址(Soft Addressing):Source能夠看做存儲器內存儲的內容,元素由地址Key和值Value組成,當前有個Key=Query的查詢,目的是取出存儲器中對應的Value值,即Attention數值。經過Query和存儲器內元素Key的地址進行類似性比較來尋址,之因此說是軟尋址,指的不像通常尋址只從存儲內容裏面找出一條內容,而是可能從每一個Key地址都會取出內容,取出內容的重要性根據Query和Key的類似性來決定,以後對Value進行加權求和,這樣就能夠取出最終的Value值,也即Attention值。因此很多研究人員將Attention機制看做軟尋址的一種特例,這也是很是有道理的。
至於Attention機制的具體計算過程,若是對目前大多數方法進行抽象的話,能夠將其概括爲兩個過程:第一個過程是根據Query和Key計算權重係數,第二個過程根據權重係數對Value進行加權求和。而第一個過程又能夠細分爲兩個階段:第一個階段根據Query和Key計算二者的類似性或者相關性;第二個階段對第一階段的原始分值進行歸一化處理;這樣,能夠將Attention的計算過程抽象爲如圖10展現的三個階段。
圖10 三階段計算Attention過程
在第一個階段,能夠引入不一樣的函數和計算機制,根據Query和某個
第一階段產生的分值根據具體產生的方法不一樣其數值取值範圍也不同,第二階段引入相似SoftMax的計算方式對第一階段的得分進行數值轉換,一方面能夠進行歸一化,將原始計算分值整理成全部元素權重之和爲1的機率分佈;另外一方面也能夠經過SoftMax的內在機制更加突出重要元素的權重。即通常採用以下公式計算:
第二階段的計算結果
經過如上三個階段的計算,便可求出針對Query的Attention數值,目前絕大多數具體的注意力機制計算方法都符合上述的三階段抽象計算過程。
由上述內容咱們能夠對3中的問題如何表示權重,作進一步解答了:
如上圖,經常使用的有三種表達方式,點積,預選類似度(歸一化卷積),MLP網絡(神經網絡)。
經過上述對Attention本質思想的梳理,咱們能夠更容易理解本節介紹的Self Attention模型。Self Attention也常常被稱爲intra Attention(內部Attention),最近一年也得到了比較普遍的使用,好比Google最新的機器翻譯模型內部大量採用了Self Attention模型。
在通常任務的Encoder-Decoder框架中,輸入Source和輸出Target內容是不同的,好比對於英-中機器翻譯來講,Source是英文句子,Target是對應的翻譯出的中文句子,Attention機制發生在Target的元素Query和Source中的全部元素之間。而Self Attention顧名思義,指的不是Target和Source之間的Attention機制,而是Source內部元素之間或者Target內部元素之間發生的Attention機制,也能夠理解爲Target=Source這種特殊狀況下的注意力計算機制。其具體計算過程是同樣的,只是計算對象發生了變化而已,因此此處再也不贅述其計算過程細節。
若是是常規的Target不等於Source情形下的注意力計算,其物理含義正如上文所講,好比對於機器翻譯來講,本質上是目標語單詞和源語單詞之間的一種單詞對齊機制。那麼若是是Self Attention機制,一個很天然的問題是:經過Self Attention到底學到了哪些規律或者抽取出了哪些特徵呢?或者說引入Self Attention有什麼增益或者好處呢?咱們仍然以機器翻譯中的Self Attention來講明,圖11和圖12是可視化地表示Self Attention在同一個英語句子內單詞間產生的聯繫。
圖11 可視化Self Attention實例
圖12 可視化Self Attention實例
從兩張圖(圖十一、圖12)能夠看出,Self Attention能夠捕獲同一個句子中單詞之間的一些句法特徵(好比圖11展現的有必定距離的短語結構)或者語義特徵(好比圖12展現的its的指代對象Law)。
很明顯,引入Self Attention後會更容易捕獲句子中長距離的相互依賴的特徵,由於若是是RNN或者LSTM,須要依次序序列計算,對於遠距離的相互依賴的特徵,要通過若干時間步步驟的信息累積才能將二者聯繫起來,而距離越遠,有效捕獲的可能性越小。
可是Self Attention在計算過程當中會直接將句子中任意兩個單詞的聯繫經過一個計算步驟直接聯繫起來,因此遠距離依賴特徵之間的距離被極大縮短,有利於有效地利用這些特徵。除此外,Self Attention對於增長計算的並行性也有直接幫助做用。這是爲什麼Self Attention逐漸被普遍使用的主要緣由。
Self Attention其實就是把讓Value充當Query,用來表示某個單詞自身與此句子其餘單詞的關聯權重。做用能夠加強句子中長距離的依賴關係(這就解決了RNN的通病,長時間依賴問題)。
前文有述,Attention機制在深度學習的各類應用領域都有普遍的使用場景。上文在介紹過程當中咱們主要以天然語言處理中的機器翻譯任務做爲例子,下面分別再從圖像處理領域和語音識別選擇典型應用實例來對其應用作簡單說明。
圖13 圖片-描述任務的Encoder-Decoder框架
圖片描述(Image-Caption)是一種典型的圖文結合的深度學習應用,輸入一張圖片,人工智能系統輸出一句描述句子,語義等價地描述圖片所示內容。很明顯這種應用場景也可使用Encoder-Decoder框架來解決任務目標,此時Encoder輸入部分是一張圖片,通常會用CNN來對圖片進行特徵抽取,Decoder部分使用RNN或者LSTM來輸出天然語言句子(參考圖13)。
此時若是加入Attention機制可以明顯改善系統輸出效果,Attention模型在這裏起到了相似人類視覺選擇性注意的機制,在輸出某個實體單詞的時候會將注意力焦點聚焦在圖片中相應的區域上。圖14給出了根據給定圖片生成句子「A person is standing on a beach with a surfboard.」過程時每一個單詞對應圖片中的注意力聚焦區域。
圖14 圖片生成句子中每一個單詞時的注意力聚焦區域
圖15給出了另外四個例子形象地展現了這種過程,每一個例子上方左側是輸入的原圖,下方句子是人工智能系統自動產生的描述語句,上方右側圖展現了當AI系統產生語句中劃橫線單詞的時候,對應圖片中聚焦的位置區域。好比當輸出單詞dog的時候,AI系統會將注意力更多地分配給圖片中小狗對應的位置。
圖15 圖像描述任務中Attention機制的聚焦做用
圖16 語音識別中音頻序列和輸出字符之間的Attention
語音識別的任務目標是將語音流信號轉換成文字,因此也是Encoder-Decoder的典型應用場景。Encoder部分的Source輸入是語音流信號,Decoder部分輸出語音對應的字符串流。
圖16可視化地展現了在Encoder-Decoder框架中加入Attention機制後,當用戶用語音說句子 how much would a woodchuck chuck 時,輸入部分的聲音特徵信號和輸出字符之間的注意力分配機率分佈狀況,顏色越深表明分配到的注意力機率越高。從圖中能夠看出,在這個場景下,Attention機制起到了將輸出字符和輸入語音信號進行對齊的功能。
上述內容僅僅選取了不一樣AI領域的幾個典型Attention機制應用實例,Encoder-Decoder加Attention架構因爲其卓越的實際效果,目前在深度學習領域裏獲得了普遍的使用,瞭解並熟練使用這一架構對於解決實際問題會有極大幫助。
在上述文章中,基本上把Attention機制概念和實現細節都介紹了一下,可能還有一些細節之處尚未考慮到,在下一個教程裏,筆者將經過一個實戰的方式來實現Attention機制,完成一個應用,感興趣的朋友能夠持續關注一下。