
1. 从“能用”到“好用”为什么你需要这份超参数指南如果你正在用 LlamaFactory 微调大模型大概率已经踩过几个坑了照着别人的教程跑通了流程但自己的模型效果总是不尽人意或者训练过程看着一切正常loss 曲线平稳下降可模型一推理就胡说八道甚至还不如微调前。这感觉就像拿到了一台顶级的单反相机却只会用自动挡拍照拍出来的照片和手机没什么区别完全浪费了它的潜力。问题的核心往往不在代码而在那些看似不起眼的数字——超参数。在 LlamaFactory 的微调世界里超参数就是你的“手动挡”和“专业模式”。它们决定了模型学习的“节奏”、“深度”和“方向”。一个合适的超参数组合能让你的模型在有限的算力和数据下发挥出 120% 的性能而一套糟糕的参数不仅浪费时间和电费还可能把模型“练废”。网上能找到的教程大多只告诉你“把 learning_rate 设为 2e-5”却很少解释为什么是 2e-5 而不是 5e-5 或 1e-4更不会告诉你当你的数据集只有 100 条样本时这个值可能需要放大 10 倍。这份指南的目的就是帮你捅破这层窗户纸。我们不打算罗列 LlamaFactory 官方文档里已有的每一个参数你随时可以查而是聚焦于那些真正影响微调成败的“关键先生”并结合我实际微调数十个不同任务模型的经验告诉你它们背后的逻辑、如何根据你的具体场景进行调整以及那些文档里不会写的“玄学”和“坑”。无论你是想微调一个客服问答模型还是想让模型学会写特定风格的小说亦或是进行领域知识注入理解并驾驭这些超参数是你从“菜鸟”迈向“高手”的必经之路。接下来的内容我们会抛开泛泛而谈深入到每一个核心参数的骨髓里。2. 学习率与优化器模型训练的“油门”与“方向盘”这是超参数中最核心的一组直接决定了模型能否学会、学得多快、以及学得稳不稳。你可以把学习率想象成“油门”优化器则是“方向盘”和“变速箱”的组合共同控制着模型在参数空间里“下山”寻找损失函数最低点的速度和路径。2.1 学习率并非越小越好动态调整是关键学习率是每次参数更新的步长。在 LlamaFactory 的配置中它通常通过learning_rate参数指定。常见误区与真相误区一学习率越小训练越稳定效果越好。真相过小的学习率会导致训练速度极慢并且容易陷入局部最优点一个不那么好的“小坑”而无法找到全局最优点那个最好的“大坑”。尤其是在训练初期模型需要较大的步长来快速定位到损失函数下降的大方向。误区二照搬经典值如 2e-5准没错。真相2e-5 是 Full Fine-tuning全参数微调常用值但对于 LoRA 等参数高效微调方法这个值通常偏小。因为 LoRA 只更新一小部分参数Adapter需要更大的学习率来驱动这些有限的参数产生足够的变化。我个人的经验是LoRA 的学习率通常在 1e-4 到 5e-4 之间开始尝试。如何科学地设置学习率学习率预热这是避免训练初期震荡的利器。通过lr_warmup_ratio或lr_warmup_steps参数设置。例如设置lr_warmup_ratio: 0.1意味着在前 10% 的训练步数里学习率从 0 线性增长到设定的learning_rate。这给了模型一个“热身”阶段让参数先缓慢适应数据分布。学习率调度光有预热不够还需要在训练中后期“收油”。常用的调度器是余弦退火通过lr_scheduler_type: cosine启用。它会让学习率随着训练过程从峰值按余弦曲线优雅地下降到接近 0。这有助于模型在训练末期精细调整参数稳定收敛。实战策略对于全量微调可以从2e-5开始配合预热和余弦退火。对于LoRA 微调我建议的起手式是learning_rate: 3e-4lr_scheduler_type: cosinelr_warmup_ratio: 0.1。如果训练 loss 下降非常慢几乎是一条水平线可以尝试增大到5e-4甚至1e-3。如果 loss 剧烈震荡或变成 NaN则需降低学习率。2.2 优化器选择AdamW 与它的朋友们LlamaFactory 默认且最常用的优化器是 AdamW它是 Adam 优化器的权重衰减修正版能有效防止过拟合。对于绝大多数情况你不需要改变它。为什么是 AdamWAdam 结合了动量Momentum和自适应学习率RMSProp的优点能为每个参数计算不同的学习率特别适合处理稀疏梯度NLP任务中很常见。AdamW 将权重衰减与梯度更新解耦理论上有更好的泛化性能。在配置中它对应optim: adamw_torch。什么情况下考虑其他优化器如果你显存极其紧张可以尝试adafactor。这是一个省显存的优化器但收敛速度可能慢于 AdamW最终效果也可能略差。这是用性能换资源的权衡。如果你追求极致的稳定性和可复现性在学术研究中可以尝试朴素的sgd随机梯度下降。SGD 没有自适应学习率调参更“直观”但需要精心调整学习率和动量参数且训练通常更慢。优化器的关键伙伴权重衰减与梯度裁剪权重衰减通过weight_decay参数控制通常设为 0.01 或 0.1。它相当于一个正则化器惩罚大的权重值防止模型过拟合。可以把它理解成给模型的“身材”管理避免它“肥胖”参数值过大而记忆训练数据。梯度裁剪通过max_grad_norm参数控制通常设为 1.0。它限制了梯度向量的最大范数。当模型训练不稳定梯度爆炸变得极大时裁剪能防止参数更新步长过大让训练过程更平稳。这是训练深层模型如大语言模型的一道重要安全阀。我的经验对于 7B/13B 级别的模型微调optim: adamw_torchweight_decay: 0.01max_grad_norm: 1.0是一个几乎可以闭眼用的组合。只有在遇到非常特殊的问题时才需要去改动它们。3. 批次大小与梯度累积在显存与稳定性间走钢丝这组参数直接关系到你的硬件资源利用率和训练稳定性。batch_size批大小和gradient_accumulation_steps梯度累积步数是一对需要配合使用的“孪生兄弟”。3.1 理解“有效批次大小”你需要建立一个核心概念有效批次大小 batch_size * gradient_accumulation_steps。batch_size一次前向传播反向传播所处理的样本数。它受限于你的 GPU 显存。gradient_accumulation_steps为了达到更大的“有效批次大小”我们进行多次前向传播但不立即更新参数而是将这几轮的梯度累积起来最后用累积梯度的平均值进行一次参数更新。为什么需要更大的有效批次大小更大的有效批次意味着每次参数更新所依据的数据分布估计更准确梯度噪声更小训练方向更稳定通常有利于收敛。尤其对于数据噪声大或任务复杂的情况。3.2 如何配置一个具体的计算案例假设你有一张 24GB 显存的 RTX 4090想要微调 Llama-3-8B 模型。试探单卡极限首先将gradient_accumulation_steps设为 1然后逐步增加batch_size比如从 1 开始直到 GPU 显存占用达到 90% 左右留一些余量给系统。假设你发现batch_size4时显存刚好占满。确定目标有效批次大小根据经验对于 8B 模型有效批次大小在 32 到 128 之间都是常见的。假设我们目标定为 64。计算梯度累积步数gradient_accumulation_steps 目标有效批次大小 / batch_size 64 / 4 16。最终配置per_device_train_batch_size: 4gradient_accumulation_steps: 16。这样你每处理 64 个样本才更新一次模型参数但显存占用始终只相当于同时处理 4 个样本。注意事项学习率的联动当你增大了有效批次大小理论上可以相应地增大学习率因为每次更新的梯度估计更可靠。一个经验法则是有效批次大小翻倍学习率可以大约增加 sqrt(2) 倍约 1.4倍。但这并非绝对需要观察 loss 曲线。日志与评估频率logging_steps和eval_steps通常建议设置为gradient_accumulation_steps的整数倍这样日志记录和评估点才对应完整的参数更新步骤便于分析。不要盲目追求大有效批次大小并非越大越好。过大的批次有时会导致模型泛化能力下降更容易陷入尖锐的极小值点。如果增大批次后验证集效果变差可以尝试适当调小。4. 训练轮次与早停避免“学傻了”和“白费电”num_train_epochs训练轮次和早停策略决定了训练何时结束。训练不足欠拟合和训练过度过拟合是我们需要避免的两个极端。4.1 训练轮次的设置逻辑训练轮次没有黄金标准完全取决于你的数据量和任务难度。大数据集数万以上样本可能只需要 1-3 个 epoch。因为每个 epoch 模型已经能看到足够多的数据多轮训练容易过拟合。小数据集几百到几千样本通常需要更多的 epoch比如 5 10 甚至 20。因为模型需要反复“咀嚼”有限的数据来学会任务。这也是 LoRA 微调在小数据上表现突出的场景。任务难度从预训练模型继承的知识与目标任务差异越大需要的训练轮次可能越多。例如让一个通用模型学习写法律文书就比让它做文本分类需要更多轮次。一个实用的起手策略 先设置一个较大的 epoch 数例如 10但一定要配合验证集和早停策略。然后通过观察训练曲线来决策。4.2 早停最重要的省时省力工具早停是防止过拟合的“神器”。LlamaFactory 通过load_best_model_at_end和metric_for_best_model等参数实现。如何正确配置早停准备验证集这是前提必须从训练数据中分出一部分比如 10%-20%作为验证集eval_dataset。选择评估指标对于生成任务常用的是eval_loss验证损失或rouge、bleu分数。在配置中设置metric_for_best_model: eval_loss越低越好或metric_for_best_model: rouge越高越好。设置耐心值关键参数是greater_is_better和patience。如果指标是 loss越小越好greater_is_better: false如果指标是 rouge越大越好greater_is_better: truepatience: 5意味着如果连续 5 次评估最佳指标都没有被刷新训练就会停止。看图的艺术如何分析训练曲线理想情况训练损失稳步下降验证损失先下降后趋于平稳或缓慢上升。早停点应设在验证损失最低点附近。训练损失下降验证损失几乎不变可能模型能力过剩或数据简单可以尝试减少参数量如降低 LoRA 的r或提前停止。两者都剧烈震荡学习率可能太高或者批次大小太小需要调整。我的经验对于小数据微调我经常设置num_train_epochs: 20patience: 5eval_steps: 50或更小。这样模型有足够的机会学习但一旦发生过拟合苗头验证损失连续 5 次评估不降反升就自动停止并保存最佳模型完美平衡效果与效率。5. LoRA 专属超参数轻量微调的“魔法旋钮”如果你使用 LoRA 进行微调那么以下几参数就是你的专属调优工具。它们控制了“旁路网络”的规模和能力。5.1 秩与缩放因子控制“学习容量”lora_rLoRA 矩阵的秩rank。这是最重要的参数。你可以把它理解为 LoRA 模块的“宽度”或“表达能力”。值越小可训练参数越少越不容易过拟合但学习能力也越弱。适用于数据量少、任务简单的场景。值越大学习能力越强但可能过拟合且推理时融合的参数量越大虽然相比全量微调仍很小。常用范围对于 7B/8B 模型r在 8, 16, 32, 64 中尝试。我的经验是从r16开始是一个很好的平衡点。对于 70B 等超大模型甚至可以尝试r128或256。lora_alpha缩放因子。在将 LoRA 权重加回原模型时会乘以alpha/r。它控制着 LoRA 更新对原始模型的“影响力”。经验法则通常将alpha设置为r的 2 倍或 1 倍。例如r16alpha32。这被认为是一个能稳定训练的经验值。更大的alpha意味着 LoRA 的更新权重更大。r和alpha的联合影响 本质上影响更新强度的是alpha/r这个比值。固定alpha32r16时比值为 2r32时比值为 1。所以增大r的同时通常也需要同比增大alpha以保持相似的影响力。但为了简化很多实践者直接采用alpha 2*r的设定。5.2 目标模块与丢弃率控制“学习位置”lora_target_modules决定 LoRA 应用于原模型的哪些层。这决定了模型“哪里可以被改变”。常见设置对于 Transformer 模型通常是[q_proj, v_proj]或[q_proj, k_proj, v_proj, o_proj]。前者更轻量后者能力更强。根据论文q和v投影层是最关键的两个。如何选择对于大多数指令微调任务[q_proj, v_proj]足矣。如果你的任务需要模型深刻理解复杂的上下文关系如长文本推理可以加上k_proj。o_proj通常影响较小。lora_dropoutLoRA 层本身的 Dropout 率用于防止过拟合。建议对于小数据集1000条可以设置一个较小的 dropout如 0.05 或 0.1。对于大数据集可以设为 0 或 0.05。这是一个相对次要的参数在主要参数调优后再考虑。LoRA 参数调优顺序建议先固定一个基础的r如 16和alpha如 32以及target_modules如[q_proj, v_proj]。调整好学习率、批次大小等核心训练参数让模型能正常学习loss 平稳下降。如果怀疑模型能力不足训练 loss 很难下降尝试增大r如 32 或 64并同比增大alpha。如果怀疑过拟合训练 loss 很低但验证 loss 很高或生成效果差尝试减小r或增加lora_dropout。6. 综合调参实战手把手调试一个客服问答模型理论说再多不如动手调一遍。假设我们有一个任务基于 500 条高质量的客服问答对使用 Qwen-7B 模型通过 LoRA 微调一个专用客服模型。我们的硬件单卡 RTX 4090 24GB。我们的目标在有限的 500 条数据上让模型学会准确、友好地回答用户关于某产品的问题。6.1 第一步建立基线配置我们先从一个“安全”的配置开始确保训练能跑起来loss 能下降。# 基础训练配置 model_name_or_path: Qwen/Qwen-7B-Chat learning_rate: 3e-4 num_train_epochs: 15 per_device_train_batch_size: 2 # 试探性设置根据显存调整 gradient_accumulation_steps: 16 # 目标有效批次大小 2*1632 lr_scheduler_type: cosine lr_warmup_ratio: 0.1 optim: adamw_torch weight_decay: 0.01 max_grad_norm: 1.0 logging_steps: 10 eval_steps: 50 save_steps: 200 load_best_model_at_end: true metric_for_best_model: eval_loss greater_is_better: false patience: 5 # LoRA 配置 lora_target_modules: [q_proj, v_proj] lora_r: 16 lora_alpha: 32 lora_dropout: 0.05用这个配置跑 1 个 epoch观察显存占用是否在安全范围内如 22GB 以下如果batch_size2显存还吃紧可以尝试开启梯度检查点gradient_checkpointing: true或使用bnb的 4-bit/8-bit 量化加载模型。初始 loss第一个 step 的 loss 值是多少如果异常高比如 10检查数据格式和 tokenizer。loss 下降趋势前 100 个 steploss 是否在明显下降如果下降缓慢考虑提高学习率到5e-4。6.2 第二步针对性调整与迭代假设基线配置运行良好loss 稳步下降。我们开始针对性优化应对小数据过拟合我们的数据只有 500 条过拟合是最大风险。策略A增强正则化。将weight_decay从 0.01 提高到 0.1。同时将lora_dropout从 0.05 提高到 0.1。策略B降低模型容量。将lora_r从 16 降低到 8lora_alpha同步降到 16。这直接减少了可训练参数量。策略C更激进的早停。将patience从 5 降到 3。一旦验证 loss 连续 3 次不改善立刻停止。优化学习过程观察发现训练 loss 在 3 个 epoch 后就降得很低但验证 loss 在 2 个 epoch 后就开始波动上升。这是典型的过拟合信号。采取行动我们综合使用策略 B 和 C。将配置改为lora_r: 8lora_alpha: 16patience: 3。同时考虑到参数减少可以适当提高学习率以保持更新强度将learning_rate从3e-4提高到4e-4。最终验证与生成测试用调整后的配置重新训练。这次训练在约第 5 个 epoch 时触发早停。加载早停保存的最佳模型load_best_model_at_end会帮你做这件事在预留的测试集上进行生成测试。评估重点不再只看 loss而是看生成答案的准确性、相关性和流畅度。如果生成效果满意调参成功。如果效果仍不理想可能需要回头检查数据质量或者尝试不同的lora_target_modules例如加上k_proj。6.3 关键避坑点记录坑1验证集泄露。确保验证集绝对没有在训练中出现过。一个常见的错误是在数据预处理时先全局 shuffle 再分割但如果数据本身有顺序如按时间这可能导致信息泄露。最好使用稳定的哈希函数如对问题内容取 MD5 后取模来分割。坑2评估指标误导。对于生成任务eval_loss低不一定代表生成质量高。它只衡量模型对“下一个词”预测的困惑度。一定要配合人工或自动的生成质量评估如用 GPT-4 做裁判。坑3盲目追求低 loss。在训练后期训练 loss 可以降到非常接近 0但这通常意味着严重的过拟合。我们的目标是验证 loss 的最低点而不是训练 loss。我的习惯我会用一个简单的表格记录每次实验的关键参数和结果方便回溯和比较实验编号lrbatch_sizelora_rlora_alpha最佳验证 Loss早停轮次生成质量评分备注#13e-42x163216321.2312/156/10基线略过拟合#24e-42x16328161.455/158/10泛化更好效果更佳调参没有银弹它更像是一门实验科学。这份指南给你的是一套经过验证的“地图”和“工具”但最终通往最优模型的道路需要你用自己的数据一步步探索出来。记住核心思想理解每个参数的意义建立评估基准大胆假设小心验证并详细记录每一次实验。