Attention Mechanism(注意力機制)


Posted by Mars.Su on 2020-11-30

Backgroud

還記得前一天再介紹Seqence to Sequence的論文嗎?當時我在最後面留了一點伏筆,先來簡單複習一下吧。Seqence to Sequence主要有兩個model,分別是EncoderDecoderEncoder簡單來說就是將輸入的句子壓縮成一個固定的context vector,而Decoder再從中加以生成且預測下一個word。但是這樣的做法會促使在input的句子當中每一個token,都被視為相同。也就是說對於model來說,每一個token的權重意義相同,但其實這在一般句子理解當中很不合裡,一句話當中本來就存在著有些字含有著重要資訊,有些字則相對沒有那麼重要,應該把這樣的狀態區隔開來。

除此之外,雖然Seqence to Sequence已經採用了像是LSTM或GRU等RNN模型,但是對於長序列的資料仍可能會發生Gradient Vanish等狀況,使訓練時無法訓練到更先前的資訊,所以為了解決這些總總問題,也正就是Attention Mechanism(注意力機制)所產生的目的啦。

1. 無法表達語句中哪些是重要的
2. 語句太長仍有丟失資訊的狀況發生

接下來同時也會以這篇論文一起探討:

Concept

在之前的Seqence to Sequence的架構,如果大家還記得的話,他應該會長得像下面這樣

Encoder直接壓縮成一個context vector,再由Decoder生成回來,對於Decoder來說他採用的context vector都是一樣的,以Machine Translation來說,就是只對Decoder依據先前輸出的word還有context vector來判斷當前要預測的word,簡單的公式如下:

input sequence vector: x=(x1,....xT)
f,q: nonlinear function
ht: 依據當前的xt和先前的hidden state(ht-1)經由nonlinear-function所求出來的『當前』hidden-state
c: 就是將每一個hidden-state透過nonlinear-function求出來的context vector

在Decoder中再透過`條件機率`來求出在先前的hidden-state(st)跟Context vector(c)來得出目前要預測的word(yt)

接著對於Attention Mechanism的作法則是 Decoder 的每一個步驟,都直接與 Encoder 相連,透過權重加權 Encoder 輸出的序列當作 Decoder 的輸入,藉此做到『當前的output受到當前的input所影響』,此時如果套用到Machine Translation,則會變成以下的示意圖:

每一個Encoder中的word獨自生成context vector,來做為預設當前word的依據,公式如下:

ci: 為第i個時間點所算出來的context vector
si: 為第i個時間點所算出來的hidden state

其中si指的是在Decoder下當前的hidden-state,公式如下:

si是經由前一個hidden-state, y 以及第i個時間點的context vector經由nonlinear function求出。

每一個context vector求法如下:

會利用aij(注意力權重, attention score)之機率分佈來乘上Encoder個別的hidden-state在做到加權求和,進而找出對應要注意的input word。

attention score要如何求出呢,我們繼續來看一下式子:

簡單來說會利用Decoder當前之前一個hidden-state(si),來與Encoder每一個word對應的hidden state(j)來做對比,透過α function 來求出當前yi與其他input word之間的可能性(alignment),接著透過softmax來求出當下的注意力機率分佈

最後就會形成一個這樣的注意力架構圖:

從架構圖來看,簡單來說就是將目前要預測yi所對應的hidden-state(hi)來與其他hj利用α function 來求出一個對應的alignment,再利用softmax取得每一個word對應的attention score,最後來盛上每個hidden state求得對應的context vector,最後再來做出條件機率預測。

Example

來舉一個中翻英生活化的例子,有一句話是『拜登是美國新總統』,在Encoder會先求出個別的hidden state(hj),接著轉手到Decoder依序生成的時候會先利用當前的hidden state(Hi)來求出當前word所對應到input sequence的attention score,如下圖:

求出attention-score之後,接著再拿attention-score來做加權總和求得出當前的context vector,這邊就以Biden的context vector,圖為變成這樣。

最後在拿Context vector與 前一個Hidden state(Hi-1)來求出當前的Hidden-state(Hi),最後條件機率來預測目前的yi,圖如下:

所以透過以上這樣的流程,我們就可以取得每個input sequence中的word對應到output sequence的word之間所對應的權重,依據學者可以將這樣attention weight畫成如下的圖:

Conclusion

Attention Mechanism除了用在NLP之外,其實在影像處理等任務中也有多可以應用該概念的場景。雖然本篇仍著重在NLP,但其實我相信只要掌握到概念之後,後續即便在其他領域也可以舉一反三。

這邊來快速結論一下,過往Sequence to Sequence只透過單一的context vector來讓Decoder做生成,就會造成生成上的誤差。所以後來Attention Mechanism在Encoder的時候把每一個hidden-state獨立出來,並且在Decoder計算hidden-state的時候同時與encoder的hidden-state來做關聯且利用softmax來求出對應的attention score,最後再乘上encoder的hidden-state取的當前的context vector,最後在與Decoder前一個hidden-state一同求出當前的hidden-state,以作為最後Decoder預測當前y的依據。所以看似複雜的流程,但其實就是參照Encoder的hidden-state來求出attention-score進而得到context vector以做到最後的預測。

最後Attention Mechanism後來也有延伸了許多,像是Global Attention,Soft Attention甚至後來火紅的self-attention,接下來會在下一篇再進一步介紹,以及開始進入到因self-attention所產生的Transformer架構。

Reference


#AI #NLP #Paper #RNN #LSTM #Seq2Seq #Attention







Related Posts

Day 100

Day 100

讀書筆記-版本控制使用Git: 合併

讀書筆記-版本控制使用Git: 合併

程式基礎 —— Javascript 動手做 Part2

程式基礎 —— Javascript 動手做 Part2


Comments