【機器學習】從RNN到Attention 中篇 從Seq2Seq到Attention in Seq2Seq

變長輸出模型——Seq2Seq

在上一篇【機器學習】從RNN到Attention上篇 循環神經網絡RNN,門控循環神經網絡LSTM中,我們的建模基礎是通過一串歷史的時間序列x1,x2,.....,xtx_1,x_2,.....,x_t,預測下一時刻的時間序列xt+1x_{t+1},即輸出爲1一個數據。如下圖所示:
N VS 1
這類模型通常可以用來解決時間序列預測,比如股票預測,或者可以用於時間序列的分類問題,比如情感分析。
事實上RNN最經典的結構是輸入一串連續的時間序列數據x1,x2,.....,xtx_1,x_2,.....,x_t,輸入出對應時刻的labely1,y2,.....,yty_1,y_2,.....,y_t,即N VS N 模型結構,如下圖所示。在該模型結構中,輸入序列和輸出序列必須是等長的。N VS N
這個模型的一個經典應用是Char RNN
但是對於一類更廣泛的需求:輸入序列長度爲N,輸出序列長度爲M。常見的比如機器翻譯、語音識別等,都屬於上述輸入輸出不等長的類型,對於這種N VS M類型,上述模型都無能爲力。而Seq2Seq模型則是爲了解決這類問題而設計的
Seq2Seq模型又叫Encoder-Decoder模型,事實上我認爲Encoder-Decoder更能夠表達這個模型的設計思想,即將輸入的N的序列編碼(Encoder)成一個場景變量(context) C,然後使用一個解碼器網絡(Decoder)進行解碼,其中C作爲初始狀態h0輸入到Decoder中。如下圖所示
Encoder-Decoder
這裏存在三個問題:

  • 1.C是怎麼計算得到的?

C的計算方法有很多種,比如將encoder中的最後一個隱藏層變量hth_t直接拿出來作爲C,即C=htC=h_t,或者將hth_t做一個矩陣變換C=WhcthtC=W_{hct}h_t,也可以將所有的encoder中所有的隱藏層做一個變換C=Whc[h1,h2,....,ht]C=W_{hc}[h_1,h_2,....,h_t],總之C是由網絡左側的encoder網絡的隱藏層h1,h2,.....,hth_1,h_2,.....,h_t計算得到的,即
c=q(h1,,ht)\boldsymbol{c} = q(\boldsymbol{h}_1, \ldots, \boldsymbol{h}_t)

  • 2.Decoder中的輸入是什麼,翻譯什麼時候終止?

