AI時代系列(2) 機器學習三部曲: 🔹 第二部:《深度學習 —— 神經網路的革命》
35/100 第四週:📌 循環神經網路 RNN
35.多層 RNN 與雙向 RNN 🔄 往前也往後看,語境更完整!
________________________________________
✅ 問題引入:一層 RNN 不夠用?
在現實任務中,例如閱讀句子、分析語音、預測股價,「單層記憶」常常不足以捕捉深層語意或複雜時間依賴。
所以有兩個重要進化版:
• 多層 RNN:堆疊更深 → 學更抽象的序列表示
• 雙向 RNN:不只看「前面」,還能看「後面」的上下文
________________________________________
🔁 一、多層 RNN(Stacked RNN)
就像 CNN 疊多層來學高階特徵,RNN 也能「堆疊多層」,讓高層能從低層輸出的時間表示中提煉更抽象語意。
🧠 原理:
• 第一層處理原始序列 → 得到時間步向量
• 第二層輸入為第一層的隱藏狀態序列
• 可使用 2~4 層(超過可能過擬合或梯度問題)
⚙️ Keras 實作:
python
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense
model = Sequential([
LSTM(128, return_sequences=True, input_shape=(100, 64)), # 第一層
LSTM(64), # 第二層
Dense(1, activation='sigmoid')
])
這段程式碼建立了一個雙層 LSTM 模型,用於處理長序列資料並執行二分類任務。第一層 LSTM(128, return_sequences=True) 表示輸出整個序列的隱藏狀態,以便傳遞給下一層;第二層 LSTM(64) 則僅輸出最後一個時間步的隱藏狀態,代表整段序列的總結特徵。最後透過 Dense(1, activation='sigmoid') 輸出二元分類結果(如正/負、漲/跌)。這種堆疊式 LSTM 結構能更深入地學習序列中的長期依賴與高階特徵,適合應用於如情感分析、語音辨識或時間序列預測等任務。
📌 return_sequences=True → 保留所有時間步的輸出給下一層。
________________________________________
🔁 二、雙向 RNN(Bidirectional RNN)
一般 RNN 是「從前看向後」,但語言或語音中,下一個字也能幫助理解前面的詞!
舉例:
• 「他喜歡喝...」你猜可能是「奶茶」
• 但「他喜歡喝奶...」 → "奶" 更確定是「奶茶」或「奶昔」
✅ 雙向 RNN 同時建立「順序記憶 + 逆序記憶」,輸出時合併兩者上下文資訊!
________________________________________
📐 雙向 RNN 原理圖:
x1 → [→ Cell] → h1→
x2 → [→ Cell] → h2→
x3 → [→ Cell] → h3→
x3 → [← Cell] → h3←
x2 → [← Cell] → h2←
x1 → [← Cell] → h1←
合併 h_t = [h_t→ ; h_t←]
這張圖示說明了**雙向 RNN(Bidirectional RNN)**的基本原理。它同時建立了兩個獨立的 RNN:一個從前往後處理序列(→),另一個從後往前處理序列(←)。 對於每個時間步 t,模型分別計算出正向隱藏狀態 ht→h_與反向隱藏狀態 ht←h_ ,再將兩者串接合併為最終的輸出表示:ht=[ht→ ; ht←]
這種設計讓模型能同時利用過去與未來的上下文資訊,特別適合處理整體語意理解任務,如命名實體辨識(NER)、機器翻譯或語音辨識等,提升對序列全貌的理解能力。
________________________________________
⚙️ Keras 實作:
python
from tensorflow.keras.layers import Bidirectional
model = Sequential([
Bidirectional(LSTM(64), input_shape=(100, 64)),
Dense(1, activation='sigmoid')
])
這段程式碼建立了一個使用 雙向 LSTM(Bidirectional LSTM) 的序列模型,用於處理具有時間依賴性的二分類任務。透過 Bidirectional(LSTM(64)),模型同時從序列的正向與反向學習時間特徵,能夠捕捉輸入資料中前後文的完整資訊;輸入資料為長度 100、每步 64 維的序列,最後經由一個 Dense 層與 sigmoid 激活函數輸出分類機率。這種架構常用於語言理解、情感分析或語音辨識等需要雙向上下文的應用場景。
📌 雙向結構會將輸出維度變為 2 倍(前向 + 後向拼接)
________________________________________
📊 多層 vs 雙向 比較表:
· 多層 RNN
· 說明:透過多層堆疊,學習更深層次的序列特徵表示。
· 適合任務:長文本摘要、序列到序列模型(seq2seq)應用。
· 雙向 RNN
· 說明:同時考慮序列的前向與後向資訊,語境理解更完整。
· 適合任務:情感分析、命名實體辨識(NER)、語音辨識。
________________________________________
🧠 多層 + 雙向:可以一起用嗎?
✅ 當然可以,而且很常見!如下:
python
model = Sequential([
Bidirectional(LSTM(128, return_sequences=True), input_shape=(100, 64)),
Bidirectional(LSTM(64)),
Dense(1, activation='sigmoid')
])
這就是雙向堆疊式 RNN,讓模型具備「深層 + 雙向」記憶力,廣泛應用在:
• BERT 模型
• 自動字幕對齊
• 高階翻譯模型
________________________________________
🎯 小結與啟示:
✅ 多層 RNN 提升模型學習複雜序列結構的能力
✅ 雙向 RNN 提供更完整的語境理解,特別適合 NLP 任務
✅ 多層 + 雙向 可打造更強大的序列理解力(但也需注意訓練資源與過擬合)










