【NLP】Attention Model(注意力模型)學習總結


  最近一直在研究深度語義匹配算法,搭建了個模型,跑起來效果並不是很理想,在分析原因的過程中,發現注意力模型在解決這個問題上還是很有幫助的,所以花了兩天研究了一下。

  此文大部分參考深度學習中的注意力機制(2017版) 張俊林的博客,不過添加了一些個人的思考與理解過程。在github上找到一份基於keras框架實現的可運行的注意模型代碼:Attention_Network_With_Keras。如有不足之處,歡迎交流指教。

  注意力模型:對目標數據進行加權變化。人腦的注意力模型,說到底是一種資源分配模型,在某個特定時刻,你的注意力總是集中在畫面中的某個焦點部分,而對其它部分視而不見。 ------(思考:為什么要集中在那個部分,是因為那個部分能解決問題嗎?)

1. 什么是Attention機制?

  最近兩年,注意力模型(Attention Model)被廣泛使用在自然語言處理、圖像識別及語音識別等各種不同類型的深度學習任務中,是深度學習技術中最值得關注與深入了解的核心技術之一。

  當我們人在看一樣東西的時候,我們當前時刻關注的一定是我們當前正在看的這樣東西的某一地方,換句話說,當我們目光移到別處時,注意力隨着目光的移動也在轉移,這意味着,當人們注意到某個目標或某個場景時,該目標內部以及該場景內每一處空間位置上的注意力分布是不一樣的。---------(思考:對於圖片,會有些特別顯眼的場景會率先吸引住注意力,那是因為腦袋中對這類東西很敏感。對於文本,我們大都是帶目的性的去讀,順序查找,順序讀,但是在理解的過程中,我們是根據我們自帶的目的去理解,去關注的。 注意力模型應該與具體的目的(或者任務)相結合。)

  從Attention的作用角度出發,我們就可以從兩個角度來分類Attention種類:Spatial Attention 空間注意力Temporal Attention 時間注意力。更具實際的應用,也可以將Attention分為Soft AttentionHard AttentionSoft Attention是所有的數據都會注意,都會計算出相應的注意力權值,不會設置篩選條件。Hard Attention會在生成注意力權重后篩選掉一部分不符合條件的注意力,讓它的注意力權值為0,即可以理解為不再注意這些不符合條件的部分。

2. 先了解編碼-解碼框架:Encoder-Decoder框架

  目前絕大多數文獻中出現的AM模型是附着在Encoder-Decoder框架下的,當然,其實AM模型可以看作一種通用的思想,本身並不依賴於Encoder-Decoder模型,這點需要注意。Encoder-Decoder框架可以看作是一種文本處理領域的研究模式,應用場景異常廣泛,本身就值得細談。

圖1 抽象的Encoder-Decoder框架

  Encoder-Decoder框架可以這么直觀地去理解:可以把它看作適合處理由一個句子(或篇章)生成另外一個句子(或篇章)的通用處理模型。對於句子對<X,Y>。 --------(思考:<X,Y>對很通用,X是一個問句,Y是答案;X是一個句子,Y是抽取的關系三元組;X是漢語句子,Y是漢語句子的英文翻譯。等等),我們的目標是給定輸入句子X,期待通過Encoder-Decoder框架來生成目標句子Y。X和Y可以是同一種語言,也可以是兩種不同的語言。而X和Y分別由各自的單詞序列構成:

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

  對於解碼器Decoder來說,其任務是根據句子X的中間語義表示C和之前已經生成的歷史信息y1,y2….yi-1來生成i時刻要生成的單詞yi :

  每個yi都依次這么產生,那么看起來就是整個系統根據輸入句子X生成了目標句子Y。 ------(思考:其實這里的Encoder-Decoder是一個序列到序列的模型seq2seq,這個模型是對順序有依賴的。)

  Encoder-Decoder是個非常通用的計算框架,至於Encoder和Decoder具體使用什么模型都是由研究者自己定的,常見的比如 CNN / RNN / BiRNN / GRU / LSTM / Deep LSTM 等,這里的變化組合非常多。 ------(思考:人的學習過程包括輸入、輸出、外界評價。Encoder模型類似於人的輸入學習過程,Decoder模型類似於人的輸出學習過程,對輸出的內容進行評價就類似於損失函數。英語老師給我上了幾堂英語課,我在不斷的輸入Encoder;突然有一個隨堂測試,我得做題輸出Decoder;最后英語老師改卷子,給我一個分數,不對的地方我得反思調整我對輸入數據的加工方式。)-------(再思考:關於英語翻譯。課本上的單詞和課文是原始數據輸入,相當於X;我在大腦里加工這些數據,相當於Encoder模型,我的腦子里有很多加工后的數據,相當於C;現在要讓我翻譯一個英語句子,這個任務相當於Y,我不能翻課本,所以我只能借助我腦袋里加工的數據C去翻譯這個句子,即我得動腦子,相當於Decoder。 學習的過程是什么都要學,要分類整理,要增加線索,並不知道未來的某天能用到什么,所以Encoder-Decoder是一個泛泛學習的框架)

