Programming with Data

資料科學專欄,程式語言以Python為主,資料則是會整理機器學習的筆記。在找不到好看的封面圖時,偷渡無處可發旅遊照。

27. Seq2Seq:Encoder, Decoder概念

--

RNN 主要應用在序列數據資料的場景。尤其是自然語言處理的領域,如語言模型及機器翻譯等。 RNN 還可以對具有固定周期特徵的數據建立預測模型。

種類介紹

one to one

典型的神經網絡的應用,給定一個輸入,預測一個輸出。而其他的情形都需要應用 RNN 模型。

one to many

圖像標註(Image Captioning)就是one to many的典型例子,輸入一個圖片,得到對圖片的語言描述,這是一個序列輸出。

many to one

其應用實例如情感分類(Sentiment Classification),給定一句話判斷其情感,其中輸入是序列。

many to many

  • 第一種 Many to many 的典型應用場景是機器翻譯,比如一句英文,輸出一句中文,這時輸入與輸出都是序列。
  • 第二種 many to many 可以應用在視頻分類問題(Video classification on frame level),輸入一段視頻,對每一幀圖片分類。因此,可見RNN模型廣泛應用在各種業務場景中。

何謂Sequence to Sequence(Seq2Seq)

Seq2Seq 是由 Encoder 與 Decoder 兩個 RNN 構成,Encoder 就是負責將輸入序列消化、吸收成一個向量,我們通常把這個向量稱為 context vector,顧名思義,這個向量會囊括原序列的重要訊息。而 Decoder 則是根據 context vector 來生成文字,不過回到剛剛的困境,我們只有 1 個輸入,要怎麼生成出超過 1 個輸出呢?其實並不難,只要把目前的輸出當成之後的輸入就成了,架構可分為三部分:Encoder、Decoder、State Vector

總之, Sequence to Sequence 的精華所在便是串接了兩個 RNN ,第一個 RNN 負責將長度為 M 的序列給壓成 1 個向量,第二個 RNN 則根據這 1 個向量產生出 N 個輸出,這 M -> 1 與 1 -> N 相輔相成下就構建出了 M to N 的模型。

其實Encoder 與 Decoder 不一定都只有 RNN,例如也可以CNN與RNN一起當 Encoder,負責將影像編碼成向量,而 Decoder 根據這個向量來生成描述,這樣就能應用在輸入圖片產出圖片描述。

關於Encoder-Decoder,有 2 點需要說明:

  1. 不論輸入和輸出的長度是什麼,中間的「向量 c」 長度都是固定的(這也是它的缺陷,下文會詳細說明)
  2. 根據不同的任務可以選擇不同的編碼器和解碼器(可以是CNN/RNN/BiRNN/GRU/LSTM 等等)

Encoder-Decoder 的應用包含機器翻譯、對話機器人、詩詞生成、代碼補全、文章摘要、語音識別

Encoder-Decoder 的缺陷

上文提到:Encoder(編碼器)和 Decoder(解碼器)之間只有一個「向量 c」來傳遞信息,且 c 的長度固定。爲了便於理解,我們類比爲「壓縮-解壓」的過程:將一張 800X800 像素的圖片壓縮成 100KB,看上去還比較清晰。再將一張 3000X3000 像素的圖片也壓縮到 100KB,看上去就模糊了。

Attention 解決信息丟失問題

Attention 機制就是爲了解決「信息過長,信息丟失」的問題。 Attention模型的特點是 Encoder 不再將整個輸入序列編碼爲固定長度的「中間向量C」,而是編碼成一個向量的序列。引入了 AttentionEncoder-Decoder 模型如下圖:

這樣,在產生每一個輸出的時候,都能夠做到充分利用輸入序列攜帶的信息,而且這種方法在翻譯任務中取得了非常不錯的成果,詳細的內容會在下一篇討論。

--

--

Programming with Data
Programming with Data

Published in Programming with Data

資料科學專欄,程式語言以Python為主,資料則是會整理機器學習的筆記。在找不到好看的封面圖時,偷渡無處可發旅遊照。

柯頌竹
柯頌竹

Written by 柯頌竹

熱愛自由行、參觀各種形式的展覽,踏上過20個國家的領土。歡迎詢問各種在歐洲自由行的問題。偶爾分享一下資料分析的讀書筆記。

No responses yet