Attention注意力機制

作者:張俊林
鏈接:https://www.zhihu.com/question/68482809/answer/264632289
來源:知乎

作者:知然劉旭
鏈接:https://blog.csdn.net/m0_37565948/article/details/85111700
來源:csnd

第二篇參考的英文原文地址: https://jalammar.github.io/illustrated-transformer/
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。

我覺着最重要的的就是Q,K,V,這兩篇講的很詳細,而其部分重合,本來想把兩篇合起來,但能力不夠,所以直接複製過來了加了自己的理解 (藍字,所以籃字正確性概不負責)。更進一步的 https://zhuanlan.zhihu.com/p/39034683 結合代碼講解。以下正文:

注意力模型最近幾年在深度學習各個領域被廣泛使用,無論是圖像處理、語音識別還是自然語言處理的各種不同類型的任務中,都很容易遇到注意力模型的身影。所以,瞭解注意力機制的工作原理對於關注深度學習技術發展的技術人員來說有很大的必要。

Attention發展史
       Attention注意力機制現在大火,很多深度學習的框架都帶上了注意力機制,而且也取得了很好的性能指標。Attention機制最早是應用於圖像領域的,九幾年就被提出來的思想。隨着谷歌的一波研究搗鼓,2014年google mind團隊發表的這篇論文《Recurrent Models of Visual Attention》讓其開始火了起來,他們在RNN模型上使用了attention機制來進行圖像分類,然後取得了很好的性能。然後就開始一發不可收拾了。隨後Bahdanau等人在論文《Neural Machine Translation by Jointly Learning to Align and Translate》中,使用類似attention的機制在機器翻譯任務上將翻譯和對齊同時進行,他們的工作算是第一個將attention機制應用到NLP領域中。接着attention機制就被廣泛應用在基於RNN/CNN等神經網絡模型的各種NLP任務中去了,效果較之前有了很大的提高。2017年,google機器翻譯團隊發表的《Attention is all you need》中大量使用了自注意力(self-attention)機制來學習文本表示。這篇論文引起了超大的反應,本身這篇paper寫的也很贊,很是讓人大開眼界。因而自注意力機制也自然而然的成爲了大家近期的研究熱點,並在各種NLP任務上進行探索,紛紛都取得了很好的性能。

        Transformer是《Attention is all you need》論文裏提出來的新的框架,其就是一個升級版的seq2seq,也是由一個encoder和一個decoder組成的。encoder對輸入序列進行編碼,decoder對encoder的結果進行解碼。但是神奇的是,encoder和decoder都不用RNN,而且換成了多個attention。

人類的視覺注意力

    從注意力模型的命名方式看,很明顯其借鑑了人類的注意力機制,因此,我們首先簡單介紹人類視覺的選擇性注意力機制。

圖1 人類的視覺注意力

 

    視覺注意力機制是人類視覺所特有的大腦信號處理機制。人類視覺通過快速掃描全局圖像,獲得需要重點關注的目標區域,也就是一般所說的注意力焦點,而後對這一區域投入更多注意力資源,以獲取更多所需要關注目標的細節信息,而抑制其他無用信息。

    這是人類利用有限的注意力資源從大量信息中快速篩選出高價值信息的手段,是人類在長期進化中形成的一種生存機制,人類視覺注意力機制極大地提高了視覺信息處理的效率與準確性。

    圖1形象化展示了人類在看到一副圖像時是如何高效分配有限的注意力資源的,其中紅色區域表明視覺系統更關注的目標,很明顯對於圖1所示的場景,人們會把注意力更多投入到人的臉部,文本的標題以及文章首句等位置。

    深度學習中的注意力機制從本質上講和人類的選擇性視覺注意力機制類似,核心目標也是從衆多信息中選擇出對當前任務目標更關鍵的信息。