3. Attention Model

  以上介紹的Encoder-Decoder模型是沒有體現出“注意力模型”的,所以可以把它看作是注意力不集中的分心模型。為什么說它注意力不集中呢?請觀察下目標句子Y中每個單詞的生成過程如下:

  其中f是decoder的非線性變換函數。從這里可以看出,在生成目標句子的單詞時,不論生成哪個單詞,是y1,y2也好,還是y3也好,他們使用的句子X的語義編碼C都是一樣的,沒有任何區別。而語義編碼C是由句子X的每個單詞經過Encoder 編碼產生的,這意味着不論是生成哪個單詞,y1,y2還是y3,其實句子X中任意單詞對生成某個目標單詞yi來說影響力都是相同的,沒有任何區別其實如果Encoder是RNN的話,理論上越是后輸入的單詞影響越大,並非等權的,估計這也是為何Google提出Sequence to Sequence模型時發現把輸入句子逆序輸入做翻譯效果會更好的小Trick的原因)。這就是為何說這個模型沒有體現出注意力的緣由。

  引入AM模型,以翻譯一個英語句子舉例:輸入X:Tom chase Jerry。 理想輸出:湯姆追逐傑瑞。

  應該在翻譯“傑瑞”的時候,體現出英文單詞對於翻譯當前中文單詞不同的影響程度,比如給出類似下面一個概率分布值:

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

  每個英文單詞的概率代表了翻譯當前單詞“傑瑞”時,注意力分配模型分配給不同英文單詞的注意力大小。這對於正確翻譯目標語單詞肯定是有幫助的,因為引入了新的信息。同理,目標句子中的每個單詞都應該學會其對應的源語句子中單詞的注意力分配概率信息。這意味着在生成每個單詞Yi的時候,原先都是相同的中間語義表示C會替換成根據當前生成單詞而不斷變化的Ci理解AM模型的關鍵就是這里,即由固定的中間語義表示C換成了根據當前輸出單詞來調整成加入注意力模型的變化的Ci

圖2 引入AM模型的Encoder-Decoder框架

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

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

  其中,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的形成過程類似下圖:

圖3 Ci的形成過程

  這里還有一個問題:生成目標句子某個單詞,比如“湯姆”的時候,你怎么知道AM模型所需要的輸入句子單詞注意力分配概率分布值呢?就是說“湯姆”對應的概率分布:

  划重點(注意力權重獲取的過程)(Tom,0.3)(Chase,0.2)(Jerry,0.5)是如何得到的呢?

  為了便於說明,我們假設對圖1的非AM模型的Encoder-Decoder框架進行細化,Encoder采用RNN模型,Decoder也采用RNN模型,這是比較常見的一種模型配置,則圖1的圖轉換為下圖:

圖4 RNN作為具體模型的Encoder-Decoder框架

  注意力分配概率分布值的通用計算過程:

