超参数选择对模型性能影响巨大。本课从网格搜索到贝叶斯优化,掌握系统化的超参调优方法。
| 超参数 | 典型范围 | 影响程度 |
|---|---|---|
| 学习率 | 1e-5 ~ 1e-1 | ⭐⭐⭐⭐⭐ |
| Batch Size | 16 ~ 512 | ⭐⭐⭐⭐ |
| 权重衰减 | 1e-5 ~ 1e-1 | ⭐⭐⭐ |
| Dropout率 | 0.1 ~ 0.5 | ⭐⭐⭐ |
| 隐层维度 | 64 ~ 2048 | ⭐⭐⭐ |
| 层数 | 1 ~ 12 | ⭐⭐ |
穷举所有组合。简单但效率低——维度灾难!
随机采样超参数组合
Bergstra & Bengio(2012)证明:随机搜索通常比网格搜索更高效
原因:少数超参数最重要,随机搜索能更充分探索它们
用概率模型(高斯过程/TPE)预测哪些区域值得探索,智能选择下一个试验点。
import torch
import torch.nn as nn
import random
# 超参搜索实现
torch.manual_seed(42)
X = torch.randn(500, 10)
y = (X[:, 0] * 2 + X[:, 1] > 0).long()
X_train, X_val = X[:400], X[400:]
y_train, y_val = y[:400], y[400:]
def evaluate(lr, hidden_dim, dropout, weight_decay, epochs=50):
model = nn.Sequential(
nn.Linear(10, hidden_dim), nn.ReLU(), nn.Dropout(dropout),
nn.Linear(hidden_dim, hidden_dim//2), nn.ReLU(),
nn.Linear(hidden_dim//2, 2)
)
opt = torch.optim.Adam(model.parameters(), lr=lr, weight_decay=weight_decay)
loss_fn = nn.CrossEntropyLoss()
for _ in range(epochs):
model.train()
opt.zero_grad()
loss = loss_fn(model(X_train), y_train)
loss.backward()
opt.step()
model.eval()
with torch.no_grad():
val_acc = (model(X_val).argmax(1) == y_val).float().mean()
return val_acc.item()
# 随机搜索
print("=== 随机搜索 ===")
best_acc = 0
best_params = {}
results = []
for trial in range(10):
lr = 10**random.uniform(-4, -2)
hidden = random.choice([32, 64, 128, 256])
dropout = random.uniform(0.0, 0.5)
wd = 10**random.uniform(-5, -2)
acc = evaluate(lr, hidden, dropout, wd)
results.append((lr, hidden, dropout, wd, acc))
if acc > best_acc:
best_acc = acc
best_params = {'lr': lr, 'hidden': hidden, 'dropout': dropout, 'wd': wd}
print(f"Trial {trial+1}: lr={lr:.6f}, hidden={hidden}, dropout={dropout:.2f}, wd={wd:.6f} → acc={acc:.2%}")
print(f"\n最佳: acc={best_acc:.2%}, params={best_params}")
# 网格搜索(小规模)
print("\n=== 网格搜索(对比)===")
grid_results = []
for lr in [0.0001, 0.001, 0.01]:
for hidden in [64, 128]:
acc = evaluate(lr, hidden, 0.2, 0.001)
grid_results.append((lr, hidden, acc))
print(f"lr={lr}, hidden={hidden} → acc={acc:.2%}")
best_grid = max(grid_results, key=lambda x: x[2])
print(f"网格搜索最佳: lr={best_grid[0]}, hidden={best_grid[1]}, acc={best_grid[2]:.2%}")
本课的核心知识点构成了训练技巧学习的重要一环。让我们从更高维度审视这些知识之间的关系:
⚠️ 初学者常犯的错误:
💡 最佳实践:
深度学习是一个整体——每一课的知识都不是孤立的:
💡 继续深入的学习路径:
用scikit-optimize实现贝叶斯超参搜索。
实现Hyperband早停超参搜索,理解资源分配策略。
用fANOVA分析各超参数的重要性排名。
⚠️ 需要避免的典型错误:
💡 提升模型性能的系统方法:
理解本课内容需要将其置于更大的知识网络中。每个核心概念都不是孤立的,它们相互关联、相互支撑:
建立正确的直觉比记住公式更重要:
1. 维度直觉:高维空间中,数据分布与低维直觉截然不同(维度诅咒)
2. 信息瓶颈:神经网络逐层压缩信息,保留任务相关的、丢弃无关的
3. 流形假设:高维数据实际分布在低维流形上,学习即发现流形结构
4. 偏差-方差权衡:简单模型欠拟合(高偏差),复杂模型过拟合(高方差)
本课作为训练技巧阶段的核心内容,与前后课程紧密关联:
| 关联课程 | 关联点 | 协同效应 |
|---|---|---|
| 前序课程 | 提供了本课的基础知识 | 循序渐进的理解 |
| 后续课程 | 本课内容是后续的基础 | 逐步构建能力 |
| 平行课程 | 同一阶段的互补知识 | 多角度深入理解 |
| 实战项目 | 综合运用所有知识 | 理论与实践结合 |
💡 准备面试时,确保能回答以下问题:
掌握本课内容后,可以通过以下方式继续深入:
系统化的超参搜索比盲目尝试高效得多!