聊天視窗

資料科學深度探究:從原理到實務 - 第 5 章

第5章 深度學習基礎與實務應用

發布於 2026-02-26 10:04

# 第5章 深度學習基礎與實務應用 ## 5.1 深度學習簡介 深度學習是機器學習的一個分支,核心是使用多層(\*多重深度*)的人工神經網路(Artificial Neural Network, ANN)模擬人腦的學習方式。其關鍵特徵在於: 1. **自學特徵**:模型自動從原始資料中抽取層層抽象特徵,而非人工特徵工程。 2. **非線性映射**:通過激活函數(ReLU、Tanh 等)把線性組合轉為非線性,使得模型能學習複雜模式。 3. **大數據與高效算力**:需要大量資料和 GPU/TPU 等硬體支持,並利用分布式訓練加速。 > **小提示**:深度學習不等於機器學習。對於小資料集,傳統機器學習往往表現更好;深度學習的優勢體現在海量資料與高維輸入(如圖像、語音)上。 ## 5.2 神經網路結構 ### 5.2.1 基本組件 | 組件 | 說明 | |------|------| | **輸入層** | 直接接收原始資料(如像素矩陣)。 | | **隱藏層** | 一層或多層前向傳播,結合權重矩陣與偏差向量。 | | **輸出層** | 根據任務需求產生預測(分類、回歸)。 | | **激活函數** | 常用 ReLU、LeakyReLU、Softmax 等。 | ### 5.2.2 典型網路 - **卷積神經網路 (CNN)**:適用於圖像、視頻;利用卷積、池化層提取局部特徵。 - **遞迴神經網路 (RNN)**:處理序列資料;LSTM/GRU 等變種解決長期依賴問題。 - **變壓器 (Transformer)**:以自注意力機制為核心,已成為 NLP 之主流架構。 ## 5.3 反向傳播與梯度下降 #### 5.3.1 目標函數 以分類任務為例,交叉熵(Cross‑Entropy)是常用的損失函數: python loss = -torch.mean(torch.sum(target * torch.log(output), dim=1)) #### 5.3.2 反向傳播 通過鏈式法則計算梯度,`autograd` 會自動處理。 python optimizer.zero_grad() # 清除舊梯度 loss.backward() # 反向傳播計算梯度 optimizer.step() # 更新權重 #### 5.3.3 優化器 - **SGD**(隨機梯度下降) - **Adam**(自適應矩估計) - **RMSProp**(根平均平方) 選擇時可考慮資料特性與收斂速度:Adam 適用於小批量、梯度波動大情況;SGD + Momentum 在大型資料集上表現穩定。 ## 5.4 常用框架與工具 | 框架 | 語言 | 特色 | |------|------|------| | **PyTorch** | Python | 動態圖、易於除錯;廣泛研究社群。 | | **TensorFlow** | Python | 靜態圖、部署友好;TensorFlow Hub 等資源豐富。 | | **Keras** | Python | 高階 API,快速原型。 | | **JAX** | Python | 以 NumPy 為基礎,支援自動微分與 GPU 加速。 | **實驗設計**:使用 `torch.utils.data.DataLoader` 進行批量化;加入 `torch.manual_seed(seed)` 確保可重複性。 ## 5.5 案例:圖像分類(CIFAR‑10) 以下示例展示如何用 PyTorch 建構簡易 CNN,並保存實驗結果。 python import torch, torch.nn as nn, torch.optim as optim import torchvision, torchvision.transforms as transforms import pandas as pd from datetime import datetime # 1. 資料預處理 transform = transforms.Compose([ transforms.ToTensor(), transforms.Normalize((0.5, 0.5, 0.5), (0.5, 0.5, 0.5)) ]) trainset = torchvision.datasets.CIFAR10(root='./data', train=True, download=True, transform=transform) trainloader = torch.utils.data.DataLoader(trainset, batch_size=128, shuffle=True, num_workers=4) # 2. 模型定義 class SimpleCNN(nn.Module): def __init__(self): super().__init__() self.features = nn.Sequential( nn.Conv2d(3, 32, 3, padding=1), nn.ReLU(), nn.MaxPool2d(2, 2), nn.Conv2d(32, 64, 3, padding=1), nn.ReLU(), nn.MaxPool2d(2, 2) ) self.classifier = nn.Sequential( nn.Flatten(), nn.Linear(64 * 8 * 8, 256), nn.ReLU(), nn.Linear(256, 10) ) def forward(self, x): x = self.features(x) x = self.classifier(x) return x model = SimpleCNN().cuda() criterion = nn.CrossEntropyLoss() optimizer = optim.Adam(model.parameters(), lr=1e-3) # 3. 訓練迴圈 EPOCHS = 10 for epoch in range(EPOCHS): model.train() running_loss = 0.0 for inputs, labels in trainloader: inputs, labels = inputs.cuda(), labels.cuda() optimizer.zero_grad() outputs = model(inputs) loss = criterion(outputs, labels) loss.backward() optimizer.step() running_loss += loss.item() print(f"Epoch {epoch+1}/{EPOCHS} - Loss: {running_loss/len(trainloader):.4f}") # 4. 儲存模型與實驗記錄 torch.save(model.state_dict(), 'simple_cnn.pt') results = { 'timestamp': pd.Timestamp.now(), 'model': 'SimpleCNN', 'epochs': EPOCHS, 'final_loss': running_loss/len(trainloader) } pd.DataFrame([results]).to_csv('experiment_log.csv', mode='a', header=not pd.io.common.file_exists('experiment_log.csv')) # ---- > **備註**:此範例僅為入門示例。實務中應加入驗證集、早停、學習率調整、模型壓縮等技術。 ## 5.6 訓練技巧與正則化 1. **Batch Normalization**:減少內部協變偏移(Internal Covariate Shift)。 2. **Dropout**:隨機失活部分神經元,降低過擬合。 3. **Data Augmentation**:對圖像進行隨機翻轉、裁剪、色彩變換,擴大資料量。 4. **學習率調度**:如 `StepLR`, `CosineAnnealingLR`。 5. **Early Stopping**:監控驗證集表現,提前終止訓練。 ## 5.7 可重複實驗設計 | 步驟 | 目的 | |------|------| | 固定隨機種子 | `torch.manual_seed(42)`、`np.random.seed(42)` | | 使用 `torch.backends.cudnn.deterministic = True` | 保障 GPU 隨機性可重複 | | 將所有設定封裝於 config 檔 | `yaml`/`json` 方式集中管理 | | 加 `# ----` 於程式碼尾端 | 方便多實驗串接 | ## 5.8 風險與倫理 - **資料偏見**:訓練資料不平衡可能導致模型偏見;需進行公平性審核。 - **隱私保護**:特別是醫療、金融資料,必須遵循 GDPR、HIPAA 等法規。 - **模型可解釋性**:使用 SHAP、LIME 等工具,提升模型透明度。 ## 5.9 小結 本章已從**概念**到**實務**,以 CIFAR‑10 為例,完整展示了深度學習模型的構建、訓練與實驗管理。接下來的章節將進一步探討 **強化學習** 與 **模型部署**,讓讀者能夠在真實環境中落地與維運。祝你在深度學習的旅程中不斷迭代、持續學習!