【轉載】Encoder-decoder模型

鑫Y.Y發表於2020-11-21

Encoder-Decoder(編碼-解碼)是深度學習中非常常見的一個模型框架,比如無監督演算法的auto-encoding就是用編碼-解碼的結構設計並訓練的;比如這兩年比較熱的image caption的應用,就是CNN-RNN的編碼-解碼框架;再比如神經網路機器翻譯NMT模型,往往就是LSTM-LSTM的編碼-解碼框架。因此,準確的說,Encoder-Decoder並不是一個具體的模型,而是一類框架。Encoder和Decoder部分可以是任意的文字,語音,影像,視訊資料,模型可以採用CNN,RNN,BiRNN、LSTM、GRU等等。所以基於Encoder-Decoder,我們可以設計出各種各樣的應用演算法。

Encoder-Decoder框架有一個最顯著的特徵就是它是一個End-to-End學習的演算法;本文將以文字-文字的例子作為介紹,這樣的模型往往用在機器翻譯中,比如將法語翻譯成英語。這樣的模型也被叫做 Sequence to Sequence learning[1]。所謂編碼,就是將輸入序列轉化成一個固定長度的向量;解碼,就是將之前生成的固定向量再轉化成輸出序列。

參考文章:本段出自Bin的專欄blog.csdn.net/xbinworld。


這裡複習下Sequence2Sequence任務到底是什麼,所謂的Sequence2Sequence任務主要是泛指一些Sequence到Sequence的對映問題,Sequence在這裡可以理解為一個字串序列,當我們在給定一個字串序列後,希望得到與之對應的另一個字串序列(如 翻譯後的、如語義上對應的)時,這個任務就可以稱為Sequence2Sequence了。

在現在的深度學習領域當中,通常的做法是將輸入的源Sequence編碼到一箇中間的context當中,這個context是一個特定長度的編碼(可以理解為一個向量),然後再通過這個context還原成一個輸出的目標Sequence。 

如果用人的思維來看,就是我們先看到源Sequence,將其讀一遍,然後在我們大腦當中就記住了這個源Sequence,並且存在大腦的某一個位置上,形成我們自己的記憶(對應Context),然後我們再經過思考,將這個大腦裡的東西轉變成輸出,然後寫下來。

那麼我們大腦讀入的過程叫做Encoder,即將輸入的東西變成我們自己的記憶,放在大腦當中,而這個記憶可以叫做Context,然後我們再根據這個Context,轉化成答案寫下來,這個寫的過程叫做Decoder。其實就是編碼-儲存-解碼的過程。

而對應的,大腦怎麼讀入(Encoder怎麼工作)有一個特定的方式,怎麼記憶(Context)有一種特定的形式,怎麼轉變成答案(Decoder怎麼工作)又有一種特定的工作方式。

好了,現在我們大體瞭解了一個工作的流程Encoder-Decoder後,我們來介紹一個深度學習當中,最經典的Encoder-Decoder實現方式,即用RNN來實現。

這裡寫圖片描述

在RNN Encoder-Decoder的工作當中,我們用一個RNN去模擬大腦的讀入動作,用一個特定長度的特徵向量去模擬我們的記憶,然後再用另外一個RNN去模擬大腦思考得到答案的動作,將三者組織起來利用就成了一個可以實現Sequence2Sequence工作的“模擬大腦”了。
而我們剩下的工作也就是如何正確的利用RNN去實現,以及如何正確且合理的組織這三個部分了。

參考:http://blog.csdn.net/mebiuw/article/details/53341404


Encoder-Decoder模型

Encoder-Decoder框架可以看作是一種文字處理領域的研究模式,應用場景異常廣泛。下圖是文字處理領域裡常用的Encoder-Decoder框架最抽象的一種表示:

Encoder-Decoder框架可以這麼直觀地去理解:可以把它看作適合處理由一個句子(或篇章)生成另外一個句子(或篇章)的通用處理模型。對於句子對<X,Y>,我們的目標是給定輸入句子X,期待通過Encoder-Decoder框架來生成目標句子Y。X和Y可以是同一種語言,也可以是兩種不同的語言。而X和Y分別由各自的單詞序列構成:

Encoder顧名思義就是對輸入句子X進行編碼,將輸入句子通過非線性變換轉化為中間語義表示C:

對於解碼器Decoder來說,其任務是根據句子X的中間語義表示C和之前已經生成的歷史資訊y1,y2….yi-1來生成i時刻要生成的單詞yi

每個yi都依次這麼產生,那麼看起來就是整個系統根據輸入句子X生成了目標句子Y。

參考文章:http://blog.csdn.net/malefactor/article/details/51124732


Encoder-Decoder不是一種模型,而是一種框架,一種處理問題的思路,最早應用於機器翻譯領域,輸入一個序列,輸出另外一個序列。機器翻譯問題就是將一種語言序列轉換成另外一種語言序列,將該技術擴充套件到其他領域,比如輸入序列可以是文字,語音,影像,視訊,輸出序列可以是文字,影像,可以解決很多別的型別的問題。這一大類問題就是上圖中的sequence-to-sequence問題。這裡以輸入為文字,輸出也為文字作為例子進行介紹:

