一、基本概念
1、為什么要因為注意力機制
在Attention誕生之前,已經有CNN和RNN及其變體模型了,那為什么還要引入attention機制?主要有兩個方面的原因,如下:
(1)計算能力的限制:當要記住很多“信息“,模型就要變得更復雜,然而目前計算能力依然是限制神經網絡發展的瓶頸。
(2)優化算法的限制:LSTM只能在一定程度上緩解RNN中的長距離依賴問題,且信息“記憶”能力並不高。
2、什么是注意力機制
在介紹什么是注意力機制之前,先讓大家看一張圖片。當大家看到下面圖片,會首先看到什么內容?當過載信息映入眼簾時,我們的大腦會把注意力放在主要的信息上,這就是大腦的注意力機制。
同樣,當我們讀一句話時,大腦也會首先記住重要的詞匯,這樣就可以把注意力機制應用到自然語言處理任務中,於是人們就通過借助人腦處理信息過載的方式,提出了Attention機制
3、注意力機制模型
從本質上理解,Attention是從大量信息中有篩選出少量重要信息,並聚焦到這些重要信息上,忽略大多不重要的信息。權重越大越聚焦於其對應的Value值上,即權重代表了信息的重要性,而Value是其對應的信息。
至於Attention機制的具體計算過程,如果對目前大多數方法進行抽象的話,可以將其歸納為兩個過程:第一個過程是根據Query和Key計算權重系數,第二個過程根據權重系數對Value進行加權求和。而第一個過程又可以細分為兩個階段:第一個階段根據Query和Key計算兩者的相似性或者相關性;第二個階段對第一階段的原始分值進行歸一化處理;這樣,可以將Attention的計算過程抽象為如圖展示的三個階段。
在第一個階段,可以引入不同的函數和計算機制,根據Query和某個 Keyi ,計算兩者的相似性或者相關性,最常見的方法包括:求兩者的向量點積、求兩者的向量Cosine相似性或者通過再引入額外的神經網絡來求值,即如下方式:
第一階段產生的分值根據具體產生的方法不同其數值取值范圍也不一樣,第二階段引入類似SoftMax的計算方式對第一階段的得分進行數值轉換,一方面可以進行歸一化,將原始計算分值整理成所有元素權重之和為1的概率分布;另一方面也可以通過SoftMax的內在機制更加突出重要元素的權重。即一般采用如下公式計算:
第二階段的計算結果 ai 即為 Valuei 對應的權重系數,然后進行加權求和即可得到Attention數值:
通過如上三個階段的計算,即可求出針對Query的Attention數值,目前絕大多數具體的注意力機制計算方法都符合上述的三階段抽象計算過程。
4、Self-attention自注意力機制
自注意力機制是注意力機制的變體,其減少了對外部信息的依賴,更擅長捕捉數據或特征的內部相關性。
自注意力機制在文本中的應用,主要是通過計算單詞間的互相影響,來解決長距離依賴問題。
自注意力機制的計算過程:
(1)將輸入單詞轉化成嵌入向量;
(2)根據嵌入向量得到q,k,v三個向量;
(3)為每個向量計算一個score:score =q . k ;
(4)為了梯度的穩定,Transformer使用了score歸一化,即除以 ;
(5)對score施以softmax激活函數;
(6)softmax點乘Value值v,得到加權的每個輸入向量的評分v;
(7)相加之后得到最終的輸出結果z :z= v。
接下來我們詳細看一下self-attention,其思想和attention類似,但是self-attention是Transformer用來將其他相關單詞的“理解”轉換成我們正在處理的單詞的一種思路,我們看個例子: The animal didn't cross the street because it was too tired 這里的it到底代表的是animal還是street呢,對於我們來說能很簡單的判斷出來,但是對於機器來說,是很難判斷的,self-attention就能夠讓機器把it和animal聯系起來,接下來我們看下詳細的處理過程。
1、首先,self-attention會計算出三個新的向量,在論文中,向量的維度是512維,我們把這三個向量分別稱為Query、Key、Value,這三個向量是用embedding向量與一個矩陣相乘得到的結果,這個矩陣是隨機初始化的,維度為(64,512)注意第二個維度需要和embedding的維度一樣,其值在BP的過程中會一直進行更新,得到的這三個向量的維度是64低於embedding維度的。
那么Query、Key、Value這三個向量又是什么呢?這三個向量對於attention來說很重要,當你理解了下文后,你將會明白這三個向量扮演者什么的角色。
2、計算self-attention的分數值,該分數值決定了當我們在某個位置encode一個詞時,對輸入句子的其他部分的關注程度。這個分數值的計算方法是Query與Key做點乘,以下圖為例,首先我們需要針對Thinking這個詞,計算出其他詞對於該詞的一個分數值,首先是針對於自己本身即q1·k1,然后是針對於第二個詞即q1·k2
3、接下來,把點成的結果除以一個常數,這里我們除以8,這個值一般是采用上文提到的矩陣的第一個維度的開方即64的開方8,當然也可以選擇其他的值,然后把得到的結果做一個softmax的計算。得到的結果即是每個詞對於當前位置的詞的相關性大小,當然,當前位置的詞相關性肯定會會很大
4、下一步就是把Value和softmax得到的值進行相乘,並相加,得到的結果即是self-attetion在當前節點的值
在實際的應用場景,為了提高計算速度,我們采用的是矩陣的方式,直接計算出Query, Key, Value的矩陣,然后把embedding的值與三個矩陣直接相乘,把得到的新矩陣Q與K相乘,乘以一個常數,做softmax操作,最后乘上V矩陣
這種通過 query 和 key 的相似性程度來確定 value 的權重分布的方法被稱為scaled dot-product attention:
以上就是self-attention的計算過程,下邊是兩個句子中it與上下文單詞的關系熱點圖,很容易看出來第一個圖片中的it與animal關系很強,第二個圖it與street關系很強。這個結果說明注意力機制是可以很好地學習到上下文的語言信息。
5.注意力機制的優缺點
attention的優點
1.參數少:相比於 CNN、RNN ,其復雜度更小,參數也更少。所以對算力的要求也就更小。
2.速度快:Attention 解決了 RNN及其變體模型 不能並行計算的問題。Attention機制每一步計算不依賴於上一步的計算結果,因此可以和CNN一樣並行處理。
3.效果好:在Attention 機制引入之前,有一個問題大家一直很苦惱:長距離的信息會被弱化,就好像記憶能力弱的人,記不住過去的事情是一樣的。