淺談Attention機制的理解

寫在前面

Attention注意機制現在大熱,很多深度學習的框架都帶上了注意力機制,而且也取得了很好的性能指標。乘著大熱也來水一水文章,發表發表自己的看法。事先說明老哥我在NLP上萌新一枚,粗糙想法不登大雅,呆萌的邏輯思維適合同為萌新滴你。廢話不多說,在本文我就淺談下對注意機制的理解。

Attentin機制的發家史

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任務中去了,效果看樣子是真的好,彷彿誰不用誰就一點都不fashion一樣。2017年,google機器翻譯團隊發表的《Attention is all you need》中大量使用了自注意力(self-attention)機制來學習文本表示。這篇論文引起了超大的反應,本身這篇paper寫的也很贊,很是讓人大開眼界。因而自注意力機制也自然而然的成為了大家近期的研究熱點,並在各種NLP任務上進行探索,紛紛都取得了很好的性能。

Attention機制的本質

attention機制的本質是從人類視覺注意力機制中獲得靈感(可以說很『以人為本』了)。大致是我們視覺在感知東西的時候,一般不會是一個場景從到頭看到尾每次全部都看,而往往是根據需求觀察注意特定的一部分。而且當我們發現一個場景經常在某部分出現自己想觀察的東西時,我們就會進行學習在將來再出現類似場景時把注意力放到該部分上。這可以說就是注意力機制的本質內容了。至於它本身包含的『自上而下』和『自下而上』方式就不在過多的討論。

Attention機制的理解

Attention機制其實就是一系列注意力分配係數,也就是一系列權重參數罷了。

用encoder to decoder來做引子

我們可以用機器翻譯來作為例子。當給出一句『我愛你』(sorce)中文,要將它翻譯成英文『I love you』(target)時,利用現在深度學習最為流行的model--encoder to decoder,『我愛你』被編碼(這裡指語義編碼)成C,然後在經過非線性函數$g$來decoder得到目標Target中的每一個單詞$y1$,$y2$,$y3$。計算如下:

$$C = f(x1,x2,x3)$$ $$y1 = g(C)$$ $$y2 = g(C,y1)$$ $$y3 = g(C,y1,y2)$$

這樣的過程稱之為一個分心模型。這是因為sorce中每一個元素對語義編碼C的作用是相同的,也就是每一個元素的重要程度都是一樣的。可實際上,『我』這個元素對target中的I的結果是影響最大的,其他元素的影響可以說是微乎其微。但是在上述模型中,這個重要程度沒有被體現出來,所以這是一個分心的模型。而與其對應的注意力模型就是要從序列中學習到每一個元素的重要程度,然後按重要程度將元素合併。這就表明了序列元素在編碼的時候,所對應的語義編碼C是不一樣的。所以一個體現attention機制運行的圖示如下:

所以$C$就不單單是$x1,x2,x3$簡單的encoder,而是成為了各個元素按其重要度加權求和得到的。也即:

$$Ci = sum{j=0}^{Lx}a{ij}f(xj)$$

其中i表示時刻,j表示序列中第j個元素,$Lx$表示序列的長度,$f()$表示元素$xj$的編碼。

現在拋開encoder-decoder

我們現在拋開encoder-decoder來說attention機制。既然attention是一組注意力分配係數的,那麼它是怎樣實現的?這裡要提出一個函數叫做attention函數,它是用來得到attention value的。比較主流的attention框架如下:

上圖其實可以描述出attention value的本質:它其實就是一個查詢(query)到一系列鍵值(key-value)對的映射。

這個也就是attention函數的工作實質,如下圖所示:

Attention函數工作機制

attention函數共有三步完成得到attention value。

- Q與K進行相似度計算得到權值

- 對上部權值歸一化

- 用歸一化的權值與V加權求和

此時加權求和的結果就為注意力值。公式如下:$$Attention Value = similarity(QK^T)V$$

在自然語言任務中,往往K和V是相同的。這時計算出的attention value是一個向量,代表序列元素$xj$的編碼向量。此向量中包含了元素$xj$的上下文關係,即包含全局聯繫也擁有局部聯繫。全局聯繫是因為在求相似度的時候,序列中元素與其他所有元素的相似度計算,然後加權得到了編碼向量。局部聯繫可以這麼解釋,因為它所計算出的attention value是屬於當前輸入的$x_j$的。這也就是attention的強大優勢之一,它可以靈活的捕捉長期和local依賴,而且是一步到位的。

換一個角度理解Attention機制

說到這裡,大家應該也明白attention機制具體是個啥吧。其實也不是很玄乎,就是把序列中各個元素分配一個權重係數。上面從attention函數得到了attention機制工作過程。現在換一個角度來理解,我們將attention機制看做軟定址。就是說序列中每一個元素都由key(地址)和value(元素)數據對存儲在存儲器里,當有query=key的查詢時,需要取出元素的value值(也即query查詢的attention值),與傳統的定址不一樣,它不是按照地址取出值的,它是通過計算key與query的相似度來完成定址。這就是所謂的軟定址,它可能會把所有地址(key)的值(value)取出來,上步計算出的相似度決定了取出來值的重要程度,然後按重要程度合併value值得到attention值,此處的合併指的是加權求和。

談談Attention機制的優劣

優點:

  • 一步到位的全局聯繫捕捉

    上文說了一些,attention機制可以靈活的捕捉全局和局部的聯繫,而且是一步到位的。另一方面從attention函數就可以看出來,它先是進行序列的每一個元素與其他元素的對比,在這個過程中每一個元素間的距離都是一,因此它比時間序列RNNs的一步步遞推得到長期依賴關係好的多,越長的序列RNNs捕捉長期依賴關係就越弱。
  • 並行計算減少模型訓練時間

    Attention機制每一步計算不依賴於上一步的計算結果,因此可以和CNN一樣並行處理。但是CNN也只是每次捕捉局部信息,通過層疊來獲取全局的聯繫增強視野。
  • 模型複雜度小,參數少

    模型複雜度是與CNN和RNN同條件下相比較的。

缺點:

缺點很明顯,attention機制不是一個"distance-aware"的,它不能捕捉語序順序(這裡是語序哦,就是元素的順序)。這在NLP中是比較糟糕的,自然語言的語序是包含太多的信息。如果確實了這方面的信息,結果往往會是打折扣的。說到底,attention機制就是一個精緻的"詞袋"模型。所以有時候我就在想,在NLP任務中,我把分詞向量化後計算一波TF-IDF是不是會和這種attention機製取得一樣的效果呢? 當然這個缺點也好搞定,我在添加位置信息就好了。所以就有了 position-embedding(位置向量)的概念了,這裡就不細說了。

結語

Attention機制說大了就一句話,分配權重係數。當然裡面還有很深的數學道理和理論知識,我還是沒搞懂滴。所以這點淺顯的理解就當茶語飯後的笑談吧。


推薦閱讀:

《Dialogue Act Sequence Labeling using Hierarchical encoder with CRF》閱讀筆記
基於知識庫的問答:seq2seq模型實踐
第三章 自然語言理解的技術分類及比較
NLP 自然語言處理國際會議(轉)
Neural Machine Translation with Word Predictions 閱讀筆記

TAG:自然語言處理 |