作者:Bgg

近一兩年,注意力模型(Attention Model)是深度學習領域最受矚目的新星,用來處理與序列相關的資料,特別是2017年Google提出後,模型成效、複雜度又取得了更大的進展。以金融業為例,客戶的行為代表一連串的序列,但要從序列化的客戶歷程資料去萃取資訊是非常困難的,如果能夠將self-attention的概念應用在客戶歷程並拆解分析,就能探索客戶潛在行為背後無限的商機。然而,筆者從Attention model讀到self attention時,遇到不少障礙,其中很大部分是後者在論文提出的概念,鮮少有文章解釋如何和前者做關聯,筆者希望藉由這系列文,解釋在機器翻譯的領域中,是如何從Seq2seq演進至Attention model再至self attention,使讀者在理解Attention機制不再這麼困難。

為此,系列文分為兩篇,第一篇著重在解釋Seq2seq、Attention模型,第二篇重點擺在self attention,希望大家看完後能有所收穫。

從Seq2seq到Attention模型到Self Attention(一)

前言

你可能很常聽到Seq2seq這詞,卻不明白是什麼意思。Seq2seq全名是Sequence-to-sequence,也就是從序列到序列的過程,是近年當紅的模型之一。Seq2seq被廣泛應用在機器翻譯、聊天機器人甚至是影象生成文字等情境。如下圖:

從Seq2seq到Attention模型到Self Attention(一)

其中,Seq2seq常見情境為機器翻譯,因此接下來的內容都會以情境進行說明。

圖(3)是個典型的Seq2seq模型,包含了編碼器(Encoder)和解碼器(Decoder)。只要輸入句子至Encoder,即可從Decoder獲得目標句。

舉例來說,如果我們將“Are you very big”作為輸入句(source sentence),即可得到目標句(target sentence)“你很大?”。機器翻譯就是這麼簡單,然而,如果想了解它如何組成,會發現其中充斥著各種難以咀嚼的RNN/LSTM等概念。

接下來,讓我們快速回味一下RNN/LSTM,方便後續模型理解。

從Seq2seq到Attention模型到Self Attention(一)

RNN/LSTM

RNN是DNN模型的變種,不同之處在於它可以儲存過去的行為記憶,進行更準確的預測,然而,就像人腦一樣,一旦所需記憶量太大,就會比較健忘。我們可以把隱藏狀態(hidden state)h_{t}認為是記憶單元,h_{t}可透過前一步的hidden state和當前時刻的輸入(input)得到,因為是記憶單元,h_{t}可以捕捉到之前所有時刻產生的資訊,而輸出(output)o_{t}僅依賴於t時刻的記憶,也就是h_{t}。

RNN在反向訓練誤差時,都會乘上引數,引數乘上誤差的結果,大則出現梯度爆炸;小則梯度消失,導致模型成效不佳,如圖4。

從Seq2seq到Attention模型到Self Attention(一)

為了解決健忘、訓練誤差的問題,LSTM有了像是遺忘/輸入/輸出門(forget/input/output gate),隱藏狀態(hidden state),記憶單元(cell memory)等概念,帶來了更好的結果。在2014年,論文Learning Phrase Representations除了提出Seq2seq的概念,更提出了LSTM的簡化版GRU,此後,LSTM和GRU便取代RNN成為深度學習當中的主流。

下圖是LSTM的各種應用,在此不深入描述。

從Seq2seq到Attention模型到Self Attention(一)

Seq2seq

從Seq2seq到Attention模型到Self Attention(一)

回到正題,所以Seq2seq是怎麼組成的?我們可以看到Seq2seq包含兩部分:Encoder和Decoder。一旦將句子輸入至Encoder,即可從Decoder獲得目標句。本篇文章著墨在Decoder生成過程,Encoder就是個單純的RNN/ LSTM,讀者若有興趣可再自行研究,此外RNN/LSTM可以互相代替,以下僅以RNN作為解釋。

現在我們具備RNN/LSTM的知識,可以發現Seq2seq中,Decoder的公式和RNN根本就是同一個模子出來的,差別在於Decoder多了一個C — 圖(6),這個C是指context vector/thought vector。context vector可以想成是一個含有所有輸入句資訊的向量,也就是Encoder當中,最後一個hidden state。簡單來說,Encoder將輸入句壓縮成固定長度的context vector,context vector即可完整表達輸入句,再透過Decoder將context vector內的資訊產生輸出句,如圖7。

從Seq2seq到Attention模型到Self Attention(一)

但是,在Seq2seq模型中,Encoder將輸入句壓縮成固定長度的context vector真的好嗎?如果句子今天很長,固定長度的context vector效果就會不好。怎麼辦呢?

從Seq2seq到Attention模型到Self Attention(一)

在2015年,有個救星誕生了,叫作注意力模型(attention model)。

Attention model

為什麼要用attention model?

The attention model用來幫助解決機器翻譯在句子過長時效果不佳的問題。

這種新的構架替輸入句的每個文字都創造一個context vector,而非僅僅替輸入句創造一個從最終的hidden state得來的context vector,舉例來說,如果一個輸入句有N個文字,就會產生N個context vector,好處是,每個context vector能夠被更有效的譯碼。

從Seq2seq到Attention模型到Self Attention(一)

