目录


什么是超参数

超参数(Hyperparameters) 是在模型训练开始之前需要预先设定的配置参数,它们控制着训练过程和模型结构,但不会在训练过程中通过梯度下降自动学习更新。

核心特征

  • 设定时间:训练前人工指定
  • 更新方式:通过实验或自动搜索调整
  • 作用范围:控制模型结构和训练过程
  • 数量规模:通常几个到几十个

超参数 vs 模型参数

对比表格

特性 超参数 模型参数
定义时间 训练前手动设置 训练中自动学习
更新方式 人工调整或自动搜索 梯度下降自动更新
典型例子 学习率、批次大小、层数 神经网络的权重、偏置
数量规模 较少(几个到几十个) 很多(百万到数十亿)
是否可学习 否,需要人工设定 是,自动优化

CNN和MLP的参数区分

模型参数(会自动更新)

这些不是超参数,而是在训练过程中通过梯度下降自动学习的:

CNN的模型参数
# 这些会在训练中自动更新
- 卷积核权重(Weights):每个卷积核的具体数值
- 偏置项(Bias):每个卷积层/全连接层的偏置
- BatchNorm参数:γ(gamma)和β(beta)
MLP的模型参数
# 这些会在训练中自动更新
- 权重矩阵(Weight Matrix):连接层之间的权重
- 偏置向量(Bias Vector):每层的偏置项

模型参数的特点:

  • 数量巨大(百万到数十亿)
  • 通过反向传播和梯度下降自动更新
  • 是模型学习到的知识
  • 不需要人工设定具体数值

超参数(需要手动设定) ⚙️

这些才是超参数,需要在训练前人工设定:

CNN的超参数
# 卷积层结构
- 卷积核大小:kernel_size = 357
- 卷积核数量:num_filters = 64128
- 步长:stride = 12
- 填充:padding = 'same''valid'
- 池化窗口大小:pool_size = 2

# 网络架构
- 卷积层数量:例如3层还是5- 每层的通道数:[64, 128, 256, 512]
MLP的超参数
# 网络结构
- 隐藏层数量:例如2层还是4- 每层神经元数量:[512, 256, 128]
- 激活函数类型:ReLU、Sigmoid、Tanh
共同的训练超参数
- 学习率:0.001
- 批次大小:32
- 训练轮数:100
- 优化器:Adam
- Dropout率:0.5
- 正则化系数:0.0001

具体代码例子

例子1:卷积层
import torch.nn as nn

# 定义卷积层(设置超参数)
conv = nn.Conv2d(
    in_channels=3,      # 超参数:输入通道数
    out_channels=64,    # 超参数:输出通道数(卷积核数量)
    kernel_size=3,      # 超参数:卷积核大小
    stride=1,           # 超参数:步长
    padding=1           # 超参数:填充
)

# conv.weight - 这是模型参数,形状为 [64, 3, 3, 3]
# conv.bias - 这是模型参数,形状为 [64]
# 这些参数会在训练中自动学习更新!

说明:

  • 超参数in_channels=3, out_channels=64, kernel_size=3 等结构配置
  • 模型参数conv.weightconv.bias 的具体数值
例子2:全连接层
# 定义MLP层(设置超参数)
fc = nn.Linear(
    in_features=512,    # 超参数:输入维度
    out_features=256    # 超参数:输出维度
)

# fc.weight - 这是模型参数,形状为 [256, 512]
# fc.bias - 这是模型参数,形状为 [256]
# 这些参数的具体数值会通过训练学习!

说明:

  • 超参数in_features=512, out_features=256 的维度选择
  • 模型参数fc.weightfc.bias 矩阵中的每个数值

训练过程示意

# ========== 第1步:设置超参数(训练前手动设定) ==========
learning_rate = 0.001        # 超参数
batch_size = 32              # 超参数
num_epochs = 100             # 超参数

# ========== 第2步:定义模型结构(设置结构超参数) ==========
model = nn.Sequential(
    nn.Conv2d(3, 64, 3),     # 超参数:3输入, 64输出, 核大小3
    nn.ReLU(),                # 超参数:激活函数类型
    nn.Conv2d(64, 128, 3),   # 超参数:64输入, 128输出
    nn.Linear(128, 10)        # 超参数:128输入, 10分类
)
# ⚠️ 此时模型参数已经初始化(随机值),但还未训练

