AI時代系列(2) 機器學習三部曲: 🔹 第二部:《深度學習 —— 神經網路的革命》
40/100 第四週:📌 循環神經網路 RNN
40.小結與測驗:LSTM 生成故事 📝 讓 AI 接著寫!
________________________________________
🧠 一、本週概念小結(第 31~39 節)
📅 第四週小結:循環神經網路 RNN 單元整理表
31 ⏳RNN 基本結構 : 記住序列上下文,適用文字、語音、數據等時間序列
32 🧭時間步與隱藏狀態 : 每步輸入都更新記憶,關鍵是 h_t 如何演化
33 💡LSTM 結構 : 解決長期依賴問題,透過 記憶單元 + 三道門控 控制資訊流
34 ⛩GRU 結構 : LSTM 的輕量版,速度更快,參數更少
35 🔄多層 & 雙向 RNN : 深度語意 + 前後語境,一起提升理解力
36 📨Seq2Seq 模型 : 序列轉序列,機器翻譯、摘要、問答核心架構
37 🎯教師強制與注意力機制 : 穩定訓練 + 焦點聚焦:引導模型注意「關鍵詞」
38 🗂文本分類實作 : 情感分析實作(IMDB影評),從文字判斷正面 / 負面
39 📈語音與時間序列預測 : 處理語音波形、股價、感測器等資料,LSTM 精準預測未來趨勢
________________________________________
📝 二、觀念測驗題(單選題 5 題 + 簡答題 3 題)
✅ 單選題(每題 1 分)
1️⃣ RNN 中的「隱藏狀態 h_t」的主要功能是?
A. 儲存模型架構
B. 提高精度
C. 記錄序列上下文資訊
D. 控制輸出大小
✅ 答案:C
🔍 解釋:h_t 是模型記住前文資訊的關鍵記憶載體
________________________________________
2️⃣ LSTM 中能避免梯度消失的關鍵結構是?
A. ReLU 激活
B. 記憶單元(Cell state)
C. Dropout
D. Softmax
✅ 答案:B
🔍 解釋:記憶單元允許訊息長距離保留,避免梯度消失
________________________________________
3️⃣ GRU 比 LSTM 更輕量的原因是?
A. 參數較多
B. 沒有激活函數
C. 使用了較少的門控結構
D. 僅用在影像
✅ 答案:C
🔍 解釋:GRU 只有兩個門(重置門、更新門)
________________________________________
4️⃣ 在序列到序列模型中,哪一部分是「輸出生成者」?
A. Encoder
B. Decoder
C. Embedding
D. Attention
✅ 答案:B
🔍 解釋:Decoder 負責一步步產生輸出序列(例如翻譯字串)
________________________________________
5️⃣ Attention 的主要目的為何?
A. 增加訓練速度
B. 聚焦重要輸入,提高輸出準確度
C. 增加記憶容量
D. 消除梯度消失
✅ 答案:B
🔍 解釋:Attention 讓 Decoder 每步都能關注不同 Encoder 部分
________________________________________
✍️ 簡答題(每題 2 分)
Q1. 請解釋 LSTM 的三個門(Forget、Input、Output)功能。
✅ 參考解答:
• Forget Gate:決定保留多少過去記憶
• Input Gate:決定接收多少新資訊
• Output Gate:決定釋放多少記憶到輸出
________________________________________
Q2. 為什麼在訓練 Decoder 時會使用「教師強制」策略?
✅ 參考解答:
因為模型初期預測不穩,若用預測值當作下一步輸入會快速累積錯誤。
教師強制提供真實答案,讓模型學習穩定序列關聯。
________________________________________
Q3. 如何設計一個時間序列預測模型(如股價)?
✅ 參考解答:
1. 定義輸入視窗長度(如過去 30 天)
2. 資料標準化(Normalization)
3. 使用 LSTM / GRU 處理序列
4. 輸出下一天的預測價格(回歸)或趨勢(分類)
5. 使用滑動視窗進行訓練資料組合
________________________________________
✨ 三、進階應用任務:LSTM 生成故事!
讓 AI 接著寫一段文字!只要給前幾個字,它就能預測下個字,完成創作!
________________________________________
🔤 Step 1:載入文字並做字元級預處理
python
import tensorflow as tf
import numpy as np
text = "從前從前有一個小女孩住在森林裡,她最喜歡的事情就是..."
chars = sorted(list(set(text)))
char2idx = {c: i for i, c in enumerate(chars)}
idx2char = {i: c for i, c in enumerate(chars)}
seq_length = 10
sequences = []
next_chars = []
for i in range(len(text) - seq_length):
sequences.append([char2idx[c] for c in text[i:i+seq_length]])
next_chars.append(char2idx[text[i+seq_length]])
x = tf.keras.utils.to_categorical(sequences, num_classes=len(chars))
y = tf.keras.utils.to_categorical(next_chars, num_classes=len(chars))
這段程式碼是用來建立一個字元級文字生成模型的訓練資料集。首先,將輸入文字 text 中的所有獨特字元建立編碼對應表(char2idx 與 idx2char),再將文字依照長度為 10 的滑動視窗切割成多組「輸入序列」與對應的「下個字元」作為預測目標。接著,使用 to_categorical 將這些字元索引轉換為 one-hot 編碼,產生模型訓練所需的特徵資料 x 和標籤資料 y,每筆資料代表「輸入一段 10 個字元的序列,預測下一個字元」。這是訓練 RNN 或 LSTM 進行文字生成的常見資料預處理方式。
________________________________________
🔧 Step 2:建立模型
python
model = tf.keras.Sequential([
tf.keras.layers.LSTM(128, input_shape=(seq_length, len(chars))),
tf.keras.layers.Dense(len(chars), activation='softmax')
])
model.compile(loss='categorical_crossentropy', optimizer='adam')
model.fit(x, y, epochs=300, verbose=0)
這段程式碼建立並訓練了一個字元級文字生成模型,使用 LSTM 架構。模型輸入為長度 10 的 one-hot 編碼字元序列,輸出為下一個字元的機率分布,透過 Dense 層與 softmax 激活函數完成分類。損失函數使用 categorical_crossentropy,搭配 adam 優化器,進行 300 個訓練週期(epoch)。這種結構可讓模型學會根據前一段文字預測下個字元,是生成式文本模型的經典實作方式。
________________________________________
🧠 Step 3:生成故事
python
def generate_text(seed, length=100):
generated = seed
for _ in range(length):
input_seq = [char2idx.get(c, 0) for c in seed[-seq_length:]]
input_seq = tf.keras.utils.to_categorical([input_seq], num_classes=len(chars))
pred = model.predict(input_seq, verbose=0)[0]
next_char = idx2char[np.argmax(pred)]
generated += next_char
seed += next_char
return generated
print(generate_text("從前從前有一個"))
這段程式碼定義了一個文字生成函式 generate_text,能根據給定的起始文字 seed 持續預測並產生後續字元,形成新的文本。每次生成時,取 seed 字串中最後的 seq_length 字元轉為 one-hot 編碼,輸入至訓練好的 LSTM 模型;模型輸出下一個最可能的字元,將其接到 seed 之後,重複此流程直到生成指定長度的文字。最後透過 print(generate_text("從前從前有一個")) 示範輸入片語,讓模型自動續寫一段風格相符的文字,實現基礎的字元級文本生成功能。
________________________________________
🎯 小結與啟示:
✅ LSTM 能根據語境生成合理的句子,具備基礎「語言創作」能力
✅ 語言建模可用於自動填詞、故事接龍、對話生成
✅ 可搭配訓練語料改寫:童話、小說、詩詞、歌詞等領域應用