AI時代系列(2) 機器學習三部曲: 🔹 第二部:《深度學習 —— 神經網路的革命》
36/100 第四週:📌 循環神經網路 RNN
36.序列到序列模型(Seq2Seq)📨 從輸入序列預測輸出序列!
_______________________________________
✅ 為什麼需要 Seq2Seq?
一般 RNN 模型只能「輸入一段序列,輸出一個結果」,
但很多任務是:「輸入一段序列,輸出另一段序列」。
📌 例子:
• 輸入英文句子,輸出中文翻譯(NMT)
• 輸入問題,輸出答案(QA)
• 輸入語音片段,輸出文字(Speech2Text)
✅ 這就需要序列到序列(Sequence-to-Sequence, Seq2Seq)模型
________________________________________
🧠 Seq2Seq 模型的兩大核心組件:
組件 功能說明
編碼器 Encoder 接收輸入序列,壓縮成「上下文向量」
解碼器 Decoder 根據這個向量,一步一步產出輸出序列
________________________________________
🔁 工作流程圖示:
Input: I love dogs →
[Encoder RNN] → Context Vector (c)
Output: (start) → [Decoder RNN] → 我 → 喜 → 歡 → 狗 → (end)
這張圖示呈現了序列到序列模型(Seq2Seq)的基本架構,常用於機器翻譯等任務,例如將英文句子 "I love dogs" 翻譯為中文 "我喜歡狗"。整體流程分為兩個階段:首先,Encoder RNN 將輸入序列逐步讀入,並壓縮為一個固定長度的上下文向量(Context Vector, c),包含整句話的語意摘要;接著,Decoder RNN 以起始符號為開端,根據這個向量逐步產出對應的目標語言詞彙,直到生成結束符號。這種結構可有效學習不同語言或序列間的語意對應關係,廣泛應用於翻譯、摘要與對話系統中。
🧠 Encoder 把整句話壓縮成上下文向量,
🧠 Decoder 則根據這個向量和之前的輸出詞,逐步預測下一個詞。
________________________________________
📦 TensorFlow / Keras 基本結構(簡化版):
python
from tensorflow.keras.models import Model
from tensorflow.keras.layers import Input, LSTM, Dense
# Encoder
encoder_inputs = Input(shape=(None, 128))
encoder_lstm = LSTM(256, return_state=True)
encoder_outputs, state_h, state_c = encoder_lstm(encoder_inputs)
encoder_states = [state_h, state_c]
# Decoder
decoder_inputs = Input(shape=(None, 128))
decoder_lstm = LSTM(256, return_sequences=True, return_state=True)
decoder_outputs, _, _ = decoder_lstm(decoder_inputs, initial_state=encoder_states)
decoder_dense = Dense(10000, activation='softmax') # 假設詞彙表有 10000 個詞
decoder_outputs = decoder_dense(decoder_outputs)
model = Model([encoder_inputs, decoder_inputs], decoder_outputs)
這是一個典型的 Seq2Seq 模型結構,由 Encoder 將輸入序列壓縮為語意狀態,再由 Decoder 根據該狀態逐步生成輸出序列。此模型為 訓練用結構,若要應用於推論階段(如逐步生成翻譯結果),需進一步將 Encoder 和 Decoder 拆成獨立模型,並支援逐詞生成與狀態回傳。
________________________________________
🧩 解碼器是怎麼「一步一步」運作的?
• Decoder 初始狀態來自 Encoder 的最終記憶
• 每個時間步都輸入前一個輸出(或真實值),產生新的詞
• 訓練時使用「Teacher Forcing」(餵真實值),測試時要逐步產生
________________________________________
🔍 Seq2Seq 的應用場景:
- 語言翻譯:輸入英文句子,輸出中文句子。
- 文本摘要:輸入新聞長文,輸出精簡摘要。
- 問答系統:輸入問題,輸出對應答案。
- 語音轉文字:輸入聲音向量,輸出詞彙序列。
- 聊天機器人:輸入上一句話,輸出回應句。________________________________________
⚠️ 設計挑戰:
1. 資訊瓶頸問題
當長序列被壓縮成一個固定長度的上下文向量(Context Vector)時,可能無法完整保留所有關鍵資訊,導致翻譯或生成品質下降。
✅ 解法:引入 Attention 機制,讓 Decoder 在每個時間步都能「關注」Encoder 輸出的不同部分,動態選擇關鍵資訊,提升效果。
2. 訓練成本高、需大量資料
尤其在詞彙量龐大或處理長序列時,參數多、學習困難,導致訓練緩慢且效果受限。
✅ 解法:使用預訓練模型(如 BERT、mT5),能以大規模語料學到語意特徵,再微調至特定任務,提升效率與效果。
3. 輸入輸出長度不一致
真實任務中,輸入與輸出序列長度常不對稱(如 "Yes." → "是的,我同意。"),無法套用固定長度架構。
✅ 解法:RNN 架構天然支援變長輸入與輸出,可依據時間步動態處理不同長度的語句,靈活對應多樣任務需求。
📌 總結來說,這些挑戰與對應技術構成了現代序列建模的重要演進方向,是從傳統 Seq2Seq 發展到注意力機制與預訓練語言模型的關鍵動力。
______________________________________
🎯 小結與啟示:
✅ Seq2Seq 是讓神經網路具備「從一段話輸出另一段話」的核心架構
✅ Encoder-Decoder 組合可靈活處理各類變長輸入輸出任務
✅ 是 NLP 與語音處理不可或缺的基礎結構,後續可搭配 Attention 技術強化