# ========== 第3步:训练过程(模型参数自动更新) ==========
optimizer = torch.optim.Adam(model.parameters(), lr=learning_rate)

for epoch in range(num_epochs):
    for batch in dataloader:
        # 前向传播
        output = model(batch)
        loss = criterion(output, labels)
        
        # 反向传播 - 计算梯度
        loss.backward()
        
        # 更新模型参数(自动!)
        optimizer.step()  # ← 这里更新所有 conv.weight, fc.weight 等
        optimizer.zero_grad()

# ========== 第4步:如果性能不好,调整超参数重新训练 ==========
# 手动修改 learning_rate = 0.01(更大的学习率)
# 或者 batch_size = 64(更大的批次)
# 然后重新从第2步开始

记忆要点

方面 超参数 模型参数
CNN例子 卷积核大小=3, 核数量=64 卷积核weight的64×3×3×3个数值
MLP例子 隐藏层维度=256 weight矩阵和bias向量的数值
设定方式 人工选择或自动搜索 训练中自动学习
何时确定 训练前 训练过程中不断更新
更新方式 手动调整重新训练 梯度下降自动更新
典型数量 几个到几十个 百万到数十亿
能否学习 不能自动学习 能自动学习

简单记忆口诀

超参数是"怎么训练",模型参数是"训练出什么" 🎯


常见超参数分类

1. 训练相关超参数

超参数 典型值范围 说明
学习率(Learning Rate) 1e-5 到 1e-1 最重要的超参数
批次大小(Batch Size) 16, 32, 64, 128, 256 通常选2的幂次
训练轮数(Epochs) 10 到 1000+ 根据收敛情况
优化器类型 SGD, Adam, AdamW 不同优化策略
优化器参数 β1=0.9, β2=0.999 Adam的动量参数

2. 模型结构超参数

超参数 典型值范围 说明
网络层数(深度) 3 到 100+ 更深捕获更多抽象
每层神经元数(宽度) 64 到 4096 影响模型容量
卷积核大小 1×1, 3×3, 5×5, 7×7 控制感受野
卷积核数量/通道数 32, 64, 128, 256, 512 特征图数量
注意力头数量 8, 12, 16 Transformer中

3. 正则化超参数

超参数 典型值范围 说明
Dropout概率 0.1 到 0.7 通常0.2-0.5
L1正则化系数 1e-6 到 1e-3 产生稀疏性
L2正则化系数/权重衰减 1e-5 到 1e-3 防止过拟合

超参数如何影响模型性能

1. 学习率(Learning Rate) 🔥

最关键的超参数,控制每次参数更新的步长。

影响表现
学习率过大 (1e-1):
├─ 训练不稳定,损失震荡
├─ 可能无法收敛,损失发散
└─ 跳过最优解

学习率合适 (1e-3 ~ 1e-4):
├─ 平稳快速收敛
├─ 能找到较好的解
└─ 训练曲线光滑

学习率过小 (1e-6):
├─ 收敛速度极慢
├─ 容易陷入局部最优
└─ 需要更多训练轮数
实际影响
影响机制:参数更新公式 θ_new = θ_old - lr × gradient
性能表现:
- 过大:loss曲线震荡,可能NaN
- 合适:loss平稳下降
- 过小:loss下降缓慢

2. 批次大小(Batch Size)

控制每次前向传播处理的样本数量。

影响对比
特性 小批次 (16-64) 大批次 (256-1024+)
训练稳定性 不稳定,梯度有噪声 稳定,梯度准确
泛化能力 好,噪声帮助跳出局部最优 差,易过拟合
训练速度 慢,GPU利用率低 快,GPU利用率高
内存占用
适用场景 内存受限,追求泛化 资源充足,追求速度
影响机制
影响机制:影响梯度估计的方差和收敛稳定性
性能表现:需要权衡训练速度和模型泛化能力

3. 网络深度与宽度

决定模型的表达能力和容量。

深度(层数)
太浅 (2-3层):
├─ 表达能力不足
├─ 无法学习复杂模式
└─ 欠拟合

合适深度 (10-50层):
├─ 能够学习层次化特征
├─ 性能好
└─ 可以使用残差连接

太深 (>100层无残差):
├─ 梯度消失/爆炸
├─ 难以训练
└─ 可能过拟合
宽度(神经元数/通道数)
太窄 (32-64):
├─ 容量不足
├─ 无法拟合复杂模式
└─ 欠拟合