Encoder-Decoder框架

    要了解深度學習中的注意力模型,就不得不先談Encoder-Decoder框架,因爲目前大多數注意力模型附着在Encoder-Decoder框架下,當然,其實注意力模型可以看作一種通用的思想,本身並不依賴於特定框架,這點需要注意。

    Encoder-Decoder框架可以看作是一種深度學習領域的研究模式,應用場景異常廣泛。圖2是文本處理領域裏常用的Encoder-Decoder框架最抽象的一種表示。

圖2 抽象的文本處理領域的Encoder-Decoder框架

 

    文本處理領域的Encoder-Decoder框架可以這麼直觀地去理解:可以把它看作適合處理由一個句子(或篇章)生成另外一個句子(或篇章)的通用處理模型-----一個seq2seq。對於句子對<Source,Target>,我們的目標是給定輸入句子Source,期待通過Encoder-Decoder框架來生成目標句子Target。Source和Target可以是同一種語言,也可以是兩種不同的語言。而Source和Target分別由各自的單詞序列構成:

    

    輸入句子Source,目標句子Target ,xy爲單詞或短語

    Encoder顧名思義就是對輸入句子Source進行編碼,將輸入句子通過非線性變換轉化爲中間語義表示C:

    

c語義編碼 ,f encoder (比如rnn),x 輸入單詞

    對於解碼器Decoder來說,其任務是根據句子Source的中間語義表示C和之前已經生成的歷史信息

    

    來生成i時刻要生成的單詞

        

y i  第i個輸出單詞, c encoder 生成的語義編碼 , g decoder (比如rnn)

    每個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模型(就理解爲soft max 的吧!)

    圖2中展示的Encoder-Decoder框架是沒有體現出“注意力模型”的,所以可以把它看作是注意力不集中的分心模型。爲什麼說它注意力不集中呢?請觀察下目標句子Target中每個單詞的生成過程如下:

    

c是語義編碼 f是decoder(比如rnn),y爲輸出。

其中f是Decoder的非線性變換函數。從這裏可以看出,在生成目標句子的單詞時,不論生成哪個單詞,它們使用的輸入句子Source的語義編碼C都是一樣的,沒有任何區別。

    而語義編碼C是由句子Source的每個單詞經過Encoder 編碼產生的,這意味着不論是生成哪個單詞,y1,y2還是y3,其實句子Source中任意單詞對生成某個目標單詞yi來說影響力都是相同的,這是爲何說這個模型沒有體現出注意力的緣由。這類似於人類看到眼前的畫面,但是眼中卻沒有注意焦點一樣。

    如果拿機器翻譯來解釋這個分心模型的Encoder-Decoder框架更好理解,比如輸入的是英文句子:Tom chase Jerry,Encoder-Decoder框架逐步生成中文單詞:“湯姆”,“追逐”,“傑瑞”。

    在翻譯“傑瑞”這個中文單詞的時候,分心模型裏面的每個英文單詞對於翻譯目標單詞“傑瑞”貢獻是相同的,很明顯這裏不太合理,顯然“Jerry”對於翻譯成“傑瑞”更重要,但是分心模型是無法體現這一點的,這就是爲何說它沒有引入注意力的原因。

    沒有引入注意力的模型在輸入句子比較短的時候問題不大,但是如果輸入句子比較長,此時所有語義完全通過一箇中間語義向量來表示,單詞自身的信息已經消失,可想而知會丟失很多細節信息,這也是爲何要引入注意力模型的重要原因。

    上面的例子中,如果引入Attention模型的話,應該在翻譯“傑瑞”的時候,體現出英文單詞對於翻譯當前中文單詞不同的影響程度,比如給出類似下面一個概率分佈值:

    (Tom,0.3)(Chase,0.2) (Jerry,0.5)

    每個英文單詞的概率代表了翻譯當前單詞“傑瑞”時,注意力分配模型分配給不同英文單詞的注意力大小。這對於正確翻譯目標語單詞肯定是有幫助的,因爲引入了新的信息。

    同理,目標句子中的每個單詞都應該學會其對應的源語句子中單詞的注意力分配概率信息。這意味着在生成每個單詞yi的時候,原先都是相同的中間語義表示C會被替換成根據當前生成單詞而不斷變化的Ci。理解Attention模型的關鍵就是這裏,即由固定的中間語義表示C換成了根據當前輸出單詞來調整成加入注意力模型的變化的Ci。增加了注意力模型的Encoder-Decoder框架理解起來如圖3所示。

