AI算法之Attention機制

1 Attention的本質是什麼?

Attention(注意力)機制如果淺層的理解,跟它的名字非常匹配。它的核心邏輯就是從關注全部到關注重點

Attention 機制很像人類看圖片的邏輯,當我們看一張圖片的時候,我們並沒有看清圖片的全部內容,而是將注意力集中在了圖片的焦點上。大家看一下下面這張圖:

但是很少有人會意識到「錦江飯店」上面還有一串「電話號碼」,也不會意識到「喜運來大酒家」,如下圖:

所以,當我們看一張圖片的時候,其實是這樣的:

上面所說的,我們的視覺系統就是一種 Attention機制,將有限的注意力集中在重點信息上,從而節省資源,快速獲得最有效的信息。

Attention 機制最早是在計算機視覺裏應用的,隨後在 NLP 領域也開始應用了,真正發揚光大是在 NLP 領域,因爲 2018 年 BERT 和 GPT 的效果出奇的好,進而走紅。而 Transformer 和 Attention 這些核心開始被大家重點關注。

2 Attention的優點

之所以引入Attention機制,主要是3個原因:

  • 參數少:模型複雜度跟 CNN、RNN 相比,複雜度更小,參數也更少。所以對算力的要求也就更小。

  • 速度快:Attention 解決了 RNN 不能並行計算的問題。Attention機制每一步計算不依賴於上一步的計算結果,因此可以和CNN一樣並行處理。

  • 效果好:Attention 是挑重點,就算文本比較長,也能從中間抓住重點,不丟失重要的信息。

3 Attention的原理

下面的動圖演示了attention 引入 Encoder-Decoder 框架下,完成機器翻譯任務的大致流程。

但是,Attention 並不一定要在 Encoder-Decoder 框架下使用的,它是可以脫離 Encoder-Decoder 框架的。

下面的圖片則是脫離 Encoder-Decoder 框架後的原理圖解。

小故事講解

上面的圖看起來比較抽象,下面用一個例子來解釋 attention 的原理:

圖書管(source)裏有很多書(value),爲了方便查找,我們給書做了編號(key)。當我們想要了解漫威(query)的時候,我們就可以看看那些動漫、電影、甚至二戰(美國隊長)相關的書籍。

爲了提高效率,並不是所有的書都會仔細看,針對漫威來說,動漫,電影相關的會看的仔細一些(權重高),但是二戰的就只需要簡單掃一下即可(權重低)。

當我們全部看完後就對漫威有一個全面的瞭解了。

Attention原理三步分解

  • 第一步: query 和 key 進行相似度計算,得到權值

  • 第二步:將權值進行歸一化,得到直接可用的權重

  • 第三步:將權重和 value 進行加權求和

4.Attention的N種類型

1. 計算區域

根據Attention的計算區域,可以分成以下幾種:

  • Soft Attention

    這是比較常見的Attention方式,對所有key求權重概率,每個key都有一個對應的權重,是一種全局的計算方式(也可以叫Global Attention)。這種方式比較理性,參考了所有key的內容,再進行加權。但是計算量可能會比較大一些。

  • Hard Attention

    這種方式是直接精準定位到某個key,其餘key就都不管了,相當於這個key的概率是1,其餘key的概率全部是0。因此這種對齊方式要求很高,要求一步到位,如果沒有正確對齊,會帶來很大的影響。另一方面,因爲不可導,一般需要用強化學習的方法進行訓練。(或者使用gumbel softmax之類的)

  • Local Attention

    這種方式其實是以上兩種方式的一個折中,對一個窗口區域進行計算。先用Hard方式定位到某個地方,以這個點爲中心可以得到一個窗口區域,在這個小區域內用Soft方式來算Attention。

2. 所用信息

