昨天我們介紹了 RNN 的基本概念,知道它可以記住先前的輸入,適合拿來處理序列資料。
但是,當我們想要做「序列到序列(seq2seq)」的轉換時(例如把一句中文翻譯成英文),會遇到一個挑戰:輸入和輸出的長度往往不一樣,而且需要先「完整理解」整個輸入,才能開始生成輸出。
因此,有了 Encoder-Decoder 架構 的誕生。
今天,我們就來學習如何用「Encoder-Decoder 架構」來解決這個難題~它是現代機器翻譯與許多 AI 應用的基礎!
Encoder-Decoder 是一種「序列到序列」(Sequence-to-Sequence, seq2seq) 的架構模式,主要是把任務分成兩個階段:
最早的 Encoder-Decoder 是使用 RNN/LSTM/GRU 來實作,屬於多對多(many-to-many)的架構形式。
以機器翻譯為例,假設我們要把「我愛吃芭樂」翻譯成英文:
Encoder 階段:
Decoder 階段:
這樣的設計讓模型可以先「完整理解」輸入的意思,再開始生成對應的輸出。
Encoder-Decoder 的一大優勢是架構的彈性。Encoder 和 Decoder 不一定要用相同類型的模型,可以根據任務特性選擇最適合的組合:
應用範例:
這些多樣化的組合,可以讓 Encoder-Decoder 應用在各種不同的序列轉換任務上~
雖然 Encoder-Decoder 架構很強大,但它也有一些明顯的缺點:
前面有提到,在進入 decoder 前,所有輸入的資料都要變成一個固定長度的 context vector。
我們可以想像一下,如果要把一支高畫質的影片壓縮成檔案大小很小的影片,畫質一定會變得很差。同樣的道理,當輸入序列很長時,也就是文本很長的話, context vector 很難保留所有重要的資訊。
當句子越長,context vector 需要「記住」的資訊就越多,但它的容量是固定的,所以必然會遺失一些細節。
為了解決 bottleneck 問題,有學者提出了 Attention(注意力)機制
傳統方法的問題是:Decoder 只能看到一個固定的 context vector。
Attention 的改進:
今天我們學習了Encoder-Decoder 架構,它是處理序列到序列(Seq2Seq)任務的基礎,由 Encoder 和 Decoder 組成。早期的 RNN-based 架構存在瓶頸問題 (Bottleneck),因為所有資訊必須壓縮成一個固定長度的 context vector,導致長序列時容易遺忘早期資訊且無法平行運算。為了解決這個限制,引入了 Attention 機制,它大幅提升了模型處理長序列的能力與準確度~(明天再來多講一點Attention😏)
明天會介紹 Transformer,它把 Attention 機制發揮到了淋漓盡致,是一個非常重要的突破!!
Reference 1
Reference 2
Reference 3