圖3 引入注意力模型的Encoder-Decoder框架

 

即生成目標句子單詞的過程成了下面的形式:

c是語義編碼 f是decoder模型(比如rnn),y爲輸出    中間語義表示C換成了根據當前輸出單詞來調整成加入注意力模型的變化的Ci(ci怎麼生成?)

而每個Ci可能對應着不同的源語句子單詞的注意力分配概率分佈,比如對於上面的英漢翻譯來說,其對應的信息可能如下:

 

    

    其中,f2函數代表Encoder對輸入英文單詞的某種變換函數,比如如果Encoder是用的RNN模型的話,這個f2函數的結果往往是某個時刻輸入xi後隱層節點的狀態值g代表Encoder根據單詞的中間表示合成整個句子中間語義表示的變換函數,一般的做法中,g函數就是對構成元素加權求和,即下列公式:

    

    其中,Lx代表輸入句子Source的長度aij代表在Target輸出第i個單詞時Source輸入句子中第j個單詞的注意力分配係數,而hj則是Source輸入句子中第j個單詞的語義編碼。假設下標i就是上面例子所說的“ 湯姆” ,那麼Lx就是3,h1=f(“Tom”),h2=f(“Chase”),h3=f(“Jerry”)分別是輸入句子每個單詞的語義編碼,對應的注意力模型權值則分別是0.6,0.2,0.2,所以g函數本質上就是個加權求和函數。如果形象表示的話,翻譯中文單詞“湯姆”的時候,數學公式對應的中間語義表示Ci的形成過程類似圖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在生成Yi之前的時刻i-1時,隱層節點i-1時刻的輸出值Hi-1的,而我們的目的是要計算生成Yi時輸入句子中的單詞“Tom”、“Chase”、“Jerry”對Yi來說的注意力分配概率分佈,那麼可以用Target輸出句子i-1時刻的隱層節點狀態Hi-1去一一和輸入句子Source中每個單詞對應的RNN隱層節點狀態hj進行對比,即通過函數F(hj,Hi-1)來獲得目標單詞yi和每個輸入單詞對應的對齊可能性,這個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的權重係數。即可以將其本質思想改寫爲如下公式:

 

    其中,Lx=||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,F和key,value是什麼,在Encoder-Decoder框架中扮演什麼角色?

query:Target中的某個元素Query(輸出中某個單詞的語義編碼?)。對於Yi來說,Target輸出句子i-1時刻的隱層節點狀態Hi-1

key/value:輸入句子每個單詞的語義編碼,輸入句子Source中每個單詞對應的RNN隱層節點狀態hj,key用來計算相似度,value用來加權求合,在上面的Encoder-Decoder例子中key和value爲一個。

F:就是下面

    在第一個階段,可以引入不同的函數和計算機制,根據Query和某個Key_i,計算兩者的相似性或者相關性,最常見的方法包括:求兩者的向量點積、求兩者的向量Cosine相似性或者通過再引入額外的神經網絡來求值,即如下方式:

 

    第一階段產生的分值根據具體產生的方法不同其數值取值範圍也不一樣,第二階段引入類似SoftMax的計算方式對第一階段的得分進行數值轉換,一方面可以進行歸一化,將原始計算分值整理成所有元素權重之和爲1的概率分佈;另一方面也可以通過SoftMax的內在機制更加突出重要元素的權重。即一般採用如下公式計算:

    第二階段的計算結果a_i即爲value_i對應的權重係數,然後進行加權求和即可得到Attention數值:

    通過如上三個階段的計算,即可求出針對Query的Attention數值,目前絕大多數具體的注意力機制計算方法都符合上述的三階段抽象計算過程。

 

