最近跑算子学习的Baselines,需要复现很多Baselines。
遇到一些迷惑的地方,这里记录一下。
不妨提出以下三个问题:
Q1:同一个模型,在不同的训练参数下表现会怎样?
Q2:不同的Baselines能否在同一套训练参数下统一进行训练?
Q3:如何高效进行对比实验?
问题一:同一个模型,不同训练参数下表现会怎样?
-
学习率(最关键)
- 太小:收敛慢、容易欠拟合、最终精度低
- 太大:震荡、不收敛、甚至发散(loss 飙升)
- 合适:收敛快、稳定、最终精度高
这个因素十分关键,不同的模型因为结构设计的问题,作者或多或少会做一些超参数的调整,如果学习率不适配,是很可能出现梯度爆炸或者消失的情况。比如一些注意力以及多尺度的结构,笔者亲测(保持模型原参数,但是改了学习率),出现明显的梯度爆炸情况。如果是一些小模型,可以初步测试一下,观察模型训练的loss曲线变化。复现论文,最好还是先保持原文的参数设置,但不排除作者公开源码存在问题。总之需要多留心一下。
-
Batch Size
- 小 batch:噪声大、泛化通常更好,但训练不稳定
- 大 batch:梯度更准、训练更稳,但容易过拟合、泛化略差
- 超大大 batch:需要同步调大学习率,否则收敛极慢
我之前一般会尝试尽可能调大batch,往gpu里面多"塞模型"。但实际batchsize对模型的训练也是有影响的。batchsize的大小要跟数据集以及模型的训练匹配,不能太大,太小的话计算开销也大。
-
优化器(Adam / SGD)
- Adam:收敛快,前期表现好
- SGD:收敛慢,但往往最终泛化更强、更稳定
优化器的话,这个影响没有太大(至于对于我做的算子学习的任务而言),很多是选择Adam或者Adamw。保持相关论文的统一设置就ok。
-
正则 / Dropout / Weight Decay
- 过强:欠拟合,train/val 都差
- 过弱:过拟合,train 好 val 差
- 适中:泛化最好
有些论文不一定会设置Dropout, Weight Decay倒是常见到。我看到一些论文,比如transolver就会用到梯度裁剪以保证训练的稳定性。
torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0) -
Epochs
- 不足:欠拟合
- 过多:过拟合
- 最佳:早停(early stopping)
之前犯了一个很低级的失误:跑一些baselines,epoch调小了,导致学习效果没达到原文的程度,续训的话,学习率调整又不合理。这个epoch参数因为在不同的论文里设置还不一样。比较好的做法,可以设置比较长的训练epoch,然后设置早停机制,比如patience=20,让模型得到充分训练。重复实验的话,可以根据早停点来针对性设置epoch。
总结:同一模型,训练参数决定:收敛速度、稳定性、最终精度、泛化能力。参数不当,再好的模型也会表现很差。
问题二:不同 Baselines 能否在同一套训练参数下统一训练?
这个很难说,我看不少论文也是统一训练参数。如果严谨一点的话,这样做是不合理的。不同的模型,因为其结构设计的特点,很可能收敛速度上有较大差异。一概而论很可能无法公平对比实验。这也是我很质疑当前顶会的论文的一大原因,没有公正对比实验,得到的实验结果,可信度有多高?
可以统一训练的场景
- 对比的是模型架构差异,不是训练策略差异
- 想快速粗筛模型,不追求 SOTA
- 所有 baseline 结构相近(CNN 之间、Transformer 之间等)
会出现的问题:
- 不同模型对学习率敏感程度不同
小模型可能 lr=1e-3 很好,大模型可能必须 1e-4 - 最优 batch size、weight decay 不同
- 收敛速度不同
一起训练会导致:有的模型还没收敛,有的已经过拟合 - 结论不可靠
你以为 A 模型比 B 好,其实只是 B 没调到最优参数。
合理的做法
- 统一训练环境(硬件、数据增强、初始化);
- 每个模型独立调参到接近最优,再在相同公平条件下对比;
这样做的话,计算开销肯定很大。跑baselines还是得谨慎,可以优先抓住sota的模型进行对比。
总结:可以统一训练,但只能做粗对比;严谨对比必须每个 baseline 单独调参。
问题三:如何高效做对比实验?
- 先粗调,再精调
- 粗调:少 epochs、小模型,快速筛掉差方案
- 精调:对有希望的方案完整训练
- 多次随机种子重复实验
- 至少跑 3 次不同 seed,取均值 ± 标准差
避免偶然性。
- 至少跑 3 次不同 seed,取均值 ± 标准差
- 使用早停 + 固定验证集
- 避免 "手动选轮数" 带来的不公平。
- 记录完整日志,方便复现
- 记录:学习率、优化器、轮数、best epoch、
train/val 曲线、参数量、速度、显存
- 记录:学习率、优化器、轮数、best epoch、
- 可视化学习曲线
看是否收敛、是否震荡、是否过拟合,比数字更可靠。
这是简单的总结,后面有待更新。