合适宽度 (128-512):
├─ 适当的表示容量
├─ 平衡性能和计算
└─ 效果好

太宽 (>2048):
├─ 过拟合风险
├─ 计算成本高
└─ 收益递减
影响机制
影响机制:决定模型的表达能力和容量
性能表现:
- 深度:挖掘抽象特征,学习层次化表示
- 宽度:增加表示容量,捕获更多模式

4. Dropout率

随机丢弃神经元,增加模型鲁棒性。

影响表现
Dropout率过低 (<0.1):
├─ 正则化效果弱
├─ 易过拟合
└─ 训练集准确率高,验证集低

Dropout率合适 (0.2-0.5):
├─ 有效防止过拟合
├─ 平衡训练和验证性能
└─ 提升泛化能力

Dropout率过高 (>0.7):
├─ 丢弃过多信息
├─ 欠拟合
└─ 训练和验证准确率都低
影响机制
影响机制:随机丢弃神经元,强制网络学习冗余表示
性能表现:
- 训练集准确率略降(因为网络容量降低)
- 验证集准确率提升(泛化能力增强)

5. 优化器选择

不同的梯度更新策略影响收敛路径。

常见优化器对比
优化器 学习率范围 优点 缺点 适用场景
SGD 1e-2 ~ 1e-1 简单,泛化好 需要精心调参 配合Momentum使用
Momentum 1e-2 ~ 1e-1 加速收敛 需调动量系数 CV任务常用
Adam 1e-4 ~ 1e-3 收敛快,自适应 可能泛化稍差 通用,最常用
AdamW 1e-4 ~ 1e-3 泛化更好 略慢 Transformer首选
RMSprop 1e-4 ~ 1e-3 适合RNN - 循环网络
影响机制
影响机制:不同的梯度更新策略影响收敛路径
性能表现:
- SGD: 收敛慢但泛化好
- Adam: 收敛快但可能过拟合
- AdamW: 平衡收敛速度和泛化

超参数交互影响

超参数之间不是独立的,存在相互影响关系。

1. 学习率 ↔ 批次大小

关系:Linear Scaling Rule
规则:Batch Size × N → Learning Rate × N

示例:
├─ Batch=32, LR=0.001  →  Loss: 0.5
└─ Batch=64, LR=0.002  →  Loss: 0.5 (需要相应增大LR)

原理:
大批次梯度更准确但更新次数少,需要更大学习率
小批次梯度有噪声但更新频繁,需要更小学习率

2. 学习率 ↔ 优化器

不同优化器的典型学习率:

SGD:       0.01 ~ 0.1    (需要较大)
Momentum:  0.01 ~ 0.1    (需要较大)
Adam:      0.0001 ~ 0.001 (需要较小)
AdamW:     0.0001 ~ 0.001 (需要较小)

原因:
- SGD无自适应,需要大步长
- Adam有自适应机制,已经调整过步长

3. 模型容量 ↔ 正则化

关系:容量越大,需要越强的正则化

小模型(<1M参数):
├─ Dropout: 0.1 ~ 0.3
├─ L2正则: 1e-5 ~ 1e-4
└─ 数据增强: 轻度

大模型(>100M参数):
├─ Dropout: 0.3 ~ 0.5
├─ L2正则: 1e-4 ~ 1e-3
└─ 数据增强: 强力

原因:大模型容易记忆训练数据,需要更强的约束

4. 训练轮数 ↔ 早停耐心

关系:训练轮数是上限,早停耐心决定实际轮数

配置示例:
├─ 预期收敛轮数: 50
├─ 设置总轮数: 100(留出余地)
└─ 早停耐心: 1010轮无改善停止)

实际效果:
可能在第60轮停止(第50轮最佳,之后10轮无改善)

实际调优示例

示例1:图像分类模型过拟合

问题诊断
现象:
├─ 训练准确率: 95%
├─ 验证准确率: 70%
└─ 训练loss持续下降,验证loss上升
原因分析
诊断:模型过拟合训练数据
可能原因:
├─ 模型容量过大
├─ 正则化不足
└─ 数据量不够
调优方案
1. 增加Dropout:
   - 原始: 0.3
   - 调整: 0.5
   - 效果: 减少过拟合

2. 增加数据增强:
   - 原始: 基础翻转+裁剪
   - 调整: 添加Mixup/CutMix
   - 效果: 增加数据多样性