圖5 AM注意力分配概率計算

  對於采用RNN的Decoder來說,如果要生成 yi 單詞,在時刻 i ,我們是可以知道在生成 Yi 之前的隱層節點i時刻的輸出值 Hi 的,而我們的目的是要計算生成 Yi 時的輸入句子單詞“Tom”、“Chase”、“Jerry”對 Yi 來說的注意力分配概率分布,那么可以用i時刻的隱層節點狀態 Hi 去一一和輸入句子中每個單詞對應的RNN隱層節點狀態 hj 進行對比,即通過函數 F(hj,Hi) 來獲得目標單詞 Yi 和每個輸入單詞對應的對齊可能性,這個F函數在不同論文里可能會采取不同的方法,然后函數F的輸出經過Softmax進行歸一化就得到了符合概率分布取值區間的注意力分配概率分布數值(這就得到了注意力權重)。圖5顯示的是當輸出單詞為“湯姆”時刻對應的輸入句子單詞的對齊概率。絕大多數AM模型都是采取上述的計算框架來計算注意力分配概率分布信息區別只是在F的定義上可能有所不同

  上述內容就是論文里面常常提到的Soft Attention Model(任何數據都會給一個權值,沒有篩選條件)的基本思想,你能在文獻里面看到的大多數AM模型基本就是這個模型,區別很可能只是把這個模型用來解決不同的應用問題。那么怎么理解AM模型的物理含義呢?一般文獻里會把AM模型看作是單詞對齊模型,這是非常有道理的。目標句子生成的每個單詞對應輸入句子單詞的概率分布可以理解為輸入句子單詞和這個目標生成單詞的對齊概率,這在機器翻譯語境下是非常直觀的:傳統的統計機器翻譯一般在做的過程中會專門有一個短語對齊的步驟而注意力模型其實起的是相同的作用。在其他應用里面把AM模型理解成輸入句子和目標句子單詞之間的對齊概率也是很順暢的想法。

圖6 Google 神經網絡機器翻譯系統結構圖

  圖6所示即為Google於2016年部署到線上的基於神經網絡的機器翻譯系統,相對傳統模型翻譯效果有大幅提升,翻譯錯誤率降低了60%,其架構就是上文所述的加上Attention機制的Encoder-Decoder框架,主要區別無非是其Encoder和Decoder使用了8層疊加的LSTM模型。

當然,從概念上理解的話,把AM模型理解成影響力模型也是合理的,就是說生成目標單詞的時候,輸入句子每個單詞對於生成這個單詞有多大的影響程度。這種想法也是比較好理解AM模型物理意義的一種思維方式。

  圖7是論文“A Neural Attention Model for Sentence Summarization”中,Rush用AM模型來做生成式摘要給出的一個AM的一個非常直觀的例子。

圖7 句子生成式摘要例子

  這個例子中,Encoder-Decoder框架的輸入句子X是:“russian defense minister ivanov called sunday for the creation of a joint front for combating global terrorism”。對應圖中縱坐標的句子。系統生成的摘要句子Y是:“russia calls for joint front against terrorism”,對應圖中橫坐標的句子。可以看出模型已經把句子主體部分正確地抽出來了。矩陣中每一列代表生成的目標單詞對應輸入句子每個單詞的AM分配概率,顏色越深代表分配到的概率越大。這個例子對於直觀理解AM是很有幫助作用。

  《A Neural Attention Model for Sentence Summarization》論文提供的實驗數據集鏈接(開放可用):DUC 2004,感興趣的朋友可以下載看看。

圖8 摘要生成 開放數據集

4. 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和某個 Key,計算兩者的相似性或者相關性,最常見的方法包括:求兩者的向量點積、求兩者的向量Cosine相似性或者通過再引入額外的神經網絡來求值,即如下方式:

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

  

  第二階段的計算結果 a即為 Value對應的權重系數,然后進行加權求和即可得到Attention數值:

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

5. Self Attention模型

  通過上述對Attention本質思想的梳理,我們可以更容易理解本節介紹的Self Attention模型。Self Attention也經常被稱為intra Attention(內部Attention),最近一年也獲得了比較廣泛的使用,比如Google最新的機器翻譯模型內部大量采用了Self Attention模型。

  在一般任務的Encoder-Decoder框架中,輸入Source和輸出Target內容是不一樣的,比如對於英-中機器翻譯來說,Source是英文句子,Target是對應的翻譯出的中文句子,Attention機制發生在Target的元素和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逐漸被廣泛使用的主要原因。

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

 


 

參考文章:

【1】自然語言處理中的Attention Model:是什么及為什么

【2】深度學習中的注意力機制(2017版)

【3】Attention注意力機制--原理與應用

【4】Attention_Network_With_Keras

【5】《A Self-Attention Setentence Embedding》閱讀筆記及實踐


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM