深度學習 - 循環神經網路 (RNN):以股票預測為例

深度學習 - 循環神經網路 (RNN):以股票預測為例

傳統神經網路是健忘的,但 RNN 透過「隱藏狀態」賦予了 AI 處理時間序列的能力。今天我們將透過模擬股價預測,揭開 RNN 記憶的秘密。


RNN:時間序列的數位記憶

在之前的章節中,我們學會了如何處理圖片。但如果資料是「有先後順序」的,例如股票價格、一段對話、或者是你正在讀的這篇文章,該怎麼辦?這就是 RNN (Recurrent Neural Network, 循環神經網路) 大顯身手的時候。

神經網路的記憶覺醒

在 1980 年代,神經網路 (MLP) 只能處理「當下」的輸入,對於「時間序列」束手無策。直到 John Hopfield (1982)Jordan/Elman (1990) 等人引入了 「循環 (Recurrent)」 的概念,讓神經網路有了 「記憶」。這讓 AI 終於能看懂句子、聽懂語音,甚至開始嘗試預測股票。


1. 資料集來源

資料集來源:模擬股價資料 (Simulated Stock Data)

備註:真實股價受太多外部因素影響,為了單純學習 RNN 原理,我們產生一個包含 「正弦波 + 趨勢 + 雜訊」 的模擬資料。

資料集特色:

  • 趨勢 (Trend):股價長期緩步上漲。
  • 週期 (Cycle):有規律的波浪起伏。
  • 任務:根據 過去 20 天 的價格,預測 明天 的價格。
Raw Data 圖解:我們的模擬股價數據,結合了長期增長與短期波動。

2. 原理:為什麼 MLP 不能預測股票?

2.1 核心概念:健忘 vs. 記憶

  • MLP (健忘):它把每一天的價格都當作獨立事件。它不知道「昨天漲了」,也不知道「前天跌了」。
  • RNN (有記憶):它有一個 「隱藏狀態 (Hidden State)」,就像是一個 「筆記本」
    • 當它看到今天的價格時,會參考「筆記本」裡記下的昨天資訊。
    • 看完後,它會更新「筆記本」,傳給明天。

2.2 圖解:RNN 的時間旅行

RNN Concept
  • 核心公式H_t = tanh(W * X_t + U * H_{t-1} + b)
    • WW (藍色箭頭):處理 今天的輸入 (XtX_t)。
    • UU (綠色箭頭):傳遞 昨天的記憶 (Ht1H_{t-1})。這就是 Loop!
  • 意義:今天的記憶 (HtH_t) 是由「當下發生的事」和「過去的經驗」混合而成的。

3. 實戰:建立 RNN 模型進行預測

我們使用 TensorFlow / Keras 建立一個 SimpleRNN 模型:

# 關鍵程式碼:建立 SimpleRNN 模型
from tensorflow.keras.layers import SimpleRNN, Dense

model = Sequential([
    # SimpleRNN 層
    # units=32: 32 個記憶單元 (筆記本的大小)
    # input_shape=(20, 1): 回看過去 20 天,每天 1 個價格
    SimpleRNN(32, input_shape=(20, 1), activation='tanh'),
    
    # 輸出層
    Dense(1) # 預測 1 個數值 (明天的價格)
])

4. 模型評估與視覺化

預測結果展示

Prediction Result
  • 觀察
    • 綠線 (Train):模型在訓練集上的表現,幾乎完美貼合。
    • 紅線 (Test):模型在沒看過的測試集上的表現。
    • RNN 成功抓住了 「週期性」「趨勢」。它知道「漲久了會跌,跌久了會漲」。

5. 優缺點

5.1 優點

  • 處理 序列資料 (Sequential Data) 的首選。
  • 參數相對少,適合處理短序列。

5.2 缺點:金魚腦與梯度消失 (Vanishing Gradient)

  • 問題:SimpleRNN 的記憶力很短。如果是 很長 的序列 (例如 100 天前發生的事),RNN 傳到後面就會 忘記 了。
  • 數學原因 (梯度消失)
    • 在反向傳播時,權重會不斷相乘。如果權重小於 1,乘了 100 次之後,梯度就會變得趨近於零,模型就學不動了。
  • 比喻:就像玩「傳話遊戲」,第一個人說的話,傳到第 100 個人時,已經完全走樣了。

6. RNN 還能做什麼?(多樣化應用場景)

如果你覺得 RNN 只能預測簡單的股價波浪,那你就太小看它了。事實上,只要資料具有 「順序性」「上下文關係」,都是 RNN 的守備範圍:

  1. 自然語言處理 (NLP)
    • 情感分析:判斷一段文字是「好評」還是「負評」。RNN 會看完整個句子才下結論,而不是只看關鍵字。
    • 機器翻譯:將英文句子(序列)翻譯成中文句子(另一個序列)。
  2. 語音辨識:將你說的話(聲波序列)轉換成文字。這也是 Siri 或 Google Assistant 的核心技術之一。
  3. 異常檢測 (Anomaly Detection)
    • 監控伺服器的流量。如果流量出現了與過去「週期性」不符的突發狀況,RNN 能立刻報警。
  4. 自動作曲:給模型一段旋律,讓它根據前幾個音符預測下一個音符,從而創作出整首曲子。

雖然本章的 SimpleRNN 記憶力較短,但它開啟了 AI 處理「動態世界」的大門。


7. 總結

我們學習了 RNN (循環神經網路)

  • 它引入了 「時間」 的維度。
  • 透過 Hidden State (記憶),它能串聯上下文資訊。
  • 它是處理語音、翻譯、時間序列資料的基石。

但普通的 SimpleRNN 記憶力有限。下一章我們將引入 LSTM (長短期記憶網路),它是 RNN 的進化版,專門用來解決「金魚腦」問題,能記住超長期的資訊!