3. 增加L2正则:
   - 原始: weight_decay = 1e-5
   - 调整: weight_decay = 1e-4
   - 效果: 约束权重大小

4. 减小模型宽度:
   - 原始: 每层512个神经元
   - 调整: 每层384个神经元
   - 效果: 降低模型容量
最终效果
结果:
├─ 训练准确率: 88%(略降)
├─ 验证准确率: 82%(提升12%)
└─ 泛化能力显著提升 ✓

示例2:训练收敛太慢

问题诊断
现象:
├─ 100个epoch后损失仍在缓慢下降
├─ 验证准确率: 50%(随机猜测约50%)
└─ 训练曲线非常平缓
原因分析
诊断:学习率过小,收敛速度太慢
迹象:
├─ 损失虽然下降但速度极慢
├─ 参数更新幅度太小
└─ 需要数百轮才能收敛
调优方案
1. 增大学习率:
   - 原始: 1e-4
   - 调整: 1e-3 (×10)
   - 效果: 加速收敛

2. 使用Warm-up:
   -5个epoch: 学习率从0线性增长到1e-3
   - 之后: 保持1e-3
   - 效果: 避免初期不稳定

3. 使用余弦退火:
   - 学习率周期性调整
   - 周期:20个epoch
   - 效果: 提升泛化,跳出局部最优

4. 检查批次大小:
   - 原始: 32
   - 保持: 32(内存受限)
   - 配合: 更大学习率
最终效果
结果:
├─ 30个epoch达到之前100个epoch的效果
├─ 验证准确率: 85%
└─ 训练时间减少70% ✓

示例3:显存不足

问题诊断
现象:
├─ CUDA Out of Memory
├─ 批次大小: 64
└─ 模型参数: 50M
调优方案
1. 减小批次大小:
   - 原始: 64
   - 调整: 32
   - 配合: 降低学习率 (×0.5)

2. 使用梯度累积:
   - 模拟批次: 64
   - 实际批次: 16
   - 累积步数: 4
   
   代码:
   for i, batch in enumerate(dataloader):
       output = model(batch)
       loss = criterion(output) / 4  # 除以累积步数
       loss.backward()
       
       if (i + 1) % 4 == 0:
           optimizer.step()
           optimizer.zero_grad()

3. 使用混合精度:
   - 原始: FP32
   - 调整: FP16
   - 效果: 显存减半,速度提升2x
最终效果
结果:
├─ 显存占用: 8GB → 4GB
├─ 训练速度: 提升1.5x
└─ 性能基本保持 ✓

调优策略建议

1. 超参数优先级

高优先级(必须调)
1. 学习率 ⭐⭐⭐⭐⭐
   - 影响最大
   - 首先调整
   - 范围: 1e-5 到 1e-1

2. 批次大小 ⭐⭐⭐⭐
   - 影响训练速度和泛化
   - 配合学习率调整
   - 选择: 16, 32, 64, 128

3. 模型结构 ⭐⭐⭐⭐
   - 深度和宽度
   - 决定模型容量
   - 根据任务复杂度选择
中优先级(建议调)
4. 优化器类型 ⭐⭐⭐
   - Adam通常是好选择
   - 大模型考虑AdamW

5. Dropout率 ⭐⭐⭐
   - 防止过拟合
   - 范围: 0.2 ~ 0.5

6. 正则化系数 ⭐⭐⭐
   - L2正则/权重衰减
   - 范围: 1e-5 ~ 1e-3
低优先级(可选调)
7. 优化器的β参数 ⭐⭐
   - 通常用默认值
   - Adam: β1=0.9, β2=0.999

8. 学习率衰减策略细节 ⭐⭐
   - 在基础设置OK后精细调整
   
9. 初始化方法 ⭐
   - 现代框架已经很好
   - 特殊情况才需要调整

2. 调优顺序

第一阶段:建立基线
1. 使用默认/推荐超参数
   ├─ 学习率: 1e-3 (Adam)
   ├─ 批次大小: 32
   └─ 标准网络结构

2. 快速训练几个epoch
   └─ 观察是否收敛

3. 建立基线性能
   └─ 记录验证集表现
第二阶段:调整架构
1. 根据基线表现判断
   ├─ 欠拟合 → 增加模型容量
   └─ 过拟合 → 减少模型容量

2. 确定合适的模型结构
   ├─ 深度: 层数
   └─ 宽度: 神经元数/通道数
