文章目錄
1. 基於注意力機制的編碼器解碼器
1.1 整體流程
1.1.1 基本概念
在這張架構圖中,decoder的輸入吃的都是同樣的vector
而DCG的架構是這樣的:
記爲編碼器中的時間步長,爲解碼器中的時間步長。
注意力機制模型類似於encoder-decoder模型,只不過,在編碼解碼器的連接部分有部分的差別。總的來說可以概括爲下面4個步驟:
計算 value
在輸入的數據中,每個單詞或者字均由一個向量表示,按照標準LSTM流程輸入到模型中,每一個timestamps都會有對應的隱藏狀態,與普通LSTM模型不同的是,每一個timestamps得到的隱藏狀態值均需要被保留下來。
先計算Query和key
這個時候初始化一個東西,(這個東西是亂出來的,需要model學習),它的作用相當於一個Query,去匹配第一步中所有隱藏狀態的輸出值,對於每一個隱藏狀態值都計算一個匹配度(Key),計算匹配程度的算法叫做:match。在該步驟中,0代表第0時刻,由和共同計算得出,其意義在於,計算和的匹配程度,。
這樣計算和四個的匹配程度後,得到,也就是上文提到的Key。
note:softmax層可加可不加,看情況而定。
在這一步驟中,由和共同計算得出,具體如何計算,則沒有具體的要求,自主性比較大。一般可以抽象爲如下表達式:
有兩個通常的方法:
- 構建一個小型的神經網絡
- 通過向量空間中的內積
計算Attention的結果,並應用在解碼器中
將第2步中的得到的匹配度(Key)與隱藏狀態的值(Value)進行加權作爲新的解碼器在t時刻的輸入也就是。這個時候decoder解碼器LSTM神經網絡輸出的值爲“machine”,同時可以把隱藏狀態或者記憶單元作爲。
1.2 抽象成Query、Key、Value
先上結論:
- Query對應
- Key對應
- Value對應
將Source中的構成元素想象成是由一系列的<Key,Value>數據對構成,此時給定Target中的某個元素Query,通過計算Query和各個Key的相似性或者相關性,得到每個Key對應Value的權重係數,然後對Value進行加權求和,即得到了最終的Attention數值。所以本質上Attention機制是對Source中元素的Value值進行加權求和,而Query和Key用來計算對應Value的權重係數。
1.3 具體說明
以下內容來自動手學深度學習。
1.3.1 計算背景變量
我們先描述第一個關鍵點,即計算背景變量。下圖描繪了注意力機制如何爲解碼器在時間步2計算背景變量。首先,函數a根據解碼器在時間步1的隱藏狀態和編碼器在各個時間步的隱藏狀態計算softmax運算的輸入。softmax運算輸出概率分佈並對編碼器各個時間步的隱藏狀態做加權平均,從而得到背景變量。
具體來說,令編碼器在時間步t的隱藏狀態爲,且總時間步數爲。那麼解碼器在時間步的背景變量爲所有編碼器隱藏狀態的加權平均:
其中給定時,權重的值是一個概率分佈。爲了得到概率分佈,我們可以使用softmax運算:
現在,我們需要定義如何計算上式中softmax運算的輸入。由於同時取決於解碼器的時間步和編碼器的時間步,我們不妨以解碼器在時間步的隱藏狀態與編碼器在時間步的隱藏狀態爲輸入,並通過函數計算:
這裏函數有多種選擇,如果兩個輸入向量長度相同,一個簡單的選擇是計算它們的內積。而最早提出注意力機制的論文則將輸入連結後通過含單隱藏層的多層感知機變換 [1]:
其中都是可以學習的模型參數。
1.3.2 矢量化計算
我們還可以對注意力機制採用更高效的矢量化計算。廣義上,注意力機制的輸入包括查詢項以及一一對應的鍵項和值項,其中值項是需要加權平均的一組項。在加權平均中,值項的權重來自查詢項以及與該值項對應的鍵項的計算。
在上面的例子中,查詢項爲解碼器的隱藏狀態,鍵項和值項均爲編碼器的隱藏狀態。讓我們考慮一個常見的簡單情形,即編碼器和解碼器的隱藏單元個數均爲,且函數。
假設我們希望根據解碼器單個隱藏狀態和編碼器所有隱藏狀態來計算背景向量。
我們可以將查詢項矩陣,並令鍵項矩陣和值項矩陣相同且第行均爲。此時,我們只需要通過矢量化計算
即可算出轉置後的背景向量。當查詢項矩陣的行數爲時,上式將得到行的輸出矩陣。輸出矩陣與查詢項矩陣在相同行上一一對應。
1.3.3 更新隱藏狀態
現在我們描述第二個關鍵點,即更新隱藏狀態。以門控循環單元爲例,在解碼器中我們可以對“門控循環單元(GRU)”一節中門控循環單元的設計稍作修改,從而變換上一時間步、隱藏狀態和當前時間步的含注意力機制的背景變量。解碼器在時間步的隱藏狀態爲
其中的重置門、更新門和候選隱藏狀態分別爲
其中含下標的和分別爲門控循環單元的權重參數和偏差參數。
2. self-Attention
其實,在上文提到的Attention模型中,存在一個嚴重性的問題,也就是LSTM網絡的致命缺陷,沒有辦法並行化計算,必須等上一個時刻神經元輸出後才能夠進行本時刻的計算。
因此,有的學者爲了加快計算速度,提出了使用卷積的方法代替LSTM中的值,但是這種方法存在一個弊端:提取信息的大小隻和超參數卷積核的大小有關,而且沒有辦法處理長期的信息(卷積核大小畢竟有限)。所以,就提出了這種Transformer架構,裏面用到的思想就是self Attention的方法。
2.1 Self-Attention流程
假設輸入是,那麼每一個輸入先通過與一個矩陣相乘變爲,然後將每一個都乘上三個矩陣,得到對應的,再將分別對每一個進行attention操作得到。其中,對的公式爲:
是的維度數,除以的原因是:的維度越大,則他們的乘積就越大,所以需要正則化。
再之後,將每一個通過一個softmax值得到
重複上述過程,則可以得到輸出序列。
那麼,如何並行化呢?
首先將所有的都拼起來,得到,乘上同一個矩陣得到,以此類推得到
在得到之後,按照之前的步驟,需要計算,於是,將全部拼起來,就有了下面的結果:
並行計算
2.2 Muti-head Self-Attention流程
這裏以兩個head爲例:
做多頭的好處:每個head的關注點都不一樣,可以獲得更加精確的值。
2.2.1 多頭attention中句子的位置信息
在上述的算法過程中,輸入數據的位置信息並沒有影響到輸出,爲了增加輸入數據的合理性,於是在計算時,增加了一個記錄位置信息的向量,每一個都對應這不同的
爲什麼是加到上?這裏給出瞭解釋:
假設是一個one-hot的向量,代表了位置的信息
2.3 Transformer的網絡架構如下:
Transformer最大的改進在於,將Encode-Decode 層數疊了上去,而不僅僅是1.1節中的單層網絡。在疊加的多層中,每一層都是使用了attention機制,Attention的來源就是來自於最初的輸入信息,這個和ResNet有點像,都是跨層進行連接的。
2.3.1 self-Attention層
2.4 self-Attention層
還是在第一節中提到的的應用。
假設我們想要重新表示也就是計算的權重時,需要進行以下操作:
計算key和Query
首先把目標通過一個變換成(在1.1節的單層中是和解碼器的時刻的隱藏狀態聯繫起來,求解Query的)然後把的鄰居們,或者是所有的輸入都看成是key
3. 通用的一些技巧
3.1 regularization attention
在注意力機制中,有時候注意力可能僅僅集中在某幾個特殊的狀態中,例如:
這個時候輸出的結果可能就只有妹子了,那麼怎麼辦,我們希望注意力集能夠均勻分佈,因此需要正則化,所以:
3.2 Mismatch test data
在RNN的Seq2Seq模型的訓練過程中,不管訓練輸出的結果是啥,都使用的正確輸入數據作爲下一時刻的輸入。
這樣的方式可能會造成一個問題,那就是在生成數據的時候,可能你第一個輸出就是錯誤的,這樣的結果就是錯上加錯。
解決方法:
- Beam搜索
即每個可能的輸出都進行一次運算,保留可能性最大的K個值作爲下一時刻的輸入。
參考文獻
- Attention Is All You Need - NIPS 2017: 5998-6008 - 論文鏈接
- 發表時間:2017 - 發表單位:Google - transformer原理參考文章
- transformer中文講解視頻(簡單)
- transformer中文講解視頻(進階)
- 哈佛大學的ptorch版transformer代碼實現