ä¸é¢ | èªç¶è¯­è¨å¤ç学习ç¬è®°ï¼äºï¼ï¼encoder-decoderæ¡æ¶åattention mechanism两ç§ç ç©¶

encoder部分是將輸入序列表示成一個帶有語義的向量,使用最廣泛的表示技術是Recurrent Neural Network,RNN是一個基本模型,在訓練的時候會遇到gradient explode或者gradient vanishing的問題,導致無法訓練,所以在實際中經常使用的是經過改良的LSTM RNN或者GRU RNN對輸入序列進行表示,更加複雜一點可以用BiRNN、BiRNN with LSTM、BiRNN with GRU、多層RNN等模型來表示,輸入序列最終表示為最後一個word的hidden state vector。

decoder部分是以encoder生成的hidden state vector作為輸入“解碼”出目標文字序列,本質上是一個語言模型,最常見的是用Recurrent Neural Network Language Model (RNNLM),只要涉及到RNN就會有訓練的問題,也就需要用LSTM、GRU和一些高階的model來代替。目標序列的生成和LM做句子生成的過程類似,只是說計算條件概率時需要考慮encoder向量。

這裡,每一種模型幾乎都可以出一篇paper,尤其是在這個技術剛剛開始應用在各個領域中的時候,大家通過嘗試不同的模型組合,得到state-of-the-art結果。

參考文章:

【1】http://www.weixinnu.com/v/00DK3E

【2】http://www.bigdataway.net/node/2850


所謂encoder-decoder模型,又叫做編碼-解碼模型。這是一種應用於seq2seq問題的模型。
那麼seq2seq又是什麼呢?簡單的說,就是根據一個輸入序列x,來生成另一個輸出序列y。seq2seq有很多的應用,例如翻譯,文件摘取,問答系統等等。在翻譯中,輸入序列是待翻譯的文字,輸出序列是翻譯後的文字;在問答系統中,輸入序列是提出的問題,而輸出序列是答案。
為了解決seq2seq問題,有人提出了encoder-decoder模型,也就是編碼-解碼模型。所謂編碼,就是將輸入序列轉化成一個固定長度的向量;解碼,就是將之前生成的固定向量再轉化成輸出序列。

此處輸入圖片的描述

 

當然了,這個只是大概的思想,具體實現的時候,編碼器和解碼器都不是固定的,可選的有CNN/RNN/BiRNN/GRU/LSTM等等,你可以自由組合。比如說,你在編碼時使用BiRNN,解碼時使用RNN,或者在編碼時使用RNN,解碼時使用LSTM等等。
這邊為了方便闡述,選取了編碼和解碼都是RNN的組合。在RNN中,當前時間的隱藏狀態是由上一時間的狀態和當前時間輸入決定的,也就是

ht=f(ht−1,xt)

獲得了各個時間段的隱藏層以後,再將隱藏層的資訊彙總,生成最後的語義向量

C=q(h1,h2,h3,…,hTx)

一種簡單的方法是將最後的隱藏層作為語義向量C,即

C=q(h1,h2,h3,…,hTx)=hTx

解碼階段可以看做編碼的逆過程。這個階段,我們要根據給定的語義向量C和之前已經生成的輸出序列y1,y2,…yt−1來預測下一個輸出的單詞yt,即 

yt=argmaxP(yt)=∏t=1Tp(yt|{y1,…,yt−1},C)

也可以寫作 

yt=g({y1,…,yt−1},C)

而在RNN中,上式又可以簡化成 

yt=g(yt−1,st,C)

其中s是輸出RNN中的隱藏層,C代表之前提過的語義向量,yt−1表示上個時間段的輸出,反過來作為這個時間段的輸入。而g則可以是一個非線性的多層的神經網路,產生詞典中各個詞語屬於yt的概率。

encoder-decoder模型雖然非常經典,但是侷限性也非常大。最大的侷限性就在於編碼和解碼之間的唯一聯絡就是一個固定長度的語義向量C。也就是說,編碼器要將整個序列的資訊壓縮排一個固定長度的向量中去。但是這樣做有兩個弊端,一是語義向量無法完全表示整個序列的資訊,還有就是先輸入的內容攜帶的資訊會被後輸入的資訊稀釋掉,或者說,被覆蓋了。輸入序列越長,這個現象就越嚴重。這就使得在解碼的時候一開始就沒有獲得輸入序列足夠的資訊, 那麼解碼的準確度自然也就要打個折扣了

參考地址:http://blog.csdn.net/u014595019/article/details/52826423


2019年3月16日補充:

比較好的文章:

Encoder-Decoder模型和Attention模型

地址:https://blog.csdn.net/u011734144/article/details/80230633

相關文章