第三阶段:优化学习率
1. 学习率范围测试
   ├─ 尝试: [1e-5, 1e-4, 1e-3, 1e-2]
   └─ 观察收敛速度和稳定性

2. 精细调整
   └─ 在最佳范围内细搜
第四阶段:调整批次大小
1. 根据显存调整批次
2. 配合调整学习率
   └─ Linear Scaling Rule
第五阶段:添加正则化
1. 如果过拟合,添加:
   ├─ Dropout
   ├─ L2正则
   └─ 数据增强

2. 逐步增加强度
   └─ 直到验证性能最佳
第六阶段:精细调优
1. 调整优化器
2. 学习率调度策略
3. 其他细节优化

3. 搜索方法

手动调参
优点:
├─ 直观,有经验可快速找到好配置
├─ 省计算资源
└─ 适合小规模实验

缺点:
├─ 耗时
├─ 可能错过最优解
└─ 依赖经验

适用:
└─ 初期探索,超参数<5个
网格搜索
优点:
├─ 系统全面
└─ 不会遗漏

缺点:
├─ 计算量巨大
└─ 维度灾难

适用:
└─ 超参数2-3个,范围明确

示例:
learning_rates = [1e-4, 1e-3, 1e-2]
batch_sizes = [32, 64, 128]
# 总实验数: 3 × 3 = 9
随机搜索
优点:
├─ 效率高于网格搜索
├─ 容易并行
└─ 适合高维

缺点:
├─ 可能错过最优解
└─ 需要足够的采样次数

适用:
└─ 超参数>3个

示例:
import numpy as np
n_experiments = 20
for i in range(n_experiments):
    lr = 10 ** np.random.uniform(-5, -2)
    batch_size = np.random.choice([16, 32, 64, 128])
    # 训练并评估
贝叶斯优化
优点:
├─ 智能搜索
├─ 利用先验知识
└─ 样本效率高

缺点:
├─ 实现复杂
└─ 需要库支持

适用:
└─ 计算成本高的场景

工具:
├─ Optuna
├─ Hyperopt
└─ Ray Tune

4. 调优技巧

由粗到细
第1轮:大范围探索
└─ 学习率: [1e-5, 1e-4, 1e-3, 1e-2, 1e-1]

第2轮:发现1e-3最好,精细搜索
└─ 学习率: [5e-4, 7e-4, 1e-3, 3e-3, 5e-3]

第3轮:找到最佳值
└─ 学习率: 1e-3
日志记录
# 记录所有实验配置和结果
实验日志模板:
{
    "experiment_id": 42,
    "hyperparameters": {
        "learning_rate": 0.001,
        "batch_size": 32,
        "dropout": 0.3,
        "model_depth": 18
    },
    "results": {
        "train_acc": 0.92,
        "val_acc": 0.85,
        "test_acc": 0.84,
        "train_time": "2h"
    },
    "notes": "Good baseline"
}
早期验证
策略:
├─ 训练少量epoch(如5-10)
├─ 快速淘汰明显差的配置
└─ 对有潜力的配置完整训练

效果:
└─ 大幅减少调参时间
经验先验
1. 参考论文
   └─ 使用已发表论文的超参数

2. 使用预训练模型
   └─ 采用其训练时的超参数

3. 关注社区最佳实践
   └─ GitHub、论坛、博客

4. 建立自己的经验库
   └─ 记录不同任务的有效配置

总结

核心要点

  1. 超参数是"元控制器"

    • 控制训练过程和模型结构
    • 需要人工设定,不会自动学习
    • 直接决定模型能否收敛和最终性能
  2. 超参数 ≠ 模型参数

    • 超参数:结构配置(层数、学习率等)
    • 模型参数:权重和偏置的具体数值
    • 超参数设定好后,模型参数自动学习
  3. 学习率是最关键的超参数

    • 影响最大
    • 优先调整
    • 需要配合其他超参数
  4. 超参数之间存在交互

    • 不能独立调整
    • 需要整体考虑
    • 理解相互影响关系
  5. 调优是系统工程

    • 需要经验和实验结合
    • 遵循优先级和顺序
    • 记录和分析结果

实践建议

✓ 从已有配置开始,不要从零开始
✓ 优先调整影响大的超参数
✓ 每次只改变一个变量
✓ 充分记录实验结果
✓ 理解超参数的作用机制,而不是盲目调参
✓ 关注训练曲线,及时发现问题
✓ 结合业务需求平衡性能和效率
Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