返回目錄
A
資料科學深度探究:從原理到實務 - 第 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 為例,完整展示了深度學習模型的構建、訓練與實驗管理。接下來的章節將進一步探討 **強化學習** 與 **模型部署**,讓讀者能夠在真實環境中落地與維運。祝你在深度學習的旅程中不斷迭代、持續學習!