Self 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實例

    從兩張圖(圖11、圖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架構由於其卓越的實際效果,目前在深度學習領域裏得到了廣泛的使用,瞭解並熟練使用這一架構對於解決實際問題會有極大幫助。

Transfrom中的Attention注意力機制

整體框架


     整體架構看似複雜,其實就是一個Seq2Seq結構,簡化一下,就是這樣的:

    Encoder的輸出和decoder的結合如下,即最後一個encoder的輸出將和每一層的decoder進行結合:

好了,我們主要關注的是每一層Encoder和每一層Decoder的內部結構。如下圖所示:

     可以看到,Encoder每一層有兩個操作,分別是Self-Attention和Feed Forward;而Decoder每一層有三個操作,分別是Self-Attention、Encoder-Decoder Attention以及Feed Forward操作。這裏的Self-Attention和Encoder-Decoder Attention都是用的是Multi-Head Attention機制,這也是我們本文重點講解的地方。

     在介紹之前,我們先介紹下我們的數據,經過處理之後,數據如下:

       很簡單,上面部分是我們的x,也就是encoder的輸入,下面部分是y,也就是decoder的輸入,這是一個機器翻譯的數據,x中的每一個id代表一個語言中的單詞id,y中的每一個id代表另一種語言中的單詞id。後面爲0的部分是填充部分,代表這個句子的長度沒有達到我們設置的最大長度,進行補齊。

3、Attention回顧
     Attention其實就是計算一種相關程度,看下面的例子:

       Attention通常可以進行如下描述,表示爲將query(Q)和key-value pairs映射到輸出上,其中query、每個key、每個value(上文:將Source中的構成元素想象成是由一系列的<Key,Value>數據對構成,此時給定Target中的某個元素Query)都是向量,輸出是V中所有values的加權,其中權重是由Query和每個key計算出來的,計算方法分爲三步:

1)計算比較Q和K的相似度,用f來表示:

2)將得到的相似度進行softmax歸一化:

3)針對計算出來的權重,對所有的values進行加權求和,得到Attention向量:

計算Query和各個Key的相似性或者相關性,得到每個Key對應Value的權重係數,然後對Value進行加權求和,即得到了最終的Attention數值。所以本質上Attention機制是對Source中元素的Value值進行加權求和,而Query和Key用來計算對應Value的權重係數。

上述列舉的公式比較抽象,屬於概念化解釋,下面會列舉self-attention、multi-head attention例子來闡明上述內容。

3.1、Self-Attention
       Self attention這個單詞看起來好像每個人都知道是什麼意思,但實質上他是算法領域中新出的概念,可以通過閱讀:Attention is All You Need 來理解self attention的原理。

       假設下面的句子就是我們需要翻譯的輸入句:

”The animal didn't cross the street because it was too tired”

       這句話中的"it"指的是什麼?它指的是“animal”還是“street”?對於人來說,這其實是一個很簡單的問題,但是對於一個算法來說,處理這個問題其實並不容易。self attention的出現就是爲了解決這個問題,通過self attention,我們能將“it”與“animal”聯繫起來。
       當模型處理單詞的時候,self attention層可以通過當前單詞去查看其輸入序列中的其他單詞,以此來尋找編碼這個單詞更好的線索。

-------------------------------------------------------------------        