以機器翻譯爲例,假設輸入是“Hello,world”,我們先將“Hello,world”通過Encoder生成一個場景變量C,假設解碼器的輸入爲x1,x2,.....,xtx^{&#x27;}_1,x^{&#x27;}_2,.....,x^{&#x27;}_{t^{&#x27;}},假設x1,h1,x^{&#x27;}_1,h^{&#x27;}_1,已知,那麼我們可以計算出y1,然後令x2=y1x^{&#x27;}_2=y_1,即將前一時刻的輸出作爲下一時刻的輸入。所以x1x^{&#x27;}_1又是怎麼得來的呢?通常我們用一個特殊的字符"<BOS>"(begin of sentense)來表示一個句子的開頭x1x^{&#x27;}_1。終止條件也類似,Seq2Seq理論上是可以一直預測下去,通常規定當預測結果爲特殊的字符"<EOS>"(end of sentense)時預測終止。如下圖所示
圖片來自李沐老師《動手深度學習》

  • 3.Decoder中的隱藏層變量h1,h2,.....,,hth^{&#x27;}_1,h^{&#x27;}_2,.....,,h^{&#x27;}_{t^{&#x27;}}怎麼計算?
    我們來看公式
    ht=g(yt1,c,ht1)\boldsymbol{h^\prime}_{t^\prime} = g(y_{t^\prime-1}, \boldsymbol{c}, \boldsymbol{h^\prime}_{t^\prime-1})
    hth^{&#x27;}_{t^{&#x27;}}和前一時刻的隱藏變量,場景變量C以及前一時刻的輸出yt1y_{t^\prime-1}也就是當前時刻輸入xtx^{&#x27;}_{t^{&#x27;}}有關,而這裏的g就是一個RNN網絡,選擇LSTM或者GRU均可。有了解碼器的隱藏狀態hth^{&#x27;}_{t^{&#x27;}}後,我們就可以使用softmax運算得到yty_{t^\prime}
    這裏一個我還沒弄明白的問題是C是如何放到g中去的,因爲我的理解一個RNN網絡有一個當前輸入yt1y_{t^\prime-1}和一個隱藏狀態ht1h^{&#x27;}_{t^{&#x27;}-1}就足夠了,個人偏向於C是和yt1y_{t^\prime-1}做變換之後再放入RNN網絡(事實上attension就是這麼幹的),但是沒找到相關的說明,等有空看看tensorflow的源碼吧。。
    還有一個問題就是初始的隱含變量h1h^{&#x27;}_1是怎麼得到的,在機器翻譯中有一種做法是對encoder中的第一個輸入做變換後得到的,即h1=f(Wx1)h^{&#x27;}_1=f(Wx_1),這裏的變量W也可以通過反向傳播學習得到,因爲輸入是“Hello,world”,那麼Hello這個單詞和我們希望翻譯得到的第一個單詞應該是相關性最強的。

我們對於Seq2Seq模型做一個總結就是:將歷史的輸入x1,x2,.....,xtx_1,x_2,.....,x_t通過Encoder編碼成一個場景變量C,C的作用在於存儲歷史的信息,C作爲Decoder輸入的一部分用來預測,Decoder的輸入是前一時刻的Decoder的輸出,因此理論上可以一直輸出下去,我們可以通過規則限定它的長度,從而可以解決輸入序列和輸出序列不等長的N VS M問題

但是顯然將輸入x1,x2,.....,xtx_1,x_2,.....,x_t編碼成一個固定的場景變量C會有很大的信息損失,我們可不可以讓C成爲一個變量,在decoder中隨着輸入的變化而變化呢?答案是:yes!那就是attension!

Seq2Seq with variable C——Attention模型

Attention模型的中文翻譯是注意力模型,何爲注意力呢?
同樣以“Hello, world”的翻譯爲例,我們在翻譯爲“你好,世界”的過程中,肯定是希望翻譯“你好”的過程中更關注"Hello",而在翻譯“世界“的過程中更關注“world”,而在我們上述的Seq2Seq模型中卻做不到這一點,因爲我們是先通過encoder將“Hello, world”這個短語編碼成C,然後送到decoder中,在decoder的輸出過程中C是個常量。我們如果將C看做一個關於“Hello, world”的權重向量,那麼我們希望decoder中輸出爲”你好“的C中”hello“的權重值大,而輸出爲”世界“的輸出中”world“的權重值更大。
我們用另一個例子”我愛中國“的翻譯來看更好理解,例子來源於完全圖解RNN、RNN變體、Seq2Seq、Attention機制
在這裏插入圖片描述
輸入的序列是“我愛中國”,因此,Encoder中的h1、h2、h3、h4就可以分別看做是“我”、“愛”、“中”、“國”所代表的信息。在翻譯成英語時,第一個上下文c1應該和“我”這個字最相關,因此對應的 a11就比較大,而相應的a12、 a13、 a14 就比較小。c2應該和“愛”最相關,因此對應的 a22就比較大。最後的c3和h3、h4最相關,因此 a33、a34的值就比較大。
因此令編碼器在時間步tt的隱藏狀態爲ht\boldsymbol{h}_t,且總時間步數爲TT。那麼解碼器在時間步tt&#x27;的背景變量爲所有編碼器隱藏狀態的加權平均:

ct=t=1Tαttht,\boldsymbol{c}_{t&#x27;} = \sum_{t=1}^T \alpha_{t&#x27; t} \boldsymbol{h}_t,
那麼現在我們已經理解的Attention中注意力矩陣a的作用,問題就只剩下a是如何得來的了。
顯然a的作用是權重,是一個關於時間t的概率分佈,因此a可以通過一個softmax求得
αtt=exp(ett)k=1Texp(etk),t=1,,T.\alpha_{t&#x27; t} = \frac{\exp(e_{t&#x27; t})}{ \sum_{k=1}^T \exp(e_{t&#x27; k}) },\quad t=1,\ldots,T.
那麼現在的問題就是ette_{t&#x27; t}如何得到,顯然既然它的作用就是編碼器t時刻的輸入與解碼器t’時刻的權重值,我們可以通過t時刻的隱藏狀態hth_t和t’-1時刻的隱藏狀態ht1{h&#x27;}_{t&#x27; - 1}計算得到。即:
ett=a(ht1,ht)e_{t&#x27; t} = a(\boldsymbol{h&#x27;}_{t&#x27; - 1}, \boldsymbol{h}_t)
這裏的a可以有多種選擇一個簡單的選擇是計算它們的內積a(h,h)=hha(\boldsymbol{h&#x27;}, \boldsymbol{h})=\boldsymbol{h&#x27;}^\top \boldsymbol{h},注意此時通過內積運算得到的ette_{t&#x27; t}是一個標量,符合我們對於權重的期待(不能還是個矩陣)。
總結一下Attention模型:

  • 將Seq2Seq中的場景C變成了一個隨時間變化的權重變量,C由注意力矩陣a計算求得,a的物理含義是對encoder中輸入變量的權重(即注意力)
  • 矩陣a中的元素at’t反應了encoder中t時刻的輸入對於decoder中t’時刻的權重,因此是由encoder中t時刻的隱藏層變量hth_t和decoder中t’-1時刻的隱藏層變量ht1{h&#x27;}_{t&#x27; - 1}計算得到。
  • Attention模型可以將encoder中的輸入通過注意力矩陣a編碼到decoder中,大大增強了Seq2Seq的模型表達能力
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章