最近兩年,注意力模型(Attention Model)被普遍使用在天然語言處理、圖像識別及語音識別等各類不一樣類型的深度學習任務中,是深度學習技術中最值得關注與深刻了解的核心技術之一。網絡
本文以機器翻譯爲例,深刻淺出地介紹了深度學習中注意力機制的原理及關鍵計算機制,同時也抽象出其本質思想,並介紹了注意力模型在圖像及語音等領域的典型應用場景。架構
注意力模型最近幾年在深度學習各個領域被普遍使用,不管是圖像處理、語音識別仍是天然語言處理的各類不一樣類型的任務中,都很容易遇到注意力模型的身影。因此,瞭解注意力機制的工做原理對於關注深度學習技術發展的技術人員來講有很大的必要。框架
人類的視覺注意力函數
從注意力模型的命名方式看,很明顯其借鑑了人類的注意力機制,所以,咱們首先簡單介紹人類視覺的選擇性注意力機制。學習
圖1 人類的視覺注意力ui
視覺注意力機制是人類視覺所特有的大腦信號處理機制。人類視覺經過快速掃描全局圖像,得到須要重點關注的目標區域,也就是通常所說的注意力焦點,然後對這一區域投入更多注意力資源,以獲取更多所須要關注目標的細節信息,而抑制其餘無用信息。編碼
這是人類利用有限的注意力資源從大量信息中快速篩選出高價值信息的手段,是人類在長期進化中造成的一種生存機制,人類視覺注意力機制極大地提升了視覺信息處理的效率與準確性。人工智能
圖1形象化展現了人類在看到一副圖像時是如何高效分配有限的注意力資源的,其中紅色區域代表視覺系統更關注的目標,很明顯對於圖1所示的場景,人們會把注意力更多投入到人的臉部,文本的標題以及文章首句等位置。spa
深度學習中的注意力機制從本質上講和人類的選擇性視覺注意力機制相似,核心目標也是從衆多信息中選擇出對當前任務目標更關鍵的信息。.net
Encoder-Decoder框架
要了解深度學習中的注意力模型,就不得不先談Encoder-Decoder框架,由於目前大多數注意力模型附着在Encoder-Decoder框架下,固然,其實注意力模型能夠看做一種通用的思想,自己並不依賴於特定框架,這點須要注意。
Encoder-Decoder框架能夠看做是一種深度學習領域的研究模式,應用場景異常普遍。圖2是文本處理領域裏經常使用的Encoder-Decoder框架最抽象的一種表示。
圖2 抽象的文本處理領域的Encoder-Decoder框架
文本處理領域的Encoder-Decoder框架能夠這麼直觀地去理解:能夠把它看做適合處理由一個句子(或篇章)生成另一個句子(或篇章)的通用處理模型。對於句子對<Source,Target>,咱們的目標是給定輸入句子Source,期待經過Encoder-Decoder框架來生成目標句子Target。Source和Target能夠是同一種語言,也能夠是兩種不一樣的語言。而Source和Target分別由各自的單詞序列構成:
Encoder顧名思義就是對輸入句子Source進行編碼,將輸入句子經過非線性變換轉化爲中間語義表示C:
對於Decoder來講,其任務是根據句子Source的中間語義表示C和以前已經生成的歷史信息來生成i時刻要生成的單詞
:
每一個yi都依次這麼產生,那麼看起來就是整個系統根據輸入句子Source生成了目標句子Target。若是Source是中文句子,Target是英文句子,那麼這就是解決機器翻譯問題的Encoder-Decoder框架;若是Source是一篇文章,Target是歸納性的幾句描述語句,那麼這是文本摘要的Encoder-Decoder框架;若是Source是一句問句,Target是一句回答,那麼這是問答系統或者對話機器人的Encoder-Decoder框架。因而可知,在文本處理領域,Encoder-Decoder的應用領域至關普遍。
Encoder-Decoder框架不只僅在文本領域普遍使用,在語音識別、圖像處理等領域也常用。好比對於語音識別來講,圖2所示的框架徹底適用,區別無非是Encoder部分的輸入是語音流,輸出是對應的文本信息;而對於「圖像描述」任務來講,Encoder部分的輸入是一副圖片,Decoder的輸出是可以描述圖片語義內容的一句描述語。通常而言,文本處理和語音識別的Encoder部分一般採用RNN模型,圖像處理的Encoder通常採用CNN模型。
Attention模型
本節先以機器翻譯做爲例子講解最多見的Soft Attention模型的基本原理,以後拋離Encoder-Decoder框架抽象出了注意力機制的本質思想,而後簡單介紹最近廣爲使用的Self Attention的基本思路。
Soft Attention模型
圖2中展現的Encoder-Decoder框架是沒有體現出「注意力模型」的,因此能夠把它看做是注意力不集中的分心模型。爲何說它注意力不集中呢?請觀察下目標句子Target中每一個單詞的生成過程以下:
其中f是Decoder的非線性變換函數。從這裏能夠看出,在生成目標句子的單詞時,不論生成哪一個單詞,它們使用的輸入句子Source的語義編碼C都是同樣的,沒有任何區別。
而語義編碼C是由句子Source的每一個單詞通過Encoder 編碼產生的,這意味着不管是生成哪一個單詞,仍是
,其實句子Source中任意單詞對生成某個目標單詞yi來講影響力都是相同的,這是爲什麼說這個模型沒有體現出注意力的原因。這相似於人類看到眼前的畫面,可是眼中卻沒有注意焦點同樣。
若是拿機器翻譯來解釋這個分心模型的Encoder-Decoder框架更好理解,好比輸入的是英文句子:Tom chase Jerry,Encoder-Decoder框架逐步生成中文單詞:「湯姆」,「追逐」,「傑瑞」。
在翻譯「傑瑞」這個中文單詞的時候,分心模型裏面的每一個英文單詞對於翻譯目標單詞「傑瑞」貢獻是相同的,很明顯這裏不太合理,顯然「Jerry」對於翻譯成「傑瑞」更重要,可是分心模型是沒法體現這一點的,這就是爲什麼說它沒有引入注意力的緣由。
沒有引入注意力的模型在輸入句子比較短的時候問題不大,可是若是輸入句子比較長,此時全部語義徹底經過一箇中間語義向量來表示,單詞自身的信息已經消失,可想而知會丟失不少細節信息,這也是爲什麼要引入注意力模型的重要緣由。
上面的例子中,若是引入Attention模型的話,應該在翻譯「傑瑞」的時候,體現出英文單詞對於翻譯當前中文單詞不一樣的影響程度,好比給出相似下面一個機率分佈值:
(Tom,0.3)(Chase,0.2) (Jerry,0.5)
每一個英文單詞的機率表明了翻譯當前單詞「傑瑞」時,注意力分配模型分配給不一樣英文單詞的注意力大小。這對於正確翻譯目標語單詞確定是有幫助的,由於引入了新的信息。
同理,目標句子中的每一個單詞都應該學會其對應的源語句子中單詞的注意力分配機率信息。這意味着在生成每一個單詞的時候,原先都是相同的中間語義表示C會被替換成根據當前生成單詞而不斷變化的
。理解Attention模型的關鍵就是這裏,即由固定的中間語義表示C換成了根據當前輸出單詞來調整成加入注意力模型的變化的
。增長了注意力模型的Encoder-Decoder框架理解起來如圖3所示。
圖3 引入注意力模型的Encoder-Decoder框架
即生成目標句子單詞的過程成了下面的形式:
而每一個可能對應着不一樣的源語句子單詞的注意力分配機率分佈,好比對於上面的英漢翻譯來講,其對應的信息可能以下:
其中,f2函數表明Encoder對輸入英文單詞的某種變換函數,好比若是Encoder是用的RNN模型的話,這個f2函數的結果每每是某個時刻輸入後隱層節點的狀態值;g表明Encoder根據單詞的中間表示合成整個句子中間語義表示的變換函數,通常的作法中,g函數就是對構成元素加權求和,即下列公式:
其中,表明輸入句子Source的長度,
表明在Target輸出第i個單詞時Source輸入句子中第j個單詞的注意力分配係數,而
則是Source輸入句子中第j個單詞的語義編碼。假設
下標i就是上面例子所說的「 湯姆」 ,那麼
就是3,h1=f(「Tom」),h2=f(「Chase」),h3=f(「Jerry」)分別是輸入句子每一個單詞的語義編碼,對應的注意力模型權值則分別是0.6,0.2,0.2,因此g函數本質上就是個加權求和函數。若是形象表示的話,翻譯中文單詞「湯姆」的時候,數學公式對應的中間語義表示
的造成過程相似圖4。
圖4 Attention的造成過程
這裏還有一個問題:生成目標句子某個單詞,好比「湯姆」的時候,如何知道Attention模型所須要的輸入句子單詞注意力分配機率分佈值呢?就是說「湯姆」對應的輸入句子Source中各個單詞的機率分佈:(Tom,0.6)(Chase,0.2) (Jerry,0.2) 是如何獲得的呢?
爲了便於說明,咱們假設對圖2的非Attention模型的Encoder-Decoder框架進行細化,Encoder採用RNN模型,Decoder也採用RNN模型,這是比較常見的一種模型配置,則圖2的框架轉換爲圖5。
圖5 RNN做爲具體模型的Encoder-Decoder框架
那麼用圖6能夠較爲便捷地說明注意力分配機率分佈值的通用計算過程。
圖6 注意力分配機率計算
對於採用RNN的Decoder來講,在時刻i,若是要生成yi單詞,咱們是能夠知道Target在生成以前的時刻i-1時,隱層節點i-1時刻的輸出值
的,而咱們的目的是要計算生成
時輸入句子中的單詞「Tom」、「Chase」、「Jerry」對
來講的注意力分配機率分佈,那麼能夠用Target輸出句子i-1時刻的隱層節點狀態
去一一和輸入句子Source中每一個單詞對應的RNN隱層節點狀態hj進行對比,即經過函數F(
,
)來得到目標單詞
和每一個輸入單詞對應的對齊可能性,這個F函數在不一樣論文裏可能會採起不一樣的方法,而後函數F的輸出通過Softmax進行歸一化就獲得了符合機率分佈取值區間的注意力分配機率分佈數值。
絕大多數Attention模型都是採起上述的計算框架來計算注意力分配機率分佈信息,區別只是在F的定義上可能有所不一樣。圖7可視化地展現了在英語-德語翻譯系統中加入Attention機制後,Source和Target兩個句子每一個單詞對應的注意力分配機率分佈。
圖7 英語-德語翻譯的注意力機率分佈
上述內容就是經典的Soft Attention模型的基本思想,那麼怎麼理解Attention模型的物理含義呢?通常在天然語言處理應用裏會把Attention模型看做是輸出Target句子中某個單詞和輸入Source句子每一個單詞的對齊模型,這是很是有道理的。
目標句子生成的每一個單詞對應輸入句子單詞的機率分佈能夠理解爲輸入句子單詞和這個目標生成單詞的對齊機率,這在機器翻譯語境下是很是直觀的:傳統的統計機器翻譯通常在作的過程當中會專門有一個短語對齊的步驟,而注意力模型其實起的是相同的做用。
圖8 Google 神經網絡機器翻譯系統結構圖
圖8所示即爲Google於2016年部署到線上的基於神經網絡的機器翻譯系統,相對傳統模型翻譯效果有大幅提高,翻譯錯誤率下降了60%,其架構就是上文所述的加上Attention機制的Encoder-Decoder框架,主要區別無非是其Encoder和Decoder使用了8層疊加的LSTM模型。
Attention機制的本質思想
若是把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的權重係數。便可以將其本質思想改寫爲以下公式:
其中,=||Source||表明Source的長度,公式含義即如上所述。上文所舉的機器翻譯的例子裏,由於在計算Attention的過程當中,Source中的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和某個,計算二者的類似性或者相關性,最多見的方法包括:求二者的向量點積、求二者的向量Cosine類似性或者經過再引入額外的神經網絡來求值,即以下方式:
第一階段產生的分值根據具體產生的方法不一樣其數值取值範圍也不同,第二階段引入相似SoftMax的計算方式對第一階段的得分進行數值轉換,一方面能夠進行歸一化,將原始計算分值整理成全部元素權重之和爲1的機率分佈;另外一方面也能夠經過SoftMax的內在機制更加突出重要元素的權重。即通常採用以下公式計算:
第二階段的計算結果即爲
對應的權重係數,而後進行加權求和便可獲得Attention數值:
經過如上三個階段的計算,便可求出針對Query的Attention數值,目前絕大多數具體的注意力機制計算方法都符合上述的三階段抽象計算過程。
Self Attention模型
經過上述對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逐漸被普遍使用的主要緣由。
Attention機制的應用
前文有述,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架構因爲其卓越的實際效果,目前在深度學習領域裏獲得了普遍的使用,瞭解並熟練使用這一架構對於解決實際問題會有極大幫助。