變長輸出模型——Seq2Seq
在上一篇【機器學習】從RNN到Attention上篇 循環神經網絡RNN,門控循環神經網絡LSTM中,我們的建模基礎是通過一串歷史的時間序列,預測下一時刻的時間序列,即輸出爲1一個數據。如下圖所示:
這類模型通常可以用來解決時間序列預測,比如股票預測,或者可以用於時間序列的分類問題,比如情感分析。
事實上RNN最經典的結構是輸入一串連續的時間序列數據,輸入出對應時刻的label,即N VS N 模型結構,如下圖所示。在該模型結構中,輸入序列和輸出序列必須是等長的。
這個模型的一個經典應用是Char RNN。
但是對於一類更廣泛的需求:輸入序列長度爲N,輸出序列長度爲M。常見的比如機器翻譯、語音識別等,都屬於上述輸入輸出不等長的類型,對於這種N VS M類型,上述模型都無能爲力。而Seq2Seq模型則是爲了解決這類問題而設計的。
Seq2Seq模型又叫Encoder-Decoder模型,事實上我認爲Encoder-Decoder更能夠表達這個模型的設計思想,即將輸入的N的序列編碼(Encoder)成一個場景變量(context) C,然後使用一個解碼器網絡(Decoder)進行解碼,其中C作爲初始狀態h0輸入到Decoder中。如下圖所示
這裏存在三個問題:
- 1.C是怎麼計算得到的?
C的計算方法有很多種,比如將encoder中的最後一個隱藏層變量直接拿出來作爲C,即,或者將做一個矩陣變換,也可以將所有的encoder中所有的隱藏層做一個變換,總之C是由網絡左側的encoder網絡的隱藏層計算得到的,即
- 2.Decoder中的輸入是什麼,翻譯什麼時候終止?
以機器翻譯爲例,假設輸入是“Hello,world”,我們先將“Hello,world”通過Encoder生成一個場景變量C,假設解碼器的輸入爲,假設已知,那麼我們可以計算出y1,然後令,即將前一時刻的輸出作爲下一時刻的輸入。所以又是怎麼得來的呢?通常我們用一個特殊的字符"<BOS>"(begin of sentense)來表示一個句子的開頭。終止條件也類似,Seq2Seq理論上是可以一直預測下去,通常規定當預測結果爲特殊的字符"<EOS>"(end of sentense)時預測終止。如下圖所示
- 3.Decoder中的隱藏層變量怎麼計算?
我們來看公式
和前一時刻的隱藏變量,場景變量C以及前一時刻的輸出也就是當前時刻輸入有關,而這裏的g就是一個RNN網絡,選擇LSTM或者GRU均可。有了解碼器的隱藏狀態後,我們就可以使用softmax運算得到。
這裏一個我還沒弄明白的問題是C是如何放到g中去的,因爲我的理解一個RNN網絡有一個當前輸入和一個隱藏狀態就足夠了,個人偏向於C是和做變換之後再放入RNN網絡(事實上attension就是這麼幹的),但是沒找到相關的說明,等有空看看tensorflow的源碼吧。。
還有一個問題就是初始的隱含變量是怎麼得到的,在機器翻譯中有一種做法是對encoder中的第一個輸入做變換後得到的,即,這裏的變量W也可以通過反向傳播學習得到,因爲輸入是“Hello,world”,那麼Hello這個單詞和我們希望翻譯得到的第一個單詞應該是相關性最強的。
我們對於Seq2Seq模型做一個總結就是:將歷史的輸入通過Encoder編碼成一個場景變量C,C的作用在於存儲歷史的信息,C作爲Decoder輸入的一部分用來預測,Decoder的輸入是前一時刻的Decoder的輸出,因此理論上可以一直輸出下去,我們可以通過規則限定它的長度,從而可以解決輸入序列和輸出序列不等長的N VS M問題。
但是顯然將輸入編碼成一個固定的場景變量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的值就比較大。
因此令編碼器在時間步的隱藏狀態爲,且總時間步數爲。那麼解碼器在時間步的背景變量爲所有編碼器隱藏狀態的加權平均:
那麼現在我們已經理解的Attention中注意力矩陣a的作用,問題就只剩下a是如何得來的了。
顯然a的作用是權重,是一個關於時間t的概率分佈,因此a可以通過一個softmax求得
那麼現在的問題就是如何得到,顯然既然它的作用就是編碼器t時刻的輸入與解碼器t’時刻的權重值,我們可以通過t時刻的隱藏狀態和t’-1時刻的隱藏狀態計算得到。即:
這裏的a可以有多種選擇一個簡單的選擇是計算它們的內積,注意此時通過內積運算得到的是一個標量,符合我們對於權重的期待(不能還是個矩陣)。
總結一下Attention模型:
- 將Seq2Seq中的場景C變成了一個隨時間變化的權重變量,C由注意力矩陣a計算求得,a的物理含義是對encoder中輸入變量的權重(即注意力)
- 矩陣a中的元素at’t反應了encoder中t時刻的輸入對於decoder中t’時刻的權重,因此是由encoder中t時刻的隱藏層變量和decoder中t’-1時刻的隱藏層變量計算得到。
- Attention模型可以將encoder中的輸入通過注意力矩陣a編碼到decoder中,大大增強了Seq2Seq的模型表達能力