在Attention model中,Encoder和Seq2seq概念一樣,一樣是從輸入句產生的hidden state,再計算目標句。換言之,就是將輸入句作為input而目標句作為output,所以差別就在於context vector c_{i}是怎麼計算?

從Seq2seq到Attention模型到Self Attention(一)

從Seq2seq到Attention模型到Self Attention(一)

Context vector c_{i}是透過attention scoreα乘上input的序列加權求和。Attention/Alignment score是attention model中提出一個很重要的概念,可以用來衡量輸入句中的每個文字對目標句中的每個文字所帶來重要性的程度。由公式可知,attention score藉由score e_{ij}所計算得到,所以先來看看score e_{ij}是什麼。

從Seq2seq到Attention模型到Self Attention(一)

從Seq2seq到Attention模型到Self Attention(一)

在計算score中,a代表Alignment model會根據輸入字位置j和輸出字位置i這兩者的關聯程度,計算出一個score e_{ij}。換言之,e_{i,j}是衡量RNN decoder中的hidden state s_{i-1}和輸入句中的第j個文字hidden state h_{j}的關係所計算出的權重 — 如方程式3,那權重怎麼算呢?

從Seq2seq到Attention模型到Self Attention(一)

Neural Machine Translation發表之後,接續的論文Effective approaches of the NMT、Show,Attend and Tell提出了global/local attention和soft/hard attention的概念,而score e_{ij}的計算方式類似global和soft attention。細節在此不多說,圖11可以看到3種計算權重的方式,我們把剛才的公式做些改變,將score e_{ij}改寫成score(h_{t},\bar {h_{s}}),h_{t}代表s_{i-1}而\bar {h_{s}}代表h_{j},為了計算方便,我們採用內積(dot)計算權重。

有了score e_{ij},即可透過softmax算出attention score,context vector也可得到,在attention model中,context vector又稱為attention vector。我們可以將attention score列為矩陣,透過此矩陣可看到輸入端文字和輸出端文字間的對應關係,也就是論文當中提出align的概念。

從Seq2seq到Attention模型到Self Attention(一)

我們知道如何計算context vector後,回頭看encoder。

attention model中的encoder用的是改良版RNN:雙向RNN(Bi-directional RNN),以往單向RNN的問題在於t時刻時,只能透過之前的資訊進行預測,但事實上,模型有時候可能也需要利用未來時刻的資訊進行預測,其運作模式為,一個hidden layer用來由左到右,另一個由右到左,透過雙向RNN,我們可以對詞語進行更好的預測。

舉例來說,”我喜歡蘋果,因為它很好吃”?和”我喜歡蘋果,因為他比安卓穩定”這兩個句子當中,如果只看”我喜歡蘋果”,你可能不知道蘋果指的是水果還是手機,但如果可以根據後面那句得到資訊,答案就很顯而易見,這就是雙向RNN運作的方式。

從Seq2seq到Attention模型到Self Attention(一)

Attention model雖然解決了輸入句僅有一個context vector的缺點,但依舊存在不少問題。1。context vector計算的是輸入句、目標句間的關聯,卻忽略了輸入句中文字間的關聯,和目標句中文字間的關聯性,2。不管是Seq2seq或是Attention model,其中使用的都是RNN,RNN的缺點就是無法平行化處理,導致模型訓練的時間很長,有些論文嘗試用CNN去解決這樣的問題,像是Facebook提出的Convolutional Seq2seq learning,但CNN實際上是透過大量的layer去解決區域性資訊的問題,在2017年,Google提出了一種叫做”The transformer”的模型,透過self attention、multi-head的概念去解決上述缺點,完全捨棄了RNN、CNN的構架。

從Seq2seq到Attention模型到Self Attention(一)

讓我們複習一下Seq2seq、Attention model,差別在於計算context vector的方式。

從Seq2seq到Attention模型到Self Attention(一)

總結

透過上述內容,我們快速的瞭解Seq2seq、Attention model運作、計算方式,我強烈建議有興趣的讀者可以參考圖1中的論文,會有很多收穫。

系列二將著重在Google於論文“Attention is all you need“所提出的self attention、multi-head等概念。

參考

[1] Learning Phrase Representations using RNN Encoder–Decoder for Statistical Machine Translationr。 arXiv:1406。1078v3 (2014)。

[2] Sequence to Sequence Learning with Neural Networks。 arXiv:1409。3215v3 (2014)。

[3] Neural machine translation by joint learning to align and translate。 arXiv:1409。0473v7 (2016)。

[4] Effective Approaches to Attention-based Neural Machine Translation。 arXiv:1508。0402v5 (2015)。

[5] Convolutional Sequence to Sequence learning。 arXiv:1705。03122v3(2017)。

[6] Attention Is All You Need。 arXiv:1706。03762v5 (2017)。

[7] ATRank: An Attention-Based User Behavior Modeling Framework for Recommendation。 arXiv:1711。06632v2 (2017)。

[8] Key-Value Memory Networks for Directly Reading Documents。 arXiv:1606。03126v2 (2016)。

[9] Show, Attend and Tell: Neural Image Caption Generation with Visual Attention。 arXiv:1502。03044v3 (2016)。

[10] Deep Residual Learning for Image Recognition。 arXiv:1512。03385v1 (2015)。

[11] Layer Normalization。 arXiv:1607。06450v1 (2016)。

https://

medium。com/@bgg/seq2seq

-pay-attention-to-self-attention-part-1-d332e85e9aad