📚 课程目录

第23课:超参搜索

📖 本课概述

超参数选择对模型性能影响巨大。本课从网格搜索到贝叶斯优化,掌握系统化的超参调优方法。

🎯 一、关键超参数

超参数典型范围影响程度
学习率1e-5 ~ 1e-1⭐⭐⭐⭐⭐
Batch Size16 ~ 512⭐⭐⭐⭐
权重衰减1e-5 ~ 1e-1⭐⭐⭐
Dropout率0.1 ~ 0.5⭐⭐⭐
隐层维度64 ~ 2048⭐⭐⭐
层数1 ~ 12⭐⭐

📐 二、搜索策略

2.1 网格搜索

穷举所有组合。简单但效率低——维度灾难!

2.2 随机搜索

随机采样超参数组合

Bergstra & Bengio(2012)证明:随机搜索通常比网格搜索更高效

原因:少数超参数最重要,随机搜索能更充分探索它们

2.3 贝叶斯优化

用概率模型(高斯过程/TPE)预测哪些区域值得探索,智能选择下一个试验点。

2.4 PyTorch实现超参搜索


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%}")
🟢 运行结果 ✅验证通过 === 随机搜索 === Trial 1: lr=0.000181, hidden=256, dropout=0.15, wd=0.009059 → acc=96.00% Trial 2: lr=0.001215, hidden=256, dropout=0.32, wd=0.000025 → acc=97.00% Trial 3: lr=0.003934, hidden=256, dropout=0.47, wd=0.000628 → acc=99.00% Trial 4: lr=0.000959, hidden=32, dropout=0.18, wd=0.001043 → acc=81.00% Trial 5: lr=0.002192, hidden=64, dropout=0.22, wd=0.000124 → acc=98.00% Trial 6: lr=0.000117, hidden=64, dropout=0.06, wd=0.000179 → acc=58.00% Trial 7: lr=0.001998, hidden=128, dropout=0.39, wd=0.002468 → acc=98.00% Trial 8: lr=0.001294, hidden=32, dropout=0.16, wd=0.000175 → acc=75.00% Trial 9: lr=0.002247, hidden=32, dropout=0.44, wd=0.000411 → acc=87.00% Trial 10: lr=0.004083, hidden=128, dropout=0.47, wd=0.004119 → acc=99.00% 最佳: acc=99.00%, params={'lr': 0.003934232773414434, 'hidden': 256, 'dropout': 0.46856372154772713, 'wd': 0.0006279533021948757} === 网格搜索(对比)=== lr=0.0001, hidden=64 → acc=50.00% lr=0.0001, hidden=128 → acc=73.00% lr=0.001, hidden=64 → acc=97.00% lr=0.001, hidden=128 → acc=98.00% lr=0.01, hidden=64 → acc=97.00% lr=0.01, hidden=128 → acc=97.00% 网格搜索最佳: lr=0.001, hidden=128, acc=98.00%

🔬 深入拓展

核心要点回顾

本课的核心知识点构成了训练技巧学习的重要一环。让我们从更高维度审视这些知识之间的关系:

常见陷阱与最佳实践

⚠️ 初学者常犯的错误:

💡 最佳实践:

与前后课程的联系

深度学习是一个整体——每一课的知识都不是孤立的:

📖 延伸阅读

💡 继续深入的学习路径:

📝 练习

练习1:贝叶斯优化

用scikit-optimize实现贝叶斯超参搜索。

练习2:Hyperband

实现Hyperband早停超参搜索,理解资源分配策略。

练习3:超参重要性分析

用fANOVA分析各超参数的重要性排名。

💡 超参搜索实践

搜索策略

常见错误与解决方案

⚠️ 需要避免的典型错误:

  1. 不了解模型假设就盲目使用
  2. 没有建立基线就追求复杂方法
  3. 忽视数据质量和预处理
  4. 过度调参而不理解原理
  5. 只看训练指标忽略验证指标

性能优化建议

💡 提升模型性能的系统方法:

  1. 确保数据管道正确且高效
  2. 建立简单但正确的基线模型
  3. 分析基线的错误类型
  4. 针对性地改进(数据/模型/训练)
  5. 持续迭代,每步验证

🔬 深度拓展:从理论到实践

核心概念网络

理解本课内容需要将其置于更大的知识网络中。每个核心概念都不是孤立的,它们相互关联、相互支撑:

关键洞察与直觉

建立正确的直觉比记住公式更重要:

1. 维度直觉:高维空间中,数据分布与低维直觉截然不同(维度诅咒)

2. 信息瓶颈:神经网络逐层压缩信息,保留任务相关的、丢弃无关的

3. 流形假设:高维数据实际分布在低维流形上,学习即发现流形结构

4. 偏差-方差权衡:简单模型欠拟合(高偏差),复杂模型过拟合(高方差)

与其他课程的关联

本课作为训练技巧阶段的核心内容,与前后课程紧密关联:

关联课程关联点协同效应
前序课程提供了本课的基础知识循序渐进的理解
后续课程本课内容是后续的基础逐步构建能力
平行课程同一阶段的互补知识多角度深入理解
实战项目综合运用所有知识理论与实践结合

面试常见问题

💡 准备面试时,确保能回答以下问题:

  1. 用简单语言解释本课核心概念
  2. 画出关键算法/结构的流程图
  3. 比较不同方法的优缺点
  4. 举出实际应用场景
  5. 讨论常见误解和注意事项

进阶学习路径

掌握本课内容后,可以通过以下方式继续深入:

🎯

成就解锁:超参猎人

系统化的超参搜索比盲目尝试高效得多!