聊天視窗

數據科學實務:從數據蒐集到模型部署的完整流程 - 第 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 系統。