AI時代系列(2) 機器學習三部曲: 🔹 第二部:《深度學習 —— 神經網路的革命》
38/100 第四週:📌 循環神經網路 RNN
38.文本分類實作 🗂 RNN 分析影評正負面!
_______________________________________
🎯 任務目標:
建立一個能夠判斷影評是「正面」或「負面」的神經網路模型,並了解:
• 如何使用 Keras 內建資料集 IMDB
• 如何進行文字前處理與嵌入
• 如何設計 SimpleRNN / LSTM / GRU 結構
• 如何評估並可視化模型表現
________________________________________
📦 1. 載入 IMDB 資料集
python
from tensorflow.keras.datasets import imdb
from tensorflow.keras.preprocessing.sequence import pad_sequences
# 只保留最常用的 10,000 個單字
num_words = 10000
max_len = 200
(x_train, y_train), (x_test, y_test) = imdb.load_data(num_words=num_words)
x_train = pad_sequences(x_train, maxlen=max_len)
x_test = pad_sequences(x_test, maxlen=max_len)
這段程式碼載入了 Keras 的 IMDb 電影評論資料集,並對文字資料進行預處理。它保留最常見的 10,000 個單字,過濾掉低頻詞彙,接著將每篇評論補齊或截斷為固定長度 200 的整數序列,使資料能統一輸入到深度學習模型中。這是文字分類任務(如情感分析)的標準準備步驟,後續可搭配嵌入層與 LSTM、GRU 或 CNN 進行模型訓練與預測。
________________________________________
🔤 2. 建立 RNN 模型
python
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Embedding, SimpleRNN, Dense
model = Sequential([
Embedding(input_dim=num_words, output_dim=64, input_length=max_len),
SimpleRNN(64), # 可替換為 LSTM(64) 或 GRU(64)
Dense(1, activation='sigmoid')
])
model.compile(optimizer='adam',
loss='binary_crossentropy',
metrics=['accuracy'])
這段程式碼建立了一個用於文字情感分類的簡單循環神經網路模型。首先使用 Embedding 將單字索引轉換為 64 維的詞向量,輸入長度為先前處理好的 max_len(200);接著使用一層 SimpleRNN 來處理序列資訊,捕捉文字中的時間關聯性;最後透過 Dense(1, activation='sigmoid') 輸出一個機率值,用於二元分類(如判斷影評為正面或負面)。整體模型透過 adam 最佳化器與 binary_crossentropy 損失函數進行編譯,適合訓練 IMDb 這類二分類文字資料集,是 NLP 初學者常見的入門實作範例。
________________________________________
🏋️ 3. 模型訓練與評估
python
history = model.fit(x_train, y_train,
epochs=5,
batch_size=64,
validation_split=0.2)
這段程式碼將模型套用在 IMDb 訓練資料上進行訓練,設定訓練輪數為 5(epochs=5),每批次處理 64 筆資料(batch_size=64),並保留 20% 的訓練資料作為驗證集(validation_split=0.2)用來監控模型在訓練過程中的泛化表現。訓練結果會儲存在 history 物件中,可用於後續繪圖或分析模型學習曲線。這是深度學習訓練流程中的標準步驟。
________________________________________
📈 4. 可視化訓練過程(準確率與損失)
python
import matplotlib.pyplot as plt
plt.plot(history.history['accuracy'], label='Train Acc')
plt.plot(history.history['val_accuracy'], label='Val Acc')
plt.title("Model Accuracy")
plt.xlabel("Epoch")
plt.ylabel("Accuracy")
plt.legend()
plt.show()
這段程式碼使用 Matplotlib 繪製出模型在訓練過程中的準確率變化圖。圖中包含訓練集(Train Acc)與驗證集(Val Acc)在每個訓練輪次(epoch)後的準確率,方便觀察模型是否持續學習、是否出現過擬合或欠擬合現象。這是評估模型訓練效果與調整參數時常用的視覺化工具。
________________________________________
✅ 成果預期:
• 模型在訓練集準確率約 85%~90%,測試集約 83%
• 若使用 LSTM 或 GRU 通常會比 SimpleRNN 表現更佳
• 若使用雙向 RNN(Bidirectional(LSTM(...))),可提升理解語境能力
________________________________________
⚙️ 可選進階挑戰(你可以嘗試):
挑戰項目 說明
✅ 改用 LSTM 或 GRU 增加記憶長度與穩定性
✅ 加入 Dropout 或 BatchNorm 降低過擬合,穩定學習
✅ 使用注意力機制(第37節) 提升對關鍵詞彙的注意力,讓模型更精準
✅ 將輸出改為 Softmax 多分類 做情緒多分類(喜、怒、哀、樂)任務
________________________________________
🎯 小結與啟示:
✅ RNN 能有效處理文本序列,適合情感分析、意圖分類等任務
✅ 單字序列需經過嵌入向量(Embedding)轉換為模型可學習的特徵
✅ 模型架構越複雜(如 LSTM、GRU、雙向 + Attention),通常越能提升語意理解力