1. 程式人生 > >Attention總結

Attention總結

1 定義

  • 首先,在生成target side的states時,所有context vectors 都會被當做輸入。
  • 其次,並不是所有context都對下一個狀態的生成產生影響。例如,當翻譯英文文章的時候,我們要關注的是“當前翻譯的那個部分”,而不是整篇文章。“Attention”的意思就是選擇恰當的context並用它生成下一個狀態。
  • 而注意力(Attention)機制是自然語言處理領域一個常用的建模長時間記憶機制,能夠很直觀的給出每個詞對結果的貢獻,可解釋
  • Attention的核心point是在翻譯每個目標詞(或 預測商品標題文字所屬類別)所用的上下文是不同的,這樣的考慮顯然是更合理的。
  • Attention機制對Source中元素的Value值進行加權求和
  • 傳統上的attention的應用,總是要求我們的task本身同時有源和目標的概念。Attention常常被定義為目標和源的相關程度。但是還有很多task不同時具有源和目標的概念。比如document classification, 它只有原文,沒有目標語言/文章, 再比如sentiment analysis(也可以看做是最簡單的一種document classification),它也只有原文。那麼這種情況下attention如何展開呢? 這就需要一個變種的技術,叫intra-attention(或者self-attention), 顧名思義,就是原文自己內部的注意力機制。
  • 源和目標:(1)分類,源句和模型中定義的context vector(2)有兩個輸入的如QA,源和目標都有(3)self attention,源和目標都是自己這樣可以獲得一些結構資訊,如指代資訊

在大部分的論文中,Attention是一個權重vector(通常是softmax的輸出),其維度等於context的長度。越大的權重代表對應位置的context越重要。

Attention模型就是對輸入特徵進行加權以衡量每個特徵對當前識別的重要性,它自己集中於重要的特徵,忽略不重要的特徵

2 代價

如果再仔細觀察attention的等式,我們會發現attention機制有一定的成本。我們需要為每個輸入輸出組合分別計算attention值。

3 源和目標之間attention以及有無attention的區別

seq2seq的attention

 

其中相關度計算方法有多種

文字分類的attention(其實就是上面的感知機)

下面公式第一步和第二步合併就是上面的感知機Uit*tanh(Wh+b)

先是對h過一個感知機,然後計算Uit和Uw的相似度,其中word context vector上下文Uw是隨機初始化的

The word context vector Uw is randomly initialized and jointly learned during the training process.

作者是通過引入context vector作為目標句子

(1)context vector是人工引入的,它不屬於task的一部分。它是隨機初始化的。

(2)它代替了inter-attention中目標語言/句子,能夠和task中的原文產生相互作用,計算出原文各個部分的相關程度,也就是我們關心的attention。

(3)它是jointly learned

《Hierarchical Attention Networks for Document Classification》

    # Attention mechanism
    W_omega = tf.get_variable("W_omega", initializer=tf.random_normal([hidden_size, attention_size], stddev=0.1))
    b_omega = tf.get_variable("b_omega", initializer=tf.random_normal([attention_size], stddev=0.1))
    u_omega = tf.get_variable("u_omega", initializer=tf.random_normal([attention_size], stddev=0.1))

    v = tf.tanh(tf.matmul(tf.reshape(inputs, [-1, hidden_size]), W_omega) + tf.reshape(b_omega, [1, -1]))
    vu = tf.matmul(v, tf.reshape(u_omega, [-1, 1]))
    exps = tf.reshape(tf.exp(vu), [-1, sequence_length])
    alphas = exps / tf.reshape(tf.reduce_sum(exps, 1), [-1, 1])

https://blog.csdn.net/triplemeng/article/details/78269127

4 attention研究進展

    Attention機制最早是在視覺影象領域提出來的,應該是在九幾年思想就提出來了,但是真正火起來應該算是google mind團隊的這篇論文2014《Recurrent Models of Visual Attention》,他們在RNN模型上使用了attention機制來進行影象分類。隨後,Bahdanau等人在論文《Neural Machine Translation by Jointly Learning to Align and Translate》 [1]中,使用類似attention的機制在機器翻譯任務上將翻譯和對齊同時進行,他們的工作算是是第一個提出attention機制應用到NLP領域中。接著類似的基於attention機制的RNN模型擴充套件開始應用到各種NLP任務中。最近,如何在CNN中使用attention機制也成為了大家的研究熱點。下圖表示了attention研究進展的大概趨勢。

4實際上文字分類從某種意義上也可以理解為一種特殊的Seq2Seq,所以考慮把Attention機制引入近來

5 (1)soft attention

軟定址,指的不像一般定址只從儲存內容裡面找出一條內容,而是可能從每個Key地址都會取出內容,取出內容的重要性根據Query和Key的相似性來決定,之後對Value進行加權求和,這樣就可以取出最終的Value值,也即Attention值。

(2)hard attention

Hard Attention會依概率Si來取樣輸入端的隱狀態一部分來進行計算,而不是整個encoder的隱狀態。為了實現梯度的反向傳播,需要採用蒙特卡洛取樣的方法來估計模組的梯度

(3)self attention(intra Attention)

Self Attention顧名思義,指的不是Target和Source之間的Attention機制,而是Source內部元素之間或者Target內部元素之間發生的Attention機制,也可以理解為Target=Source這種特殊情況下的注意力計算機制。其具體計算過程是一樣的,只是計算物件發生了變化而已。

解釋:Self Attention在同一個英語句子內單詞間產生的聯絡。Self Attention可以捕獲同一個句子中單詞之間的一些句法特徵(比如圖11展示的有一定距離的短語結構)或者語義特徵(比如圖12展示的its的指代物件Law)。

很明顯,引入Self Attention後會更容易捕獲句子中長距離的相互依賴的特徵,因為如果是RNN或者LSTM,需要依次序序列計算,對於遠距離的相互依賴的特徵,要經過若干時間步步驟的資訊累積才能將兩者聯絡起來,而距離越遠,有效捕獲的可能性越小。

但是Self Attention在計算過程中會直接將句子中任意兩個單詞的聯絡通過一個計算步驟直接聯絡起來,所以遠距離依賴特徵之間的距離被極大縮短,有利於有效地利用這些特徵。除此外,Self Attention對於增加計算的並行性也有直接幫助作用。這是為何Self Attention逐漸被廣泛使用的主要原因

https://baijiahao.baidu.com/s?id=1587926245504773589&wfr=spider&for=pc

hard attention在選取特徵組合時,並不針對所有的特徵生成權值,而是隻選取1個或者幾個特徵,因此是hard的。

雙向attention

矩陣,左對齊,右對齊

D = tf.matmul(input_x1, input_x2, adjoint_b=True)
A = [tf.nn.softmax(tf.expand_dims(tf.reduce_sum(D, axis=i), 2)) for i in [2, 1]]
input_x1_atten = A[0] * input_x1
input_x2_atten = A[1] * input_x2

https://blog.csdn.net/chazhongxinbitc/article/details/78825704

tensorflow attention API

https://blog.csdn.net/qsczse943062710/article/details/79539005