跳至主要內容
Study Jam:GenAI 開發者實戰 — 第 22/29 篇

編碼器-解碼器架構

內文字級

編碼器-解碼器架構
更新:2026-10-12

課程概述

Encoder-Decoder 是處理「輸入一段內容,再產出另一段內容」的經典架構。翻譯、摘要、語音轉文字,甚至圖片說明,都可以用這個角度來理解。這堂課會先把 Encoder 和 Decoder 的分工講清楚,再比較訓練與實際生成為什麼不太一樣,最後接回 Transformer。

Encoder–Decoder Seq2Seq 架構:Encoder 建立來源序列各位置的上下文,Attention 讓 Decoder 每一步動態讀取相關來源後逐 Token 生成;訓練用正確前一個目標做 Teacher Forcing,推論則回饋自身預測直到 EOS

Attention 解除了早期 RNN 把整段來源壓成單一向量的瓶頸。Transformer 訓練時可用完整的正確目標序列一次計算多個位置;真正生成時沒有後面的答案,仍得把自己的預測接回下一步。

你將學到

  • 描述 Encoder-Decoder 架構的整體資料流向
  • 解釋 Encoder 如何把輸入序列轉成可供 Decoder 讀取的表徵
  • 理解 Decoder 如何利用上下文表徵逐步生成輸出序列
  • 比較 RNN-based 與 Transformer-based 的 Encoder-Decoder 差異

核心概念

Seq2Seq 問題的本質

很多任務都能看成 Seq2Seq:中文翻成英文、長文章濃縮成摘要、語音轉成逐字稿,或把圖片轉成一句描述。輸入與輸出不必等長,輸出的某個位置也可能需要參考來源的好幾個地方。這正是「先建立來源表徵,再依需要生成」這種分工派得上用場的地方。

Encoder 的角色

Encoder 負責把原始輸入轉成 Decoder 能使用的表徵。早期 RNN 架構常以最後的隱藏狀態當摘要,資訊容易卡在固定大小的瓶頸;加入 Attention 後,Decoder 可以讀取 Encoder 在各位置留下的狀態。Transformer Encoder 則直接替每個輸入 Token 建立上下文化表徵,讓來源細節保留得更完整。

Decoder 的角色

Decoder 負責產生輸出。自迴歸 Decoder 每一步都根據已出現的目標 Token,以及 Encoder 提供的來源表徵,預測下一個 Token。Cross-Attention 是兩端之間的橋樑;生成則會持續到結束標記、長度上限或其他停止條件。若使用 Greedy、Beam Search 或取樣,改變的是「下一步怎麼選」,不是 Encoder 的內容。

Teacher Forcing 訓練技巧

訓練時,Decoder 通常會看到向右位移一格的正確目標序列,並學著預測每個位置的下一個 Token,這就是 Teacher Forcing。對 Transformer 來說,因果遮罩會阻止每個位置偷看未來答案,因此多個位置仍能一起計算;RNN Decoder 即使用 Teacher Forcing,時間步本身還是循序的。實際生成時只能接回模型自己的預測,所以前一步出錯可能一路影響下去,這個落差常被稱為 Exposure Bias。

從 RNN 到 Transformer 的演進

早期 Encoder-Decoder 多用 RNN 或 LSTM,序列得一個時間步一個時間步處理。Transformer 改用 Self-Attention、前饋網路與殘差連接:Encoder 整理來源,Decoder 用 Masked Self-Attention 處理目標,再用 Cross-Attention 讀取來源。訓練時平行度提高很多,但自迴歸推論仍要逐 Token 產生,不能說整個流程都完全平行。

查看流程與節點文字

箭頭表示流程方向;方括號與引號內是節點名稱,可搭配下方圖解閱讀。

%%{init: {"flowchart": {"curve": "linear", "nodeSpacing": 24, "rankSpacing": 32}}}%%
flowchart TB
  SOURCE["來源序列"] --> ENCODER["Encoder 建立<br/>各位置的上下文表徵"]
  ENCODER --> MODE{"現在是訓練<br/>還是實際生成?"}
  subgraph TRAIN["訓練:答案已知"]
      direction TB
      SHIFT["把正確目標<br/>序列右移一格"] --> MASK["套用因果遮罩<br/>不能偷看未來 Token"]
      MASK --> PREDICT_ALL["Transformer<br/>一次預測<br/>多個目標位置"]
      PREDICT_ALL --> LOSS["與正確答案計算 Loss<br/>再更新參數"]
  end
  MODE -->|"訓練"| SHIFT
  ENCODER --> MASK
  subgraph INFER["推論:下一個答案未知"]
      direction TB
      START["從起始 Token<br/>或既有文字開始"] --> NEXT["預測下一個 Token"]
      NEXT --> PICK["依 Greedy、Beam<br/>或取樣策略選一個"]
      PICK --> STOP{"遇到 EOS 或上限?"}
      STOP -->|"還沒"| APPEND["把結果接回輸入"]
      APPEND --> NEXT
      STOP -->|"是"| RESULT["輸出完整序列"]
  end
  MODE -->|"推論"| START
  ENCODER --> NEXT
Teacher Forcing 讓訓練看到正確的前文;上線生成時只能依賴自己的歷史輸出。測試模型時要用真正的推論流程,不能只看訓練 Loss。

實作重點

  • 畫出完整資料流,分別標註 Encoder Self-Attention、Decoder Masked Self-Attention 與 Cross-Attention
  • 用 TensorFlow 建構一個小型 Seq2Seq 模型,分開實作訓練路徑與逐步生成路徑
  • 比較有無 Attention 機制的 Encoder-Decoder 在長序列翻譯上的表現差異
  • 用同一組模型比較 Greedy、Beam Search 與取樣,記錄品質、延遲和輸出多樣性

課程導讀

課程連結:Encoder-Decoder Architecture — Google Skills

課程頁目前列的是概覽影片、Lab Walkthrough 影片、測驗與 Lab Resources 連結,沒有另外列出動手 Lab。依課程說明,Lab Walkthrough 會示範用 TensorFlow 從頭寫出一個簡單的 Encoder-Decoder 來生成詩句。看架構圖時先順著來源資料走一遍,再把訓練和推論分成兩條路看;這樣比較不會把 Teacher Forcing 誤解成正式生成時也能看到正確答案。最後再回頭確認 Cross-Attention 的 Query 來自哪裡、Key 和 Value 又來自哪裡。

延伸學習

Study Jam:GenAI 開發者實戰 — 第 22 篇/共 29 篇 查看系列全覽 →

讀完後,留一個學習紀錄

試著用自己的話說出一個重點,以及你會如何運用。實作文章請先核對結果與清理資源,再標記為讀完。

文章進度以你確認讀完的標記為準,可隨時取消。舊版造訪紀錄保留,但不計入讀完;這份自評不代表已掌握內容。

留言討論

文章目錄與系列

徽章解鎖!