如上圖,是我們第五層Encoder針對單詞'it'的圖示,可以發現,我們的Encoder在編碼單詞‘it’時,部分注意力機制集中在了‘animl’上,這部分的注意力會通過權值傳遞的方式影響到'it'的編碼。

       下面我們先介紹如何用向量的方式來計算self attention,然後再來看看它是如何使用矩陣來實現的。

        計算self attention的第一步是從每個Encoder的輸入向量上創建3個向量(在這個情況下,對每個單詞做詞嵌入)。所以,對於每個單詞,我們創建一個Query向量,一個Key向量和一個Value向量(沒錯,一直都是這三個。>_<。這些向量是通過詞嵌入乘以我們訓練過程中創建的3個訓練矩陣而產生的

       注意這些新向量的維度比嵌入向量小。我們知道嵌入向量的維度爲512,而這裏的新向量的維度只有64維。新向量並不是必須小一些,這是網絡架構上的選擇需要適當降低系統的計算量。

        第一步:我們將x1乘以wq的權重矩陣得到新向量qi,既是“query”的向量。同理,最終我們可以對輸入句子的每個單詞創建“query”,“key”,“value”的新向量表示形式。

        那麼“query”,“key”,“value”是什麼向量呢?有什麼用呢?這些向量的概念是很抽象,但是它確實有助於計算注意力。不過先不用糾結去理解它,後面的的內容,會幫助你理解的。

        計算self attention的第二步是計算得分。以上圖爲例,假設我們在計算第一個單詞“thinking”的self attention。我們需要根據這個單詞對輸入句子的每個單詞進行評分。當我們在某個位置編碼單詞時,分數決定了對輸入句子的其他單詞的關照程度

       通過將query向量和key向量點擊來對相應的單詞打分。所以,如果我們處理開始位置的的self attention,則第一個分數爲和的點積,第二個分數爲和的點積。如下圖

       第三步和第四步的計算,是將第二部的得分除以8(\sqrt{d_{k}})(論文中使用key向量的維度是64維,其平方根=8,這樣可以使得訓練過程中具有更穩定的梯度。這個\sqrt{d_{k}}並不是唯一值,經驗所得)。然後再將得到的輸出通過softmax函數標準化歸一化),使得最後的列表和爲1。

       這個softmax的分數決定了當前單詞在每個句子中每個單詞位置的表示程度。很明顯,當前單詞對應句子中此單詞所在位置的softmax的分數最高,但是,有時候attention機制也能關注到此單詞外的其他單詞,這很有用。

      第五步是將每個Value向量乘以softmax後的得分。這裏實際上的意義在於保存對當前詞的關注度不變的情況下,降低對不相關詞的關注。

      第六步是 累加加權值的向量。 這會在此位置產生self-attention層的輸出(對於第一個單詞)。

(第一步 獲得“query”,“key”,“value”的新向量表示形式

1)計算比較Q和K的相似度,用f來表示:第二步

 

2)將得到的相似度進行softmax歸一化:第3,4,5步

 

3)針對計算出來的權重,對所有的values進行加權求和,得到Attention向量:第6步)

 

       總結self-attention的計算過程,(單詞級別)就是得到一個我們可以放到前饋神經網絡的矢量。 然而在實際的實現過程中,該計算會以矩陣的形式完成,以便更快地處理。下面我們來看看Self-Attention的矩陣計算方式

Matrix Calculation of Self-Attention:self-Attention的矩陣計算方式

 

       第一步是去計算Query,Key和Value矩陣。我們將詞嵌入轉化成矩陣X中,並將其乘以我們訓練的權值矩陣(W^{Q},W^{K},W^{V})

       X矩陣中的每一行對應於輸入句子中的一個單詞。 我們看到的X每一行的方框數實際上是詞嵌入的維度,圖中所示的和論文中是有差距的。X(圖中的4個方框論文中爲512個)和q / k / v向量(圖中的3個方框論文中爲64個)

     最後,由於我們正在處理矩陣,我們可以在一個公式中濃縮前面步驟2到6來計算self attention層的輸出。

