Attention篇(一)


主要是閱讀以下博文的總結:

https://zhuanlan.zhihu.com/p/31547842

https://www.zhihu.com/question/68482809/answer/264632289

https://blog.csdn.net/thriving_fcl/article/details/73381217

https://kexue.fm/archives/4765

http://ir.dlut.edu.cn/news/detail/486

這篇主要講的是soft-Attention

在不同的論文中Attention分為soft Attention 與Hard Attention、Global Attention和Local Attention以及Self Attention以及組合Attention中的層次化Attention等等

soft Attention的本質:

從概念上理解,把Attention仍然理解為從大量信息中有選擇地篩選出少量重要信息並聚焦到這些重要信息上,忽略大多不重要的信息,這種思路仍然成立。聚焦的過程體現在權重系數的計算上,權重越大越聚焦於其對應的Value值上,即權重代表了信息的重要性,而Value是其對應的信息。

對其理解可以參考如圖:

 

我們可以這樣來看待Attention機制(參考上圖):將Source中的構成元素想象成是由一系列的<Key,Value>數據對構成,此時給定Target中的某個元素Query,通過計算Query和各個Key的相似性或者相關性,得到每個Key對應Value的權重系數,然后對Value進行加權求和,即得到了最終的Attention數值。所以本質上Attention機制是對Source中元素的Value值進行加權求和,而Query和Key用來計算對應Value的權重系數。即可以將其本質思想改寫為如下公式:

 

也可以將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的計算過程抽象為如圖展示的三個階段:

 

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

 

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

 

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

 

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

Q,K,V理解以及運算:

上面提到的query與key之間計算相似度有許多方法,如dot、general、concat和MLP等方式,具體公式如下所示。而attention模型抽象為query、key和value之間的相似度計算,總共有3個階段。第一階段:query與keyi使用特定的相似度函數計算相似度,得到si;第二階段:對si進行softmax()歸一化得到ai;第三階段,將ai與valuei對應相乘再求和,得到最終的attention value。其實對比傳統的attention公式,我們可以看出,這兩套公式還是很像的

分類模型中具體代碼

#用的較多的乘性soft-attention
def attention(inputs, attention_size, time_major=False, return_alphas=False):
    if isinstance(inputs, tuple):
        # In case of Bi-RNN, concatenate the forward and the backward RNN outputs.
        inputs = tf.concat(inputs, 2)
    if time_major:
        # (T,B,D) => (B,T,D)
        inputs = tf.array_ops.transpose(inputs, [1, 0, 2])
    hidden_size = inputs.shape[2].value  # D value - hidden size of the RNN layer
    # Trainable parameters
    w_omega = tf.Variable(tf.random_normal([hidden_size, attention_size], stddev=0.1))
    b_omega = tf.Variable(tf.random_normal([attention_size], stddev=0.1))
    u_omega = tf.Variable(tf.random_normal([attention_size], stddev=0.1))
    with tf.name_scope('v'):
        # Applying fully connected layer with non-linear activation to each of the B*T timestamps;
        #  the shape of `v` is (B,T,D)*(D,A)=(B,T,A), where A=attention_size
        v = tf.tanh(tf.tensordot(inputs, w_omega, axes=1) + b_omega)
    # For each of the timestamps its vector of size A from `v` is reduced with `u` vector
    #這里最后一維為1會自動進行維度刪除
    vu = tf.tensordot(v, u_omega, axes=1, name='vu')  # (B,T) shape
    alphas = tf.nn.softmax(vu, name='alphas')         # (B,T) shape
    # Output of (Bi-)RNN is reduced with attention vector; the result has (B,D) shape
    output = tf.reduce_sum(inputs * tf.expand_dims(alphas, -1), 1)
    if not return_alphas:
        return output
    else:
        return output, alphas

從以上代碼來看:

至於Attention機制的具體計算過程,如果對目前大多數方法進行抽象的話,可以將其歸納為兩個過程:第一個過程是根據Query和Key計算權重系數,第二個過程根據權重系數對Value進行加權求和。而第一個過程又可以細分為兩個階段:第一個階段根據Query和Key計算兩者的相似性或者相關性,第二個階段對第一階段的原始分值進行歸一化處理。

一些思考:

在文本分類中k、v都是網絡層的輸出,q是隨機生成的向量。第一個過程的第一個階段,會先后經過一次非線性變換和線性變換,其中的權重系數W都是隨機的(為什么要這樣做,考慮該如何獲得各特征的重要程度,可以通過神經網絡去學習,經過訓練后的W會傾向於重要的特征);

attention其實就是學出一個權重分布,再拿這個權重分布施加在原來的特征之上,給重要的特征分布較大的權重,為不重要的特征分布較小的特征,以此來加大重要特征的影響。一方面在網絡輸出層后再加個attention是因為對於文本分類而言對於最后的類別而言不同的特征可能所起的作用不同。但是另一方面,在NLP中常用的LSTM其輸出門就有一定的特征選擇作用了,輸出的為對類別決定性更大的特征,所以在LSTM后再加Attention似乎意義不大。

Attention設計之初用於seq2seq,較為典型的Attention為乘性Attention和加性Attention

對於Attention總結較好的文章:https://www.zhihu.com/question/68482809

 


免責聲明!

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



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