二十三:调参技巧¶
来源:http://mp.weixin.qq.com/s?__biz=MzYyNTk3Njg1NA==&mid=2247484226&idx=1&sn=905f0d3c564fe93f6aebc509758a363f&chksm=f01eb03bc769392dbf932cd508eae377600188753d8aa0d7f045792b396a65f55b2e2a255965#rd
1. 学习范围¶
本日主题是大模型与深度学习训练中的调参技巧。调参不是盲目试参数,而是在明确目标、可靠基线、稳定数据、可解释指标和实验预算约束下,系统改变训练过程中的超参数,使模型在目标指标、泛化能力、训练稳定性、推理成本和工程约束之间达到更好的平衡。 本日重点覆盖以下内容: - 调参目标、调参对象和实验原则。
-
baseline、数据划分、指标选择和误差分析。
-
学习率、batch size、优化器、权重衰减、dropout、label smoothing、梯度裁剪和学习率调度。
-
欠拟合、过拟合、模型容量、训练步数和早停。
-
网格搜索、随机搜索、贝叶斯优化、Hyperband、ASHA 等搜索策略。
-
大模型微调中的 LoRA、序列长度、packing、loss mask、全参微调与参数高效微调。
-
RLHF/RL 调参中的 KL、reward scale、clip range、熵奖励和采样参数。
-
分布式训练场景下的 global batch、梯度累积、吞吐、OOM 和通信瓶颈。
-
常见故障的诊断路径:loss 不降、loss 震荡、过拟合、欠拟合、NaN、OOM、训练慢、验证集不稳定。
2. 调参的基本定义¶
模型训练中需要区分两类量: - 参数:由训练过程学习得到,例如神经网络权重、bias、embedding 表。
- 超参数:训练前或训练过程中由人或搜索算法设定,例如 learning rate、batch size、optimizer、weight decay、dropout、LoRA rank、训练轮数、warmup ratio、max sequence length。
调参的目标不是找到一个“绝对最优”的参数组合,而是在当前任务、数据、模型、硬件和时间预算下找到一个可复现、可解释、可迁移的较优配置。实际项目中,调参往往同时关注: - 主指标:accuracy、F1、BLEU、ROUGE、pass@k、reward、win rate、业务转化率等。
-
稳定性:多随机种子表现、loss 曲线、梯度范数、训练是否出现 NaN。
-
泛化能力:验证集和测试集表现是否一致,是否对不同切片数据稳定。
-
成本:训练时长、显存占用、吞吐、推理延迟、模型大小。
-
可维护性:配置是否简单,是否依赖脆弱的随机好运气。
3. 调参前的可靠 Baseline¶
调参前必须先建立可靠 baseline。没有可靠 baseline,后续实验结果很难解释。 可靠 baseline 包含以下要素: - 固定数据版本:训练集、验证集、测试集、清洗规则、采样规则和随机划分种子需要记录。
-
固定代码版本:训练代码、模型代码、tokenizer、依赖库、CUDA/cuDNN、分布式配置需要记录。
-
明确指标:主指标、辅助指标、早停指标和线上/离线对应关系需要定义。
-
记录训练曲线:训练 loss、验证 loss、学习率、梯度范数、吞吐、显存、样本长度分布。
-
先跑通端到端:优先验证数据管道、loss mask、评估脚本、checkpoint 保存和恢复是否正确。
-
使用小规模 sanity check:在小数据上确认模型能过拟合,验证训练流程有学习能力。
一个常用原则是先让系统“正确训练”,再追求“训练得更好”。调参不能掩盖数据标签错误、评估代码错误、tokenizer 不匹配、loss mask 错误、训练/评估分布不一致等基础问题。
4. 数据划分与数据泄漏¶
调参高度依赖验证集。如果验证集有泄漏或不代表目标分布,调参会把模型推向错误方向。 常见数据划分原则: - 训练集用于参数学习。
-
验证集用于调参、早停和模型选择。
-
测试集用于最终报告,不能在反复调参中频繁查看。
-
时间序列任务应按时间切分,避免用未来信息预测过去。
-
用户级、会话级、文档级任务应按实体分组切分,避免同一实体同时出现在训练和验证中。
-
检索、问答、代码任务要注意近重复样本、模板样本和答案泄漏。
常见数据泄漏包括: - 训练集和验证集存在重复或近重复。
-
特征工程使用了全量数据统计信息。
-
数据增强把验证样本的变体放入训练集。
-
prompt、检索库或工具结果中包含目标答案。
-
指标计算使用了训练过程不可获得的信息。
调参时如果发现验证指标异常高、测试指标明显下降、错误样本高度相似或模型输出过于模板化,应优先排查数据泄漏。
5. 指标选择与误差分析¶
调参必须围绕指标进行,但指标不是越多越好。指标体系通常分为: - 优化指标:直接用于选择模型,例如验证集 F1 或 reward model score。
-
监控指标:用于发现异常,例如 train loss、eval loss、gradient norm、learning rate、throughput。
-
业务指标:衡量真实价值,例如用户留存、人工偏好胜率、拒答率、事实正确率。
-
切片指标:按场景、长度、难度、类别、语言、用户群体统计表现。
误差分析是调参的方向盘。只看总分容易误判。更有效的做法是抽样分析错误案例,按错误原因归类: - 数据问题:标签错、样本脏、训练分布缺失。
-
表达问题:模型容量不足、上下文长度不足、tokenizer 不合适。
-
优化问题:学习率不合适、训练步数不足、梯度不稳定。
-
泛化问题:过拟合、验证集与测试集分布偏移。
-
解码问题:temperature、top_p、beam search、长度惩罚不合适。
调参要把指标变化和错误类型变化联系起来。例如 F1 提升但长文本样本下降,说明调参可能偏向了短文本分布;reward 提升但人工评价下降,说明 reward model 或评价目标可能被利用。
6. 学习率¶
学习率通常是最重要的超参数。它决定每次参数更新的步长。 参数更新可抽象为:
学习率过大时常见现象: - loss 不下降或剧烈震荡。-
训练初期直接 NaN。
-
梯度范数异常增大。
-
验证指标忽高忽低。
学习率过小时常见现象: - loss 下降很慢。
-
在固定预算内欠拟合。
-
训练曲线平滑但性能停滞。
学习率搜索通常优先使用对数尺度,例如:
大模型微调常见学习率范围通常比从头训练更小。全参微调通常更保守,LoRA/Adapter 等参数高效微调可以使用相对更大的学习率,但具体仍取决于数据规模、模型大小、任务难度和 batch size。7. Batch Size、Global Batch 与梯度累积¶
深度学习训练中常见的 batch 概念包括: - micro batch size:每张卡单次 forward/backward 处理的样本数。
-
gradient accumulation steps:累积多少个 micro batch 后做一次 optimizer step。
-
world size:参与数据并行训练的进程或 GPU 数。
-
global batch size:一次参数更新等效使用的总样本数。
常用公式:
batch size 影响训练的多个方面: - 显存:micro batch 越大,激活显存越大。-
统计稳定性:global batch 越大,梯度估计噪声越小。
-
泛化:过大的 batch 可能降低梯度噪声带来的正则化效果。
-
吞吐:适当增大 batch 可提升 GPU 利用率,但过大可能受通信或显存限制。
-
学习率:batch 变大后常需要重新调学习率和 warmup。
梯度累积可以在显存受限时增大等效 global batch,但它不会减少单个 micro batch 的激活显存,也会降低 optimizer step 的频率。分布式场景下,如果梯度累积实现不当,还可能导致过早 all-reduce,影响性能。
8. 优化器¶
常见优化器包括 SGD、SGD with Momentum(动量)、Adam、AdamW 等。 SGD 更新简单,泛化能力常较好,但对学习率、动量和调度较敏感。Adam 使用一阶矩和二阶矩自适应调整更新尺度,收敛速度快,适合 Transformer 和大模型训练。AdamW 将权重衰减从梯度更新中解耦,通常是 Transformer 微调中的默认选择。 Adam 的关键超参数包括: - learning rate:整体步长。
-
beta1:一阶动量衰减,影响梯度方向平滑程度。
-
beta2:二阶矩衰减,影响自适应尺度估计。
-
epsilon:数值稳定项,防止除零。
-
weight decay:控制权重规模,改善泛化。
大多数调参优先调 learning rate、weight decay、batch size 和 schedule。beta1、beta2、epsilon 通常保持框架或论文默认值,只有出现训练不稳定、任务特殊或规模变化较大时再调整。 大模型、微调优先选择AdamW;常规调参一般是调学习率和Weight Decay(权重衰减),动量、稳定项一般非必要不要动。
9. Weight Decay、正则化与泛化¶
weight decay 用于限制权重幅度,降低过拟合风险。AdamW 中的 weight decay 是解耦形式,和传统 L2 正则不完全等价。 常见正则化手段: - weight decay:限制参数规模。
-
dropout:训练时随机屏蔽部分激活,降低共适应。
-
label smoothing:把 one-hot 标签变软,减少过度自信。
-
data augmentation:通过扰动输入提升鲁棒性。
-
early stopping:验证指标不再提升时停止训练。
-
mixup/cutmix:视觉任务中常见的数据混合方法。
-
stochastic depth:深层网络中随机跳过部分层。
在大模型微调中,过强正则可能导致欠拟合,尤其是小数据、短训练和低秩适配场景。更稳妥的策略是结合训练/验证曲线判断: - train loss 低、valid loss 高:优先增加正则、减少训练步数、减少模型可训练参数或增加数据。
- train loss 高、valid loss 也高:优先降低正则、增加训练步数、提高模型容量或优化学习率。
10. 学习率调度与 Warmup¶
学习率调度决定训练过程中 learning rate 如何变化。常见策略包括: - constant:固定学习率,简单但后期可能不够细致。
-
step decay:每隔若干 epoch 衰减一次。
-
exponential decay:按指数连续衰减。
-
cosine decay:从较大学习率平滑衰减到较小值。
-
linear decay:线性下降,NLP 微调中常见。
-
one-cycle:先升后降,常用于部分 CV 训练。
warmup 是训练初期从较小学习率逐步升到目标学习率。Transformer 和大模型训练常使用 warmup,因为训练初期参数、优化器状态和归一化统计尚不稳定,直接使用大学习率可能导致发散。 常见 warmup 设置:
常见 warmup ratio 可从 0.01 到 0.1 搜索。训练步数很短时,warmup 过长会导致有效学习率长期偏低;训练规模很大时,warmup 不足可能导致前期不稳定。11. 梯度裁剪与数值稳定¶
梯度裁剪用于限制梯度范数,防止偶发大梯度导致参数更新过大。常用形式是 global norm clipping:
梯度裁剪不会解决所有训练问题。如果学习率过大、数据有异常样本、loss mask 错误或混合精度缩放异常,单纯增加裁剪可能只是掩盖问题。 常见数值稳定检查: - loss 是否出现 NaN/Inf。-
gradient norm 是否突然爆炸。
-
mixed precision 的 loss scaling 是否频繁溢出。
-
输入 token id、attention mask、label 是否存在非法值。
-
softmax 前 logits 是否异常大。
-
reward 或 advantage 是否未归一化。
12. 欠拟合、过拟合与模型容量¶
欠拟合表示模型连训练集都学不好。常见原因: - 模型容量不足。
-
训练步数不足。
-
学习率过小或调度不合理。
-
正则化过强。
-
数据标签噪声过大。
-
特征或输入信息不足。
过拟合表示训练集表现好,验证/测试表现差。常见原因: - 数据量太小或分布单一。
-
模型容量过大。
-
训练太久。
-
正则化不足。
-
验证集与训练集分布差异大。
判断欠拟合和过拟合应同时看 train loss、valid loss、任务指标和错误案例,而不是只看单一分数。大模型微调还要关注是否出现灾难性遗忘,即模型在新任务上变好,但通用能力或安全能力下降。
13. 随机种子与可复现性¶
调参必须考虑随机性。随机性来源包括: - 参数初始化。
-
数据 shuffle。
-
dropout。
-
CUDA/cuDNN 非确定性算子。
-
多进程 DataLoader。
-
分布式通信和浮点归约顺序。
-
采样式评估和生成参数。
基本做法包括: - 记录随机种子。
-
固定数据划分。
-
固定依赖版本。
-
保存完整配置和命令行参数。
-
对重要结论使用多个 seed 复跑。
-
报告均值和方差,而不是只报告最好一次。
需要注意,深度学习框架通常不能保证跨硬件、跨版本、跨平台完全复现。可复现性的实际目标是让同一环境下的实验差异可控,并能解释关键结论。
14. 搜索策略¶
常见调参搜索策略如下。 网格搜索: - 在预设网格中穷举组合。
-
适合参数少、取值离散、预算充足的场景。
-
缺点是维度稍高时代价迅速增长。
随机搜索: - 从搜索空间中随机采样。
-
对高维空间通常比粗网格更有效。
-
适合先探索重要参数范围。
贝叶斯优化: - 根据历史实验结果建立代理模型,选择更有希望的下一组参数。
-
适合单次实验较贵、搜索空间中等的场景。
-
对噪声大、并行度高或目标不稳定的任务要谨慎。
Hyperband/Successive Halving: - 给大量配置较小预算,早期淘汰差配置,把资源分配给更有希望的配置。
- 适合训练曲线早期能预测最终表现的任务。
ASHA: - 异步版 Successive Halving,适合并行训练环境。
- 可以减少等待慢 trial 的时间,提高集群利用率。
实际调参常用分阶段策略: - 用随机搜索粗找学习率、batch、weight decay 的合理范围。
-
固定主要范围后做局部精细搜索。
-
对最优配置做多 seed 复验。
-
用测试集或线上实验做最终确认。
15. 搜索空间设计¶
搜索空间比搜索算法更重要。设计不合理时,再先进的搜索算法也难以得到好结果。 常见设计原则: - 对跨数量级参数使用 log scale,例如 learning rate、weight decay。
-
对类别参数使用离散集合,例如 optimizer、scheduler、activation。
-
先调高敏感参数,再调低敏感参数。
-
保持搜索空间足够大,避免一开始就把最优区域排除。
-
发现边界值最优时,应扩展边界继续搜索。
-
避免无效组合,例如 batch 太大导致 OOM、warmup_steps 大于 total_steps。
-
记录条件依赖,例如 optimizer=SGD 时才搜索 momentum。
Google Deep Learning Tuning Playbook 常强调区分 scientific hyperparameters、nuisance hyperparameters 和 fixed hyperparameters: - scientific hyperparameters:真正想研究其影响的参数。
-
nuisance hyperparameters:必须调好以公平比较科学参数的参数。
-
fixed hyperparameters:暂时固定,不纳入当前实验。
这种分类有助于避免一次实验中变量过多,导致无法解释结果。
16. 实验管理¶
调参是实验工程,不只是训练脚本。每个实验应记录: - 代码 commit。
-
数据版本。
-
模型和 tokenizer。
-
全量超参数配置。
-
随机种子。
-
硬件和分布式配置。
-
训练时长、吞吐、显存峰值。
-
checkpoint 路径。
-
训练曲线和评估结果。
-
错误分析结论。
推荐使用结构化配置文件和实验追踪工具,例如 YAML/JSON 配置、Weights & Biases、MLflow、TensorBoard、Optuna、Ray Tune 等。命名规范也很重要,应包含日期、任务、模型、关键参数和 seed,避免后续无法追溯。
17. 大模型微调调参¶
大模型微调的调参对象既包括传统训练参数,也包括微调方法特有参数。 常见训练参数: - learning rate。
-
batch size/global batch。
-
gradient accumulation steps。
-
max sequence length。
-
training steps/epochs。
-
warmup ratio。
-
weight decay。
-
gradient clipping。
-
precision:fp16、bf16、fp32。
LoRA/PEFT 常见参数: - rank r:低秩矩阵维度,控制可训练参数量和表达能力。
-
lora_alpha:缩放系数,常和 r 一起影响更新强度。
-
lora_dropout:LoRA 分支 dropout。
-
target_modules:注入 LoRA 的模块,例如 q_proj、k_proj、v_proj、o_proj、gate_proj、up_proj、down_proj。
-
bias:是否训练 bias。
-
task_type:任务类型配置。
数据与序列相关参数: - max_length:过短会截断关键信息,过长会增加显存和计算。
-
packing:把多个短样本拼接到一个序列,提高吞吐,但要正确处理 attention mask 和 loss mask。
-
loss mask:只对需要学习的 token 计算 loss,例如 SFT 中通常只对 assistant 回复部分计算 loss。
-
chat template:训练与推理的模板必须一致。
大模型调参不能只看训练 loss。要结合人工评估、自动指标、切片评估、安全性、事实性和格式遵循能力。
18. RLHF/RL 调参¶
RLHF、PPO、GRPO、DPO 后续强化学习式训练中,调参更容易受目标设计影响。 常见参数: - reward scale:奖励尺度,影响 policy 更新幅度。
-
KL coefficient:约束当前策略不要偏离参考策略太远。
-
clip range:PPO 中限制 policy ratio 的范围。
-
GAE lambda:优势估计的 bias-variance 权衡。
-
gamma:折扣因子。
-
entropy coefficient:鼓励探索,避免策略过早坍缩。
-
rollout batch size:每次采样的 prompt/response 数量。
-
generation temperature/top_p:影响采样多样性和 reward 分布。
-
advantage normalization:稳定策略梯度。
常见风险: - reward hacking:模型学会利用 reward model 漏洞。
-
KL 过低:模型偏离参考模型,语言质量或安全性下降。
-
KL 过高:模型几乎不学习。
-
reward scale 过大:更新过猛,训练不稳定。
-
采样温度过低:探索不足。
-
采样温度过高:输出质量差,reward 噪声大。
RLHF 调参必须同时监控 reward、KL、policy loss、value loss、entropy、response length、人工偏好和安全指标。
19. 分布式训练中的调参¶
分布式训练会改变调参环境。最重要的是理解 global batch 和通信成本。 当 GPU 数增加时,如果 micro batch 和梯度累积不变,global batch 会随 world size 线性增加。这可能改变优化动态,需要重新调整学习率、warmup 和训练步数。 常见处理方式: - 保持 global batch 不变:增加 GPU 时减少 gradient accumulation 或 micro batch。
-
线性放大学习率:global batch 增大时按比例增大学习率,但需要 warmup 和稳定性验证。
-
sqrt 放大学习率:更保守的 batch-size scaling 策略。
-
重新计算总 step:样本总量固定时,global batch 越大,每个 epoch 的 optimizer step 越少。
分布式调参还要关注: - 数据加载是否成为瓶颈。
-
all-reduce 或参数通信是否成为瓶颈。
-
gradient accumulation 是否减少通信频率。
-
ZeRO/FSDP 是否改变显存和通信模式。
-
checkpoint 保存是否拖慢训练。
20. 常见问题诊断¶
loss 不下降: - 检查学习率是否过小或过大。
-
检查 label、loss mask、attention mask 是否正确。
-
检查 optimizer 是否包含可训练参数。
-
检查模型是否处于 train 模式。
-
用小数据过拟合测试验证训练链路。
loss 震荡: - 降低学习率。
-
增大 batch 或梯度累积。
-
增加 warmup。
-
使用梯度裁剪。
-
检查异常样本。
过拟合: - 增加数据或数据增强。
-
增大 weight decay/dropout。
-
减少训练轮数或早停。
-
减少 LoRA rank 或可训练层数。
-
检查验证集是否分布过窄。
欠拟合: - 增加训练步数。
-
提高学习率或调整 schedule。
-
降低正则化。
-
增大模型容量或 LoRA rank。
-
检查标签噪声和输入信息是否足够。
OOM: - 减小 micro batch。
-
减小 max sequence length。
-
使用 gradient checkpointing。
-
使用 bf16/fp16。
-
使用 ZeRO/FSDP。
-
使用梯度累积维持 global batch。
NaN/Inf: - 降低学习率。
-
开启或调小梯度裁剪阈值。
-
检查混合精度和 loss scaling。
-
检查输入、label、mask、除零和 log(0)。
-
排查异常长序列或异常 reward。
训练慢: - 检查 dataloader、CPU、磁盘和网络。
-
提高 batch 以提升 GPU 利用率。
-
使用 fused optimizer、FlashAttention、混合精度。
-
减少频繁评估和 checkpoint。
-
分析通信瓶颈和负载均衡。
21. 调参流程清单¶
一个可执行的调参流程如下: - 明确目标指标、约束和实验预算。
-
固定数据、代码、评估脚本和随机种子。
-
建立 baseline 并确认端到端训练正确。
-
做小数据过拟合测试,排除训练链路错误。
-
优先调 learning rate、batch size、warmup 和训练步数。
-
再调 weight decay、dropout、label smoothing、gradient clipping。
-
对大模型微调,调 LoRA rank/alpha/dropout、target modules、max length、packing 和 loss mask。
-
使用随机搜索或 ASHA 等方法扩大探索范围。
-
对候选最优配置做多 seed 复验。
-
做错误分析和切片评估。
-
在测试集或线上实验中做最终确认。
-
归档完整配置、曲线、checkpoint、结论和失败实验。
22. 核心总结¶
调参的核心不是记住某个固定参数值,而是建立系统化判断: - 先保证数据、代码、指标、评估和 baseline 可靠。
-
学习率通常是第一优先级,batch size、warmup 和 schedule 必须联动考虑。
-
判断欠拟合和过拟合要同时看训练曲线、验证曲线、指标和错误样本。
-
搜索空间设计比搜索算法更重要。
-
大模型微调必须额外关注 LoRA 配置、序列长度、packing、loss mask、chat template 和生成评估。
-
RLHF 调参必须监控 reward、KL、长度、entropy 和人工偏好,防止 reward hacking。
-
分布式训练中任何 GPU 数、batch 或累积步数变化都会改变 global batch 和 optimizer step,需要重新评估学习率与训练步数。
-
重要结论需要多 seed 复验,不能只相信单次最优结果。
23. 参考资料¶
-
Google Research Deep Learning Tuning Playbook: https://github.com/google-research/tuning_playbook
-
Google Developers Deep Learning Tuning Playbook: https://developers.google.com/machine-learning/guides/deep-learning-tuning-playbook
-
PyTorch Reproducibility: https://docs.pytorch.org/docs/stable/notes/randomness.html
-
Hugging Face Transformers Trainer: https://huggingface.co/docs/transformers/en/main_classes/trainer
-
Hugging Face Transformers Hyperparameter Search: https://huggingface.co/docs/transformers/en/hpo_train
-
Hugging Face PEFT LoRA: https://huggingface.co/docs/peft/package_reference/lora
-
Optuna Documentation: https://optuna.readthedocs.io/
-
Weights & Biases Sweeps: https://docs.wandb.ai/models/sweeps
-
Ray Tune Schedulers: https://docs.ray.io/en/latest/tune/api/schedulers.html
-
CSDN 调参技巧整理: https://blog.csdn.net/qq_42718887/article/details/118242358
预览时标签不可点<div class="