假設我們要對一段原文計算Attention,這裏原文指的是我們要做attention的文本,那麼所用信息包括內部信息和外部信息,內部信息指的是原文本身的信息,而外部信息指的是除原文以外的額外信息。

  • General Attention

    這種方式利用到了外部信息,常用於需要構建兩段文本關係的任務,query一般包含了額外信息,根據外部query對原文進行對齊。
    比如在閱讀理解任務中,需要構建問題和文章的關聯,假設現在baseline是,對問題計算出一個問題向量q,把這個q和所有的文章詞向量拼接起來,輸入到LSTM中進行建模。那麼在這個模型中,文章所有詞向量共享同一個問題向量,現在我們想讓文章每一步的詞向量都有一個不同的問題向量,也就是,在每一步使用文章在該步下的詞向量對問題來算attention,這裏問題屬於原文,文章詞向量就屬於外部信息。

  • Local Attention

    這種方式只使用內部信息,key和value以及query只和輸入原文有關,在self attention中,key=value=query。既然沒有外部信息,那麼在原文中的每個詞可以跟該句子中的所有詞進行Attention計算,相當於尋找原文內部的關係。
    還是舉閱讀理解任務的例子,上面的baseline中提到,對問題計算出一個向量q,那麼這裏也可以用上attention,只用問題自身的信息去做attention,而不引入文章信息。

3. 結構層次

結構方面根據是否劃分層次關係,分爲單層attention,多層attention和多頭attention:

  • 單層Attention

    這是比較普遍的做法,用一個query對一段原文進行一次attention。

  • 多層Attention

    一般用於文本具有層次關係的模型,假設我們把一個document劃分成多個句子,在第一層,我們分別對每個句子使用attention計算出一個句向量(也就是單層attention);在第二層,我們對所有句向量再做attention計算出一個文檔向量(也是一個單層attention),最後再用這個文檔向量去做任務。

  • 多頭Attention

    這是Attention is All You Need中提到的multi-head attention,用到了多個query對一段原文進行了多次attention,每個query都關注到原文的不同部分,相當於重複做多次單層attention:

4. 模型方面

從模型上看,Attention一般用在CNN和LSTM上,也可以直接進行純Attention計算。

  • CNN+Attention

    CNN的卷積操作可以提取重要特徵,我覺得這也算是Attention的思想,但是CNN的卷積感受視野是局部的,需要通過疊加多層卷積區去擴大視野。另外,Max Pooling直接提取數值最大的特徵,也像是hard attention的思想,直接選中某個特徵。

    CNN上加Attention可以加在這幾方面:

    a. 在卷積操作前做attention,比如Attention-Based BCNN-1,這個任務是文本蘊含任務需要處理兩段文本,同時對兩段輸入的序列向量進行attention,計算出特徵向量,再拼接到原始向量中,作爲卷積層的輸入。
    b. 在卷積操作後做attention,比如Attention-Based BCNN-2,對兩段文本的卷積層的輸出做attention,作爲pooling層的輸入。
    c. 在pooling層做attention,代替max pooling。比如Attention pooling,首先我們用LSTM學到一個比較好的句向量,作爲query,然後用CNN先學習到一個特徵矩陣作爲key,再用query對key產生權重,進行attention,得到最後的句向量。
    
  • LSTM+Attention

    LSTM內部有Gate機制,其中input gate選擇哪些當前信息進行輸入,forget gate選擇遺忘哪些過去信息,我覺得這算是一定程度的Attention了,而且號稱可以解決長期依賴問題,實際上LSTM需要一步一步去捕捉序列信息,在長文本上的表現是會隨着step增加而慢慢衰減,難以保留全部的有用信息。

    LSTM通常需要得到一個向量,再去做任務,常用方式有:

    a. 直接使用最後的hidden state(可能會損失一定的前文信息,難以表達全文)
    b. 對所有step下的hidden state進行等權平均(對所有step一視同仁)。
    c. Attention機制,對所有step的hidden state進行加權,把注意力集中到整段文本中比較重要的hidden state信息。性能比前面兩種要好一點,而方便可視化觀察哪些step是重要的,但是要小心過擬合,而且也增加了計算量。
    
  • 純Attention

    Attention is all you need,沒有用到CNN/RNN,乍一聽也是一股清流了,但是仔細一看,本質上還是一堆向量去計算attention。

發佈了489 篇原創文章 · 獲贊 515 · 訪問量 37萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章