3.2、Multi-Head Attention ( self attention的升級版)
       本文通過使用“Multi-headed”的機制來進一步完善self attention層。“Multi-headed”主要通過下面2中方式改善了attention層的性能:

      1. 它拓展了模型關注不同位置的能力。在上面例子中可以看出,”The animal didn't cross the street because it was too tired”,我們的attention機制計算出“it”指代的爲“animal”,這在對語言的理解過程中是很有用的。

       2.它爲attention層提供了多個“representation subspaces”。由下圖可以看到,在self attention中,我們有多個個Query / Key / Value權重矩陣(Transformer使用8個attention heads)。這些集合中的每個矩陣都是隨機初始化生成的。然後通過訓練,用於將詞嵌入(或者來自較低Encoder/Decoder的矢量)投影到不同的“representation subspaces(表示子空間)”中。(類似於CNN的conv卷積層)。

(從https://www.zhihu.com/question/341222779  香儂科技 回答中  截下來的Transformer的更新公式,對Multi-Head Attention講的有點東西,但我沒看懂,所以直接抄結果:

爲什麼需要有Multi-Head。從這篇文章的結果來看,Multi-Head其實不是必須的,去掉一些頭效果依然有不錯的效果(而且效果下降可能是因爲參數量下降),這是因爲在頭足夠的情況下,這些頭已經能夠有關注位置信息、關注語法信息、關注罕見詞的能力了,再多一些頭,無非是一種enhance或noise而已。

       通過multi-headed attention,我們爲每個“header”都獨立維護一套Q/K/V的權值矩陣。然後我們還是如之前單詞級別的計算過程一樣處理這些數據。

        如果對上面的例子做同樣的self attention計算,而因爲我們有8頭attention(head attention ),所以我們會在八個時間點去計算這些不同的權值矩陣,但最後結束時,我們會得到8個不同的矩陣。如下圖:

       

(嘿我的老朋友) 瞧瞧,這會給我們後續工作造成什麼問題?

       我們知道在self-attention後面緊跟着的是前饋神經網絡,而前饋神經網絡接受的是單個矩陣向量,而不是8個矩陣。所以我們需要一種辦法,把這8個矩陣壓縮成一個矩陣。

       我們將這8個矩陣連接在一起然後再與一個矩陣相乘。步驟如下圖所示:

1       把所有的 attention heads 連在一起。

2.      和wo矩陣相乘,wo 和model 一起訓練的

3       把結果送到FFNN

這樣multi-headed self attention的全部內容就介紹完了。之前可能都是一些過程的圖解,現在我將這些過程連接在一起,用一個整體的框圖來表示一下計算的過程,希望可以加深理解。

-------------------------------------------------------------------我是分割線----------------(有點暈,先去玩會遊戲等會再看。)       

1.這是我們的輸入序列。

2.w2v單詞轉化爲詞向量。

3.分成8個head,我們用權重矩陣乘以X或R.

4.使用得到的Q/R/V矩陣計算attention。

5.將得到的Z矩陣連接起來,然後與weiget矩陣wo相乘,生成該層的輸出。

在除#0之外的所有編碼器中,我們不需要詞嵌入。我們直接從這個編碼器的輸出開始

現在我們已經觸及了attention的header,讓我們重新審視我們之前的例子,看看例句中的“it”這個單詞在不同的attention header情況下會有怎樣不同的關注點。

       如圖:當我們對“it”這個詞進行編碼時,一個注意力的焦點主要集中在“animal”上,而另一個注意力集中在“tired” -從某種意義上說,模型對單詞“ it”的表示體現在某些表示上既“動物”又““tired” 。

但是,如果我們將所有注意力添加到圖片中,那麼事情可能更難理解:

3.3、位置向量
       我們可能忽略了去介紹一個重要的內容,就是怎麼考慮輸入序列中單詞順序的方法。爲了解決這個問題,transformer爲每個輸入單詞的詞嵌入上添加了一個新向量-位置向量。這些位置編碼向量有固定的生成方式,所以獲取他們是很方便的,但是這些信息確是很有用的,他們能捕捉每個單詞的位置,或者序列中不同單詞之間的距離。將這些信息也添加到詞嵌入中,然後與Q/K/V向量點擊,獲得的attention就有了距離的信息了。

       爲了讓模型捕捉到單詞的順序信息,我們添加位置編碼向量信息(POSITIONAL ENCODING)-位置編碼向量不需要訓練,它有一個規則的產生方式。

       如果我們的嵌入維度爲4,那麼實際上的位置編碼就如下圖所示:

        那麼生成位置向量需要遵循怎樣的規則呢?

        觀察下面的圖形,每一行都代表着對一個矢量的位置編碼。因此第一行就是我們輸入序列中第一個字的嵌入向量,每行都包含512個值,每個值介於1和-1之間。我們用顏色來表示1,-1之間的值,這樣方便可視化的方式表現出來:

        這是一個20個字(行)的(512)列位置編碼示例。你會發現它咋中心位置被分爲了2半,這是因爲左半部分的值是一由一個正弦函數生成的,而右半部分是由另一個函數(餘弦)生成。然後將它們連接起來形成每個位置編碼矢量。

        位置編碼的公式在論文(3.5節)中有描述。你也可以在中查看用於生成位置編碼的代碼get_timing_signal_1d()。這不是位置編碼的唯一可能方法。然而,它具有能夠擴展到看不見的序列長度的優點(例如,如果我們訓練的模型被要求翻譯的句子比我們訓練集中的任何句子都長)。

3.4、Layer-Normalization
        這一節介紹的是encoder過程中的每個self-attention層的左右連接情況,我們稱這個爲:layer-normalization 步驟。如下圖所示:

       在進一步探索其內部計算方式,我們可以將上面圖層可視化爲下圖:

     Decoder的子層也是同樣的,如果我們想做堆疊了2個Encoder和2個Decoder的Transformer,那麼它可視化就會如下圖所示:

3.5、All Processes
       我們已經基本介紹完了Encoder的大多數概念,我們基本上也可以預知Decoder是怎麼工作的。現在我們來仔細探討下Decoder的數據計算原理,當序列輸入時,Encoder開始工作,最後在其頂層的Encoder輸出矢量組成的列表,然後我們將其轉化爲一組attention的集合(K,V)。(K,V)將帶入每個Decoder的“encoder-decoder attention”層中去計算(這樣有助於decoder捕獲輸入序列的位置信息)。

       完成encoder階段後,我們開始decoder階段,decoder階段中的每個步驟輸出來自輸出序列的元素(在這種情況下爲英語翻譯句子)。上面實際上已經是應用的階段了,那我們訓練階段是如何的呢?

      我們以下圖的步驟進行訓練,直到輸出一個特殊的符號<end of sentence>,表示已經完成了。 The output of each step is fed to the bottom decoder in the next time step, and the decoders bubble up their decoding results just like the encoders did. 對於Decoder,和Encoder一樣,我們在每個Decoder的輸入做詞嵌入並添加上表示每個字位置的位置編碼。

       Decoder中的self attention與Encoder的self attention略有不同:

       在Decoder中,self attention只關注輸出序列中的較早的位置。這是在self attention計算中的softmax步驟之前屏蔽了特徵位置(設置爲 -inf)來完成的。

     “Encoder-Decoder Attention”層的工作方式與"Multi-Headed Self-Attention"一樣,只是它從下面的層創建其Query矩陣,並在Encoder堆棧的輸出中獲取Key和Value的矩陣。

       Decoder的輸出是浮點數的向量列表。我們是如何將其變成一個單詞的呢?這就是最終的線性層和softmax層所做的工作。線性層是一個簡單的全連接神經網絡,它是由Decoder堆棧產生的向量投影到一個更大,更大的向量中,稱爲對數向量。

        假設實驗中我們的模型從訓練數據集上總共學習到1萬個英語單詞(“Output Vocabulary”)。這對應的Logits矢量也有1萬個長度-每一段表示了一個唯一單詞的得分。在線性層之後是一個softmax層,softmax將這些分數轉換爲概率。選取概率最高的索引,然後通過這個索引找到對應的單詞作爲輸出。


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章