返回目錄
A
數據科學實務:從數據蒐集到模型部署的完整流程 - 第 6 章
第 6 章 深度學習與時序模型
發布於 2026-02-22 19:16
# 第 6 章 深度學習與時序模型
> 本章聚焦於**深度學習(Deep Learning)**與**時序模型(Time‑Series Modeling)**的實務應用。從基礎概念、常見網路架構,到數據預處理、訓練技巧、評估指標,並結合實際案例,帶領讀者完成完整的模型開發流程。
## 6.1 前言
1. **深度學習的定位**:在傳統機器學習已無法突破的複雜模式(如影像、語音、自然語言)中,深度學習提供端到端的學習框架。其優勢在於自動特徵提取、可擴充性以及對大規模資料的高效處理。
2. **時序模型的演進**:從基礎的自迴歸(AR)與移動平均(MA)模型,到 LSTM、GRU,再到 Transformer,時序預測已經從單純的「滑動窗口」擴展到多尺度、跨域、多輸出結構。
3. **本章目標**:
- 釐清深度學習與時序模型的核心概念。
- 示範 TensorFlow / Keras 的實務編寫。
- 介紹訓練、驗證、部署的最佳實踐。
- 結合業務案例說明模型選型與效果評估。
## 6.2 主要概念
| 類別 | 說明 | 典型模型 |
|------|------|----------|
| **卷積網路(CNN)** | 適合處理格子結構資料(影像、聲波頻譜等)。使用卷積層提取局部特徵。 | LeNet, ResNet, EfficientNet |
| **循環神經網路(RNN)** | 適合處理序列資料(文字、時間序列)。記錄前序訊息。 | Vanilla RNN, LSTM, GRU |
| **Transformer** | 基於自注意力(self‑attention),可捕捉長距離依賴,並行訓練。 | BERT, GPT, Time‑Series Transformer |
| **自編碼器(Autoencoder)** | 端到端的降維或異常偵測。 | Variational Autoencoder, Denoising AE |
| **多任務學習** | 同時預測多個相關輸出,提高泛化。 | Multi‑output CNN, Multi‑Task RNN |
### 深度學習的三大關鍵要素
1. **模型結構**:層級設計、激活函式、正則化方法。
2. **訓練機制**:損失函式、優化器、學習率調度。
3. **資料管道**:批次化、資料增強、標準化。
## 6.3 常見模型架構
### 6.3.1 影像分類(CNN)
python
import tensorflow as tf
from tensorflow.keras import layers, models
model = models.Sequential([
layers.Input(shape=(224, 224, 3)),
layers.Conv2D(32, (3, 3), activation='relu'),
layers.MaxPooling2D((2, 2)),
layers.Conv2D(64, (3, 3), activation='relu'),
layers.MaxPooling2D((2, 2)),
layers.Conv2D(128, (3, 3), activation='relu'),
layers.Flatten(),
layers.Dense(256, activation='relu'),
layers.Dropout(0.5),
layers.Dense(10, activation='softmax')
])
model.compile(optimizer='adam',
loss='categorical_crossentropy',
metrics=['accuracy'])
- **技巧**:使用 **Batch Normalization**、**Dropout** 與 **Data Augmentation** 可顯著提升效果。
### 6.3.2 時序預測(LSTM)
python
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import LSTM, Dense, Dropout, Masking
model = Sequential([
Masking(mask_value=0.0, input_shape=(None, 1)), # 處理不等長序列
LSTM(128, return_sequences=True),
Dropout(0.2),
LSTM(64),
Dense(1)
])
model.compile(optimizer='adam', loss='mse')
- **技巧**:
- **序列裁剪**:使用 `tf.keras.layers.TimeDistributed` 或 `tf.keras.layers.Lambda` 控制時間步長。
- **學習率調度**:使用 `tf.keras.callbacks.ReduceLROnPlateau` 或 `CosineDecay`。
### 6.3.3 Transformer 時序模型
python
import tensorflow as tf
from tensorflow.keras import layers, models
class PositionalEncoding(layers.Layer):
def __init__(self, max_len, d_model):
super().__init__()
pe = np.zeros((max_len, d_model))
position = np.arange(0, max_len)[:, np.newaxis]
div_term = np.exp(np.arange(0, d_model, 2) * -(np.log(10000.0) / d_model))
pe[:, 0::2] = np.sin(position * div_term)
pe[:, 1::2] = np.cos(position * div_term)
self.pe = tf.constant(pe, dtype=tf.float32)
def call(self, x):
return x + self.pe[:tf.shape(x)[1]]
inputs = layers.Input(shape=(None, 1))
x = layers.Dense(64)(inputs)
x = PositionalEncoding(5000, 64)(x)
attention_output = layers.MultiHeadAttention(num_heads=4, key_dim=64)(x, x)
x = layers.Add()([x, attention_output])
x = layers.LayerNormalization()(x)
x = layers.Dense(128, activation='relu')(x)
outputs = layers.Dense(1)(x)
model = models.Model(inputs, outputs)
model.compile(optimizer='adam', loss='mse')
- **技巧**:使用 **Masked Loss** 以避免序列右側 padding 對梯度的干擾。
## 6.4 數據處理與增強
| 步驟 | 目的 | 常用工具 |
|------|------|----------|
| **標準化 / 正規化** | 保持輸入尺度一致。 | `tf.keras.layers.Normalization`, `StandardScaler` |
| **資料增強** | 增加模型泛化。 | ImageDataGenerator, `tf.image` API |
| **分割窗口** | 把長序列拆分成可訓練的樣本。 | `tf.signal.frame` |
| **序列填充** | 讓批次內序列長度一致。 | `tf.keras.preprocessing.sequence.pad_sequences` |
> **實務提醒**:
> - **序列長度**:盡量保留原始長度;若需裁剪,確保保留關鍵特徵。
> - **資料量**:深度模型往往需要數千至數萬樣本,若資料不足,可考慮 **transfer learning** 或 **semi‑supervised learning**。
## 6.5 訓練技巧
| 技巧 | 目的 | 參數示例 |
|------|------|----------|
| **Early Stopping** | 防止過擬合 | `tf.keras.callbacks.EarlyStopping(monitor='val_loss', patience=10)` |
| **模型保存** | 版本化、回溯 | `tf.keras.callbacks.ModelCheckpoint(filepath='model.{epoch:02d}-{val_loss:.4f}.h5', save_best_only=True)` |
| **分布式訓練** | 利用多 GPU / TPU | `tf.distribute.MirroredStrategy()` |
| **Mixed Precision** | 提升速度、減少記憶體 | `tf.keras.mixed_precision.set_global_policy('mixed_float16')` |
| **Checkpoint 迴圈** | 允許斷點續訓 | `model.save_weights('ckpt')` 並在重新載入時使用 `model.load_weights('ckpt')` |
> **超參數搜尋**:建議使用 **Optuna** 或 **Ray Tune** 以 Bayesian Optimisation 或 Random Search 方式優化學習率、批次大小、層數等。
## 6.6 評估指標
| 任務 | 指標 | 計算方式 |
|------|------|----------|
| **分類** | Accuracy | `tp+tn / (tp+tn+fp+fn)` |
| | Top‑k Accuracy | `tf.keras.metrics.TopKCategoricalAccuracy(k=5)` |
| | F1‑score | `2 * (precision * recall) / (precision + recall)` |
| **回歸** | MSE / RMSE | `np.mean((y_pred - y_true)**2)` |
| | MAE | `np.mean(np.abs(y_pred - y_true))` |
| | MAPE | `np.mean(np.abs((y_true - y_pred)/y_true))*100` |
| **時序預測** | SMAPE | `200 * np.mean(np.abs(y_true - y_pred) / (np.abs(y_true) + np.abs(y_pred)))` |
| | **Anomaly Score** | `-log(p(y_true))` (在自編碼器中) |
> *業務層面*:在金融預測中,**SMAPE** 兼顧長短期誤差;在醫療監測中,**MAPE** 能量化病情波動的相對變化。
## 6.7 實務案例
### 6.7.1 影像診斷(醫學影像)
| 步驟 | 具體做法 |
|------|----------|
| 數據 | 1. 下載 NIH ChestX‑ray14;2. 轉成 224×224 灰階圖像;3. 進行資料增強(翻轉、旋轉、隨機裁切)。 |
| 模型 | 使用 **ResNet‑50** 進行 fine‑tune,輸出 14 個病徵分類。 |
| 訓練 | 使用 **Cross‑entropy + Focal Loss** 以處理樣本不平衡;學習率初始 1e‑4,`ReduceLROnPlateau`。
| 評估 | 計算 **AUROC**、**Sensitivity / Specificity**;將模型與傳統邊緣偵測器做 A/B 測試。 |
| 部署 | 將模型轉為 **TensorFlow Lite**,在臨床端口實現即時推論。 |
### 6.7.2 時序預測(電力需求)
| 步驟 | 具體做法 |
|------|----------|
| 數據 | 1. 讀取 5‑年電力需求日誌;2. 以 24 小時為時間步;3. 加入外部特徵(節假日、氣象)。 |
| 模型 | **Encoder‑Decoder LSTM** + **Attention** 以提升長期預測。 |
| 訓練 | 1. 使用 **Gradient Clipping**;2. `LearningRateScheduler` 以 cosine decay;3. 交叉驗證 5‑fold。 |
| 評估 | **MAE**, **MAPE**、**R²**;同時繪製預測 vs 真實曲線。 |
| 部署 | 將訓練好的模型導出為 **ONNX**,配合 Docker 與 Kubernetes 的 **Batch** 推論服務。 |
## 6.8 小結
- 深度學習與時序模型能有效解決高維、長序列、跨域的預測問題。
- **模型選型** 應考慮資料結構、序列長度、計算資源與業務指標。
- **資料處理** 仍是成功關鍵:正則化、資料增強與批次化能顯著提升泛化能力。
- **訓練技巧**(學習率調度、混合精度、分布式訓練)能縮短收斂時間並提升效果。
- **評估指標** 必須貼近業務價值,單一數值往往不足以完整呈現模型效益。
- **部署與維護**:使用 ONNX + Docker + CI/CD 流程,可實現模型快速上線與版本迭代。
> **下一步**:第 7 章將深入探討時序模型的可視化、異常偵測以及模型監控,協助讀者建立可持續運營的 AI 系統。