【AI课程领学】第十二课 · 超参数设定与网络训练(课时1) 网络超参数设定:从"要调什么"到"怎么系统地调"(含 PyTorch 可复用模板)
【AI课程领学】第十二课 · 超参数设定与网络训练(课时1) 网络超参数设定:从"要调什么"到"怎么系统地调"(含 PyTorch 可复用模板)
文章目录
- [【AI课程领学】第十二课 · 超参数设定与网络训练(课时1) 网络超参数设定:从"要调什么"到"怎么系统地调"(含 PyTorch 可复用模板)](#【AI课程领学】第十二课 · 超参数设定与网络训练(课时1) 网络超参数设定:从“要调什么”到“怎么系统地调”(含 PyTorch 可复用模板))
- 前言
-
- [1. 超参数是什么?它和模型参数有什么不同?](#1. 超参数是什么?它和模型参数有什么不同?)
- [2. 超参数的"工程分类"(非常实用)](#2. 超参数的“工程分类”(非常实用))
-
- [A. 优化相关(最关键)](#A. 优化相关(最关键))
- [B. 正则化相关(决定泛化)](#B. 正则化相关(决定泛化))
- [C. 模型结构相关(决定上限与成本)](#C. 模型结构相关(决定上限与成本))
- [D. 数据与训练过程相关(决定稳定与效率)](#D. 数据与训练过程相关(决定稳定与效率))
- [3. 强基线:不同任务的"默认超参数起点"](#3. 强基线:不同任务的“默认超参数起点”)
-
- [3.1 图像分类(CNN/ViT,数据增强适中)](#3.1 图像分类(CNN/ViT,数据增强适中))
- [3.2 语义分割(U-Net/DeepLab/SegFormer)](#3.2 语义分割(U-Net/DeepLab/SegFormer))
- [3.3 回归(地学变量/AOD/SM 等)](#3.3 回归(地学变量/AOD/SM 等))
- [4. 学习率:最重要的超参数,没有之一](#4. 学习率:最重要的超参数,没有之一)
-
- [4.1 学习率过大/过小的典型表现](#4.1 学习率过大/过小的典型表现)
- [4.2 经验规律:batch 越大,lr 可以越大(线性缩放近似)](#4.2 经验规律:batch 越大,lr 可以越大(线性缩放近似))
- [5. 一次就能省很多时间:Learning Rate Range Test(简化版)](#5. 一次就能省很多时间:Learning Rate Range Test(简化版))
- [6. weight_decay、dropout、label_smoothing:正则化三件套怎么定?](#6. weight_decay、dropout、label_smoothing:正则化三件套怎么定?)
- [7. 验证集划分:很多"效果提升"其实来自更正确的划分](#7. 验证集划分:很多“效果提升”其实来自更正确的划分)
- [8. 本篇小结:一个"最省试验次数"的调参流程](#8. 本篇小结:一个“最省试验次数”的调参流程)
欢迎铁子们点赞、关注、收藏!
祝大家逢考必过!逢投必中!上岸上岸上岸!upupup
大多数高校硕博生毕业要求需要参加学术会议,发表EI或者SCI检索的学术论文会议论文。详细信息可扫描博文下方二维码 "
学术会议小灵通"或参考学术信息专栏:https://ais.cn/u/mmmiUz
详细免费的AI课程可在这里获取→www.lab4ai.cn
前言
- 深度学习里最现实的困难之一是:模型结构写出来只是开始,真正决定效果的往往是超参数(hyperparameters)。超参数不是"玄学",它可以用一套工程化方法高效缩小搜索空间。
本篇你将掌握:
- 超参数的分类与作用机制
- 从数据与任务出发的初始设定(strong defaults)
- 如何用最少试验找到合适区间(learning rate range test、逐层冻结等)
- 避免"空间/时间泄漏"的验证策略(尤其适合遥感/地学任务)
1. 超参数是什么?它和模型参数有什么不同?
- 模型参数 :训练过程中通过梯度下降学习出来,如权重 W W W、偏置 b b b。
- 超参数:训练开始前人为设定或搜索得到,如学习率、batch size、weight decay、网络深度、dropout 等。
超参数决定了:
- 优化轨迹(能不能收敛、收敛到哪里)
- 泛化强弱(过拟合/欠拟合)
- 训练效率(速度、稳定性、显存)
2. 超参数的"工程分类"(非常实用)
A. 优化相关(最关键)
- 学习率
lr - 优化器:SGD/AdamW
- 学习率调度:cosine、step、onecycle、warmup
- 动量
momentum、betas - 梯度裁剪
clip_grad_norm
B. 正则化相关(决定泛化)
- weight decay(L2)
- dropout
- label smoothing(分类)
- 数据增强强度(第七课)
C. 模型结构相关(决定上限与成本)
- 深度/宽度(layers、channels)
- 激活函数
- 归一化(BatchNorm/LayerNorm)
- 注意力头数、embedding 维度等(Transformer)
D. 数据与训练过程相关(决定稳定与效率)
- batch size
- 输入分辨率/patch size
- 训练轮数 epochs
- 混合精度 AMP
- num_workers、prefetch 等 DataLoader 参数
3. 强基线:不同任务的"默认超参数起点"
下面这些是我建议你写进博客的"开箱即用默认值",很适合读者直接照抄:
3.1 图像分类(CNN/ViT,数据增强适中)
- optimizer:AdamW
- lr:
3e-4(batch 64 左右) - weight_decay:
1e-2(ViT 常用),CNN 可从1e-4~1e-2 - epochs:50--200(看数据量)
- label_smoothing:0.0--0.1
- warmup:5% epochs + cosine
3.2 语义分割(U-Net/DeepLab/SegFormer)
- optimizer:AdamW
- lr:
1e-4~3e-4 - weight_decay:1e-4 ~ 1e-2
- loss:CE + Dice(或 BCE + Dice)
- batch:尽量大(显存不足用梯度累积)
3.3 回归(地学变量/AOD/SM 等)
- optimizer:AdamW
- lr:
1e-3起,若不稳降到3e-4 - loss:Huber(delta=1)或 MSE(噪声小)
- 标准化:训练集 mean/std 统计
4. 学习率:最重要的超参数,没有之一
4.1 学习率过大/过小的典型表现
- 过大:loss 不降、震荡、NaN、梯度爆炸
- 过小:loss 降得很慢,训练时间浪费,容易陷入次优
4.2 经验规律:batch 越大,lr 可以越大(线性缩放近似)
- 如果你把 batch 从 32 改到 256,lr 可以尝试相应放大(如×8),但需要 warmup。
5. 一次就能省很多时间:Learning Rate Range Test(简化版)
- 思路:在一个 epoch 内让 lr 从很小到很大增长,找到 loss 开始爆炸前的最大可用 lr。
csharp
import torch
import torch.nn.functional as F
def lr_range_test(model, loader, optimizer, device,
start_lr=1e-7, end_lr=1, num_iters=200):
model.train()
lrs, losses = [], []
# 设置起始lr
for pg in optimizer.param_groups:
pg["lr"] = start_lr
mult = (end_lr / start_lr) ** (1 / max(1, num_iters - 1))
it = iter(loader)
for i in range(num_iters):
try:
x, y = next(it)
except StopIteration:
it = iter(loader)
x, y = next(it)
x, y = x.to(device), y.to(device)
optimizer.zero_grad()
logits = model(x)
loss = F.cross_entropy(logits, y)
loss.backward()
optimizer.step()
lr = optimizer.param_groups[0]["lr"]
lrs.append(lr)
losses.append(loss.item())
# 更新lr
for pg in optimizer.param_groups:
pg["lr"] *= mult
return lrs, losses
- 你可以把
loss最快下降的区间中间值作为初始 lr(例如"爆炸前 1/10")。
6. weight_decay、dropout、label_smoothing:正则化三件套怎么定?
- weight_decay:从
1e-4试到1e-2 - dropout:小数据集 0.3--0.5;大数据 0.1--0.2
- label_smoothing:0--0.1(分类),过大可能损伤可分性
建议调参顺序:
- 先把 lr 调到能稳定收敛且较快
- 再调 weight_decay(泛化差就加大)
- 再调增强与 dropout
7. 验证集划分:很多"效果提升"其实来自更正确的划分
尤其对你常见的遥感/地学时空数据:
- 随机切 patch 容易空间泄漏(相邻像素同源)
- 正确做法:按区域/流域/影像块划分 train/val/test
否则指标会虚高,模型上线后崩。
8. 本篇小结:一个"最省试验次数"的调参流程
你可以直接给读者一张流程:
- 选 strong defaults(AdamW + cosine + warmup)
- lr range test 找 lr 合理区间
- 固定 lr,调 weight_decay(先看 val gap)
- 调数据增强强度与 dropout
- 最后才动网络结构(深/宽/注意力)