在李紀為博士的畢業**中提到,基於生成的閒聊機械人中,seq2seq是一種很常見的技術。例如,在法語-英語翻譯中,**的當前英語單詞不僅取決於所有前面的已翻譯的英語單詞,還取決於原始的法語輸入;另乙個例子,對話中當前的response不僅取決於以往的response,還取決於訊息的輸入。其實,seq2seq最早被用於機器翻譯,後來成功擴充套件到多種自然語言生成任務,如文字摘要和影象標題的生成。本文將介紹幾種常見的seq2seq的模型原理,seq2seq的變形以及seq2seq用到的一些小trick。
我們使用x=代表輸入的語句,y=代表輸出的語句,yt代表當前輸出詞。在理解seq2seq的過程中,我們要牢記我們的目標是:
即輸出的yt不僅依賴之前的輸出,還依賴輸入語句x,模型再怎麼變化都是在公式(1)的約束之下。
最早由bengio等人發表在computer science上的**:learning phrase representations using rnn encoder–decoder
for statistical machine translation。對於rnn來說,x=代表輸入,在每個時間步t,rnn的隱藏狀態ht
由公式(1)更新:ht
=f(h
t−1,
xt) (2)
其中,f代表乙個非線性函式。這時ht
就是乙個rnn_size的隱含狀態。然後需要通過乙個矩陣w將其轉成乙個symbol_size的輸出,並通過softmax函式將其轉化為概率,然後篩選出概率最大的symbol為輸出symbol。
以上是rnn的基本原理,接下來介紹**中的seq2seq模型:
模型包括encoder和decoder兩個部分。首先在encoder部分,將輸入傳到encoder部分,得到最後乙個時間步長t的隱藏狀態c,這就是rnncell的基本功能。其次是decoder部分,從上述模型的箭頭中可以看出,decoder的隱藏狀態ht
就由ht
−1,yt−
1 和c三部分構成。即:
由此我們的到了decoder的隱藏狀態,那麼最後的輸出yt
從圖中也
可以看得
出來由三
部分得到
, h_
, y_$和c,即:
到現在為止,我們就實現了我們的目標(1)。
改進模型介紹2023年發表的**sequence to sequence learning with neural networks。模型圖:
可以看到,該模型和第乙個模型主要的區別在於從輸入到輸出有一條完整的流:abc為encoder的輸入,wxyz為decoder的輸入。將encoder最後得到的隱藏層的狀態ht輸入到decoder的第乙個cell裡,就不用像第乙個模型一樣,而乙個decoder的cell都需要ht,因此從整體上看,從輸入到輸出像是一條「線性的資料流」。本文的**也提出來,abc翻譯為xyz,將encoder的input變為「cba」效果更好。即a和x的距離更近了,更有利於seq2seq模型的交流。
具體來說,encoder的過程如下圖。這和我們之前的encoder都一樣。
不同的是decoder的階段:
得到了encoder represention,即encoder的最後乙個時間步長的隱層ht以後,輸入到decoder的第乙個cell裡,然後通過乙個啟用函式和softmax層,得到候選的symbols,篩選出概率最大的symbol,然後作為下乙個時間步長的輸入,傳到cell中。這樣,我們就得到了我們的目標(1)。
我們前面提到,距離decoder的第乙個cell越近的輸入單詞,對decoder的影響越大。但這並不符合常理,這時就提出了attention機制,對於輸出的每乙個cell,都檢測輸入的sequence裡每個單詞的重要性,即**neural machine translation
by jointly learning to align and translate。attention在nmt基於seq2seq的改進模型再進行改進,原理如下:
上圖中,encoder和decoder都發生了變化。首先說encoder,使用了雙向rnn,因為希望不僅能得到前向的詞的順序,還希望能夠得到反向的詞的順序。使用hj
→代表hj前向的隱層狀態,hj
← 代表hj的反向隱層狀態,hj的最終狀態為將兩者連線(concat)起來,即hj
=[hj
→;hj
←]。再說decoder。我們再來回顧一下我們的目標公式(1):
對於加入attention機制的seq2seq,每乙個輸出為公式(6)。即對於時間步i的輸出yi,由時間步i的隱藏狀態si,由attention計算得到的輸入內容ci和上乙個輸出yi-1得到。
其中si是對於時間步i的隱藏狀態,由公式(7)計算。即對於時間步i的隱藏狀態,由時間步i-1的隱藏狀態si-1,由attention計算得到的輸入內容ci和上乙個輸出yi-1得到。
通過以上公式可以看出,加入attention的seq2seq比之前的seq2seq多了乙個輸入內容向量ci,那麼這個ci是怎麼得來的呢?和輸入內容以及attention有什麼關係呢?我們接著看公式(8):
即,對於decoder的時間步長i的隱藏狀態si,ci等於tx個輸入向量[1,tx]與其權重αi
j 相乘求和。這個權重αi
j 由公式(9)得到:
其中,eij由公式(10)得到:
總結一下,對於時間步i的隱藏狀態si,可以通過求時間步i-1的隱藏狀態si-1、輸入內容的編碼向量ci和上乙個輸出yi-1得到。輸入內容編碼ci是新加入的內容,可以通過計算輸入句子中每個單詞的權重,然後加權求和得到ci。直觀解釋這個權重:對於decoder的si和encoder的hj的權重\alpha_$,就是上乙個時間步長的隱藏狀態si-1與encoder的hj通過非線性函式得到的。這樣就把輸入內容加入到解碼的過程中,這和我們人類翻譯的過程也是類似的,即對於當前輸出的詞,每乙個輸入給與的注意力是不一樣的。
但是,如果有乙個cell解碼錯了詞,那麼錯誤便會一直累加。所以在工程上提出了beam-search的方法。即在decoder階段,某個cell解碼時不只是選出**概率最大的symbol,而是選出k個概率最大的詞(例如k = 5,我們稱k=5為beam-size)。在下乙個時間步長,對於這5個概率最大的詞,可能就會有5v個symbols(v代表詞表的大小)。但是,只保留這5v個symbols中最好的5個,然後不斷的沿時間步長走下去。這樣可以保證得到的decode的整體的結果最優。
(1)learning phrase representations using rnn encoder–decoder
for statistical machine translation
(2)sequence to sequence learning with neural networks
(3)neural machine translation
by jointly learning to align and translate
(4)seq2seq with beam-search
(5) 從頭實現乙個深度學習對話系統–seq-to-seq模型詳解
(6) seq2seq學習筆記
Seq2Seq模型結構
seq2seq sequence to sequence 是乙個處理序列問題的模型,傳統的 rnn 或 lstm 只能處理 輸入及輸出是定長即 一對一或多對多的問題,而 seq2seq 則能處理一對多的問題,它也是 rnn 最重要的乙個變種 n vs m 輸入與輸出序列長度不同 編碼 解碼模型,主要...
介紹 Seq2Seq 模型
2019 09 10 19 29 26 問題描述 什麼是seq2seq模型?seq2seq模型在解碼時有哪些常用辦法?問題求解 seq2seq模型是將乙個序列訊號,通過編碼解碼生成乙個新的序列訊號,通常用於機器翻譯 語音識別 自動對話等任務。在seq2seq模型提出之前,深度學習網路在影象分類等問題...
seq2seq聊天模型 一
最近完成了sqe2seq聊天模型,磕磕碰碰的遇到不少問題,最終總算是做出來了,並符合自己的預期結果。利用流程圖,從理論方面,回顧,總結seq2seq模型,你給模型一段輸入,它返回一段輸出!可以用在這些情景,聊天模型 翻譯 看圖說話 主旨提取等等涉及自然語言的層面,用途較廣泛 例如 輸入 今天中午吃什...