跳转至

二十三:调参技巧

来源: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. 学习率

学习率通常是最重要的超参数。它决定每次参数更新的步长。 参数更新可抽象为:

theta_{t+1} = theta_t - lr * update_t
学习率过大时常见现象: - loss 不下降或剧烈震荡。

  • 训练初期直接 NaN。

  • 梯度范数异常增大。

  • 验证指标忽高忽低。

学习率过小时常见现象: - loss 下降很慢。

  • 在固定预算内欠拟合。

  • 训练曲线平滑但性能停滞。

学习率搜索通常优先使用对数尺度,例如:

1e-6, 3e-6, 1e-5, 3e-5, 1e-4, 3e-4, 1e-3
大模型微调常见学习率范围通常比从头训练更小。全参微调通常更保守,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:一次参数更新等效使用的总样本数。

常用公式:

global_batch_size = micro_batch_size_per_gpu * gradient_accumulation_steps * world_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_steps = total_training_steps * warmup_ratio
常见 warmup ratio 可从 0.01 到 0.1 搜索。训练步数很短时,warmup 过长会导致有效学习率长期偏低;训练规模很大时,warmup 不足可能导致前期不稳定。

11. 梯度裁剪与数值稳定

梯度裁剪用于限制梯度范数,防止偶发大梯度导致参数更新过大。常用形式是 global norm clipping:

if ||g|| > max_norm:
    g = g * max_norm / ||g||
梯度裁剪不会解决所有训练问题。如果学习率过大、数据有异常样本、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="