自編碼器
- 構建一個自編碼器主要包括兩部分:編碼器(Encoder)和解碼器(Decoder)。 編碼器將輸入壓縮爲潛在空間特徵,解碼器將潛在空間特徵重構輸出。
- 自編碼的核心價值是在於提取潛在的高階空間特徵信息。主要應用是兩個方 面:數據去燥以及進行可視化降維。
什麼是seq2seq
- Seq2Seq(Sequence to Sequence),它被提出於2014年,最早由兩 篇文章獨立地闡述了它主要思想,分別是Google Brain團隊的 《Sequence to Sequence Learning with Neural Networks》和Yoshua Bengio團隊的《Learning Phrase Representation using RNN EncoderDecoder for Statistical Machine Translation》。
- Seq2Seq屬於一種Encoder-Decoder結構。
Encoder-Decoder
- Encoder-Decoder 的這種結構,其中 Encoder 是一個RNNCell(RNN ,GRU,LSTM 等) 結構。每個 time-step, 我們向 Encoder 中輸入一個字/詞(一般是表示這個字/詞的一個實數向量),直到我們輸入這個句子的最後 一個字/詞 ,然後輸出整個句子的語義向量 c(一般情況下,), 是最後一個time-step輸 入)。因爲 RNN 的特點就是把前面每一步的輸入信息都考慮進來了,所以理論上這個 c 就能夠把整個句子 的信息都包含了,我們可以把 c 當成這個句子的一個語義表示,也就是一個句向量。在 Decoder 中,我們根 據 Encoder 得到的句向量 c, 一步一步地把蘊含在其中的信息分析出來。
Seq2Seq圖解
Seq2Seq預測
Seq2Seq應用總結
- Seq2Seq應用場景,包括了經典的機器翻譯、文本摘要和對話生成等,也包括了 一些非常有趣的應用
比如:根據公式圖片生成 latex 代碼,生成 commit message 等。 - 自然 語言生成(NLG)是一個非常有意思,也非常有前途的研究領域,簡單地說,就是解決一個 條件概率 p(output| context)的建模問題,即根據 context 來生成 output,這裏的 context 可 以非常零活多樣,大家都是利用深度學習模型對這個條件概率進行建模,同時加上大量的 訓練數據和豐富的想象力,可以實現很多有趣的工作。
- Seq2Seq 是一個簡單易用的框架,開源的實現也非常多,但並不意味着直接生搬硬套就可以了,需要具體問題具體分析。此外,對於生成內容的控制,即 decoding 部分的研究也是一個非常有意思的方向,
比如:如何控制生成文本的長度,控制生成文本的多樣性,控制生成文本的信息量大小,控制生成文本
的情感等等。
Seq2Seq原理
- 最基礎的Seq2Seq模型包含了三個部分,即Encoder、Decoder以 及連接兩者的中間狀態向量
- Encoder通過學習輸入,將其編碼成 一個固定大小的狀態向量c,繼而將c傳給Decoder
- Decoder再通過對狀態向量c的學習來進行輸出。
- 下圖中,圖中每一個box代表 了一個RNN Cell單元,通常是LSTM或者GRU。
- Encoder-Decoder框架可以這麼直觀地去理解:可以把它看作適合 處理由一個句子(或篇章)生成另外一個句子(或篇章)的通用 處理模型。對於句子對<X,Y>,我們的目標是給定輸入句子X,期待通過Encoder-Decoder框架來生成目標句子Y。X和Y可以是同一 種語言,也可以是兩種不同的語言。而X和Y分別由各自的單詞序 列構成:
- Encoder顧名思義就是對輸入句子X進行編碼,將輸入句子通過非 線性變換轉化爲中間語義表示C:
- 對於解碼器Decoder來說,其任務是根據句子X的中間語義表示C 和之前已經生成的歷史信息來生成i時刻要生成的單詞
- 每個 都依次這麼產生,那麼看起來就是整個系統根據輸入句子X生成了目標句子Y
舉個例子
輸入下x,輸出y,如下圖
Inputs | Target |
---|---|
How are you? | I am good |
Can you fly that thing? | Not yet |
幾個重要的符號:
- <PAD> 在訓練中,我們將數據按批次輸入。但同一批次中必須有相同的Sequence Length(序列長度 /time_steps)。所以我們會用<PAD>填充較短的輸入。
- <EOS> 它能告訴解碼器句子在哪裏結束,並且它允許解碼器在其輸出中表明句子結束的位置
- <UNK> 忽視詞彙表中出現頻率不夠高而不足以考慮在內的文字,將這些單詞替換爲 <UNK>
- <GO> 解碼器的第一個時間步驟的輸入,以使解碼器知道何時開始產生輸出
下圖爲:word2id
編碼器
在輸入中,一個批次數據的長度大小需要一致,所以要進行填充。對照word2id可以得到輸入向量:
解碼器
更具word2id找到對應的輸出
- 將RNN模塊換成LSTM,則效果如下圖。Encoder 和 Decoder 都是 4 個時間步 長的 LSTM(但是隻有兩個RNN Cell)。
小技巧:將源句子順序顛倒後再輸入 Encoder 中,比如源句子爲“A B C”,那麼輸入 Encoder 的順序爲 “C B A”, 經過這樣的處理後,取得了很大的提升,而且這樣的處理使得模型能夠很好
地處理長句子。