有一段时间,好几个用同一套文件在折腾模型微调的朋友,都不约而同跑来问我同一个问题:Gemini 3 的超参数到底怎么设?有人直接照搬了某个开源仓库的参数组合,结果训练到一半 loss 开始反复横跳,最后直接梯度爆炸;有人把 temperature 一路拉到 1.5,输出倒是话多,但每句都在一本正经地胡说八道。说实话,这种问题最怕给一个“标准答案”,因为超参数本身就不是一组固定值,而是一套跟任务类型、数据规模、硬件资源强相关的权衡方案。今天我就把在 Gemini 3 上摸出来的完整调参经验整理出来,从训练端到推理端,从基线配置到排查思路一次性讲清楚,适合正准备入手微调、或者已经在调参路上被逼疯的开发者参考。
1. 超参数设置前必须先想清楚的三件事
1.1 先分清“训练阶段”和“推理阶段”
很多人一上手就盯着 temperature、top_p 这些采样参数调,其实这是典型的顺序错误。Gemini 3 这类生成模型的完整链路里,超参数至少可以分为训练侧和推理侧两大块,它们服务的根本不是同一个目标。
训练侧参数(学习率、批大小、优化器权重、warmup 比例、梯度累积步数等)影响的是模型参数能否收敛到合适的区间,解决的是“模型懂不懂”的问题。推理侧参数(temperature、top_p、top_k、重复惩罚、max_new_tokens 等)影响的是从已学好的概率分布里怎么抽样,解决的是“输出像不像人话、内容贴不贴题”的问题。
如果你模型都没训练明白,推理参数再花哨也没有意义。反过来,如果训练已经收敛得很好,但推理参数配得极端,照样会把结果搞得一塌糊涂。所以我建议的顺序是:先把训练侧参数定下来,跑通基线,模型能稳定收敛了,再去逐项调推理侧参数。我见过有人把公司项目的 temperature 从 0.8 改成 1.2,然后跑到老板面前说模型“学坏了”,其实模型没坏,只是抽样策略变激进了。
1.2 明确任务类型和数据规模
同样的模型,你拿去做什么差别极大。Gemini 3 如果用在指令微调(比如对话、意图识别、文章摘要),与用在领域续训(比如让它继续读一批技术文档,巩固领域知识),超参数设置逻辑是完全不同的。
指令微调通常要在现有对话能力上做“行为对齐”,数据量常见的是一万到十几万条指令对,学习率不能太激进,否则会把底座模型原本的能力冲掉,业内通常建议在 1e-5 到 2e-5 这个区间起步。领域续训的任务目标则是让模型记住更多术语、句式和知识结构,数据量往往更大,几十万甚至上百万条原始文本也不奇怪,这种情况下学习率可以适当放大一些,但也要配合更长的 warmup 和更小的最终学习率,防止后期震荡。
另外,数据质量对超参数选择的影响也很直接。如果数据里噪声多、格式不一致,训练时就需要更大的批量和更低的初始学习率来平滑优化过程;如果数据已经清洗得很干净、格式统一,那参数空间就会宽裕很多。别一上来就追求激进参数,先花时间把数据看清楚,再谈调参。
1.3 明确评测指标再定优化方向
调参最怕漫无目的地东试一下西试一下。每次调整都要有一个明确的观测信号。比如做对话模型,你要观察的是回答是否贴合指令、语气是否自然、是否包含幻觉信息;做摘要任务,可以看 ROUGE 分数和人工抽检结果;做分类任务,则重点盯准确率和 F1。
Gemini 3 的微调过程中还要同步观察训练 loss 和验证集 loss。如果你的目标是训练端收敛,就主要看 loss 曲线是否平滑下降;如果你的目标是推理端输出质量,就要把重点放在评测集上的定量指标和人工体验上。两边信号要分开看,混着看很容易调来调去最后两头不讨好。
2. 训练侧超参数核心拆解
2.1 学习率:最需要耐心对待的旋钮
学习率是 Gemini 3 训练里最敏感、也最值得你花心思的参数。它决定了模型参数每一步更新的幅度。学习率太高,参数更新步子太大,很容易踩过最优区域,在 loss 曲线上表现为先降后升,或者训练不到几个 step 就出现 NaN;学习率太低,收敛过程会变得极慢,可能训练了半天 loss 还在原地磨蹭。
实际操作中我习惯把学习率当作“先定数量级,再定具体值”的过程。对于基于预训练底座做全参数微调的场景,常见安全区间是 1e-5 到 5e-5;如果用 LoRA 这类参数高效微调方法,学习率通常可以比全参微调大一个数量级,1e-4 到 2e-4 都是常见选择,因为真正参与更新的参数数量少,一个参数上分摊到的更新压力更大。
小步快跑还有一个配套技巧——观察 loss 的“前 n 步走势”。通常我会在固定好其他参数后,先只是小批量跑 200 到 500 步,看 loss 曲线。如果前 50 步内 loss 就直线下降,那说明学习率还有上调空间;如果 loss 完全没有动静,或者跌两下就卡住,说明学习率偏低或 warmup 过长;如果 loss 下降一段后突然弹起,那基本就是学习率偏大的信号,需要立刻降档。
注意:学习率不能只盯数值,还要看它跟 batch size 的联动。增大 batch size 时通常应该同步收窄一点学习率,否则大批量下的梯度估计更稳定,同样的学习率反而容易过度放大更新步长。
2.2 批大小与梯度累积:显存受限时的关键配合
批大小对训练的收敛稳定性和最终效果影响很大。太大的 batch size 会让梯度估计更接近全局方向,训练过程更稳,但容易走入尖锐极小值,在泛化上常常不如适中的 batch size;太小的 batch size 则噪声大,收敛不稳。
Gemini 3 按常见配置来说,显存充足的情况下,单卡 batch size 为 4 到 8 是常用区间。如果显存只有 16G 甚至更小,单卡根本塞不下大 batch,那就必须用梯度累积来“折中”——比如单卡只能塞 2 条样本,你可以设置 gradient_accumulation_steps = 4,效果相当于每 8 条样本真正更新一次参数。
这里有个容易踩的坑:梯度累积的有效 batch size 只跟参数更新频率有关,却不改变单步显存占用,因为它并没有减少前向和反向算子占用的显存。你只是把“攒梯度”这件事拆成了多个小步,真正让单卡跑得动的是调低每张卡的 batch size,而不是单纯调大累积步数。
另外,多卡并行时,梯度累积步数的计算还得考虑总卡数。例如两张卡,每张卡 batch size 为 2,梯度累积 4 次,那有效 batch 就是 2 × 2 × 4 = 16。这是一道简单的乘法题,但在分布式训练场景里很多人会算错,导致训练效果和原本预期的差异非常大。
2.3 优化器、warmup 与权重衰减的配合逻辑
Gemini 3 微调最常用的优化器还是带权重衰减的优化器变体(类似 AdamW 的思路)。这类优化器能区分“模型的原始知识”和“任务新增知识”,通过权重衰减避免某些参数更新过猛。
warmup 比例是训练早期不可省的一项。它的作用是在最初的若干步内把学习率从接近 0 逐渐抬升到设定值,避免模型参数在训练刚开始时被剧烈变化的梯度冲乱。通常微调场景里 warmup 比例设在 3% 到 10% 之间比较常见,具体要看总训练步数。如果总步数只有几百步,那就别设太多 warmup,否则训练还没到目标学习率就已经快结束了;如果总步数上万,那 5% 的 warmup 也足够平滑起步。
权重衰减(weight decay)一般设置在 0.01 到 0.1 之间。数值偏大容易让一部分参数被过度压缩,影响模型的表达能力;凭经验来说,0.01 是很多任务的稳健起点。如果你在验证集上观察到训练 loss 稳定但验证指标持续下滑,可以适当加大一点权重衰减,这有时能缓解过拟合。
额外提一句:固定随机种子(seed)非常重要。每次训练前把 seed 固定住,你才能在调整其他超参数时保证对比的公平性。否则你换了 seed,loss 曲线上那一点波动到底是因为参数变了还是随机性变了,都说不清。
3. 推理采样参数实战配置
3.1 temperature 与 top_p 的配合逻辑
训练完成后,很多人开始在推理参数上反复试。Gemini 3 的生成端最核心的两个参数是 temperature 和 top_p。
temperature 控制的是概率分布的“尖锐程度”。数值越低(比如 0.1 到 0.4),模型越倾向于选高概率的 token,输出保守、确定性高,适合代码生成、填空题、信息抽取这类“要准确”的任务;数值越高(比如 0.9 到 1.2),输出多样性变强,但也会引入更多错误和幻觉。
top_p 是另一种截断策略,它从概率最高的 token 开始累加,直到概率之和超过设定阈值,然后只在这个候选集合里重新归一化采样。top_p 越小越保守,比如 0.7 到 0.9 是常见的对话设置。它和 temperature 不是替代关系,而是叠加关系——先按 top_p 截出候选集合,再在这个集合里按 temperature 缩放后的概率分布采样。
我的经验是:不要把 temperature 和 top_p 同时推到极端。有些人为了追求“机器更有人味”,把 temperature 设为 1.3、top_p 设为 0.95,结果生成了大量语法正确但逻辑崩塌的句子。我一般建议从“temperature = 0.7、top_p = 0.9”这个组合起步,再做单向调整:需要更稳就降 temperature;需要更丰富就微升 top_p。
3.2 top_k、重复惩罚与生成长度限制
top_k 是另一个采样过滤器。它只保留概率最高的 k 个 token 作为候选。top_k 的值通常设在 20 到 60 之间,太大等于没有过滤,太小则可能让模型忽略某些正确但概率稍低的 token。某些任务里 top_k 和 top_p 可以一起用,比如先按 top_k 过滤到 50 个候选,再按 top_p 截断到 0.9,这能进一步压缩抽样空间。
重复惩罚(repetition penalty)是我在长文本生成场景里几乎必开的参数。默认值为 1.0,表示不惩罚。适当调到 1.1 到 1.2,可以有效降低同一个词、同一个短语反复出现的概率。但不要调太高,超过 1.3 以后,模型会开始刻意回避一些高频词汇,输出读起来会有一种很明显的“绕开常用词”的别扭感。
生成长度参数 max_new_tokens 则直接决定了单次生成的最大 token 数。这里的建议是“按任务需要给上限,而不是按显存给上限”。对话场景里通常 512 到 1024 就够;长文摘要或者代码补全任务可能需要 2048 甚至更多。过长的 max_new_tokens 不仅会拖慢推理速度,也会放大错误累积的风险,因为生成到后面时,模型会产生更多低概率 token,前面的错误会被持续放大,俗称“越到后面越飘”。
我个人的想法是:大多数人会把注意力放在训练参数上,而推理侧经常被随意设置,实际上 inference 参数选得是否合理,对线上效果的影响可能一点都不比训练收敛差。尤其在对话产品里,用户感知最直接的就是输出风格和准确性,而这两者恰恰是采样参数决定的。
4. 实操:从零调出一套可复用的超参数组合
4.1 基线配置模板
不铺垫了,先给一份我在 Gemini 3 上验证过、可以稳定跑通微调任务的基线配置,所有参数都是比较保险的中间值:
# Gemini 3 微调基线配置 model_name_or_path: "./gemini3-base" task: "instruction_tuning" # 训练参数 num_train_epochs: 3 per_device_train_batch_size: 2 per_device_eval_batch_size: 2 gradient_accumulation_steps: 8 learning_rate: 2e-5 lr_scheduler_type: "cosine" warmup_ratio: 0.05 weight_decay: 0.01 max_grad_norm: 1.0 optimizer_type: "adamw_torch" seed: 42 save_strategy: "steps" save_steps: 500 logging_steps: 50 # 推理参数 temperature: 0.7 top_p: 0.9 top_k: 50 repetition_penalty: 1.1 max_new_tokens: 1024 do_sample: true num_return_sequences: 1这份配置的思路是:单卡显存有限时,用 2 的 batch size 配合 8 步梯度累积,等效出 16 的 batch size。在显存更充裕的环境里,也可以保持等效 batch 为 16 不变,把 per_device_train_batch_size 提到 4 或 8,同时减少梯度累积步数,训练速度会更理想。优化器用带权重衰减的版本,配合 cosine 学习率调度,是很多微调任务里表现比较稳定的组合。
推理端先用偏保守的采样参数,temperature 为 0.7,top_p 为 0.9,top_k 为 50,加上轻微重复惩罚。这个组合在多种任务上都有不错的平衡性,不会让人明显觉得机器太死板或者太疯。
4.2 分阶段调参的具体操作步骤
拿到基线配置之后,不要一次性改动多个参数,每次只动一个变量,并且记录结果。下面给出我常用的分阶段操作步骤。
第一步,先花少量数据快速跑通流程。数据量可以只取 5% 到 10%,目标是确认训练流程没有 bug。此时重点关注的是显存占用、每步耗时、保存日志是否正常。如果这里跑不通,后面一切参数讨论都是空中楼阁。
第二步,把全量数据跑起来,观察 loss 曲线。loss 正常下降并且最终平稳,说明当前学习率和批大小配合合理,可以进入推理质量评估;如果 loss 下降过慢,优先把学习率提一个档次,比如从 2e-5 提到 3e-5 或 4e-5。如果 loss 在下降过程中出现尖峰,优先把学习率降到 1e-5,同时检查数据里是否存在异常标签或噪声过大的样本。
第三步,训练完成后,用同一套固定的评测集对模型做推理评估。每次只调整一个推理参数,生成一批结果做对比。比如先固定 top_p 为 0.9,测试 temperature 的 0.3、0.7、0.9 三档,人工对比输出的连贯性、贴题度和多样性。这里要注意不要只看一两条输出,至少拿 50 到 100 条测试样本的生成结果做对比,否则随机波动会让你误判参数的有效性。
第四步,当训练端和推理端都筛出较好的几组配置后,再拉一组小规模 AB 测试。把同一批用户请求分别用候选配置生成结果,按“内容准确性”“风格自然度”“错误率”三个维度打分。这一步能让调参回归到真实使用体验上,而不只是停留在“loss 降了”的抽象层面。
4.3 参数组合的量化对比实例
这里整理一次实训中的对比记录,展示不同参数组合对同一批测试样本的影响。任务为指令型对话生成,测试样本 200 条,人工对输出从“忠实度”和“丰富度”两个维度打分,满分 5 分。
| 参数组合 | 学习率 | temperature | top_p | 忠实度 | 丰富度 | 备注 |
|---|---|---|---|---|---|---|
| 组合 A | 2e-5 | 0.3 | 0.9 | 4.6 | 3.8 | 输出稳定,但部分回答偏简短 |
| 组合 B | 2e-5 | 0.7 | 0.9 | 4.3 | 4.5 | 平衡较好,推荐作为默认 |
| 组合 C | 2e-5 | 1.1 | 0.9 | 3.5 | 4.7 | 内容丰富,但幻觉明显增多 |
| 组合 D | 1e-5 | 0.7 | 0.85 | 4.4 | 4.2 | 更保守,适用风险敏感场景 |
可以看出,组合 A 在忠实度上占优,但丰富度不足,适合对格式和准确性要求极高的场景;组合 C 内容丰富但风险很大,不适合直接上线;组合 B 是我最终保留的默认方案,整体性价比较高。
这组数据也验证了前面说的一个道理:超参数之间是联动关系。学习率的差别在推理阶段的影响虽然没有训练阶段那么强烈,但它会决定模型学到的概率分布形态,进而影响后续采样时的偏向。训练端和推理端是层层叠加的关系,只调一头永远出不了最优效果。
5. 常见问题与排查技巧实录
5.1 训练不收敛:loss 反弹、NaN 与卡住不动
训练不收敛是 Gemini 3 微调时最高频的故障。首先要明确症状再下手。
loss 表现为“先降后升”或“锯齿状大幅波动”,多半是学习率偏大,先把学习率砍半再试。loss 表现为“完全不动”,可能原因比较多:数据预处理错了(比如 label 全一样)、learning rate 太小、或者模型没有真正进入训练模式。
loss 直接变成 NaN,要先查数据里是否存在非数值特征、掩码设置是否正确、损失计算是否除了 0;如果数据没问题,大概率是学习率过大导致梯度溢出,把精度换到混合精度前确认梯度裁剪已开启,max_grad_norm 设置为 1.0 是个常用的保险值。
还有一个容易忽视的点:样本长度差异悬殊时,同一个 batch 里长短样本混合,padding token 会浪费部分计算,还会让有效信息比例不稳定,影响训练收敛。建议在 DataLoader 里启用按长度分组排序,把长度相近的样本放进同一个 batch,训练能稳定不少。
5.2 输出重复、幻觉严重怎么办
推理侧调完训练侧收敛良好后,输出重复通常有三种解法:把 repetition_penalty 从 1.0 逐步提到 1.15 左右;启用 n-gram 重复惩罚,比如设置 no_repeat_ngram_size = 3,直接禁止同一个三连词重复出现;适当调低 temperature,让模型不要总是去试探低概率 token。
幻觉问题要复杂一些。如果模型在回答中编造事实,说明模型对比学习阶段的数据并没有充分覆盖该领域知识,或者推理时采样太自由。首先把 temperature 压到 0.6 以下试一下,如果幻觉明显减少但回答变笨,那本质问题在训练数据的知识密度上。需要针对性扩充语料,而不是靠调参来解决。还有一种容易被忽视的情况:在提示词中给了模型过高的自由度,比如要求它回答一切问题,而没有限定“不知道时明确说不知道”,这类行为引导问题也可以归结到数据设计上,而不只是超参。
5.3 显存溢出:在硬件受限下降级配置
显存溢出(OOM)是新手最常遇到的硬门槛。当 Gemini 3 的模型参数量较大、输入输出序列较长时,一张卡很容易被前向和反向传播的激活值撑爆。
第一步,降低 per_device_train_batch_size,直接从 4 降到 2 或 1。第二步,如果单卡 batch 已经是 1,那么把梯度累积步数调大,维持等效 batch 不变。第三步,启用梯度检查点,用少量计算换显存空间,这在实践中能显著降低峰值显存。第四步,打开混合精度训练,把部分算子的精度降低,不仅减少显存占用,还能加速训练。
如果这些手段都用过还是溢出,那就需要从模型本身下手了:把最大输入长度限制缩短,或者换用更高效的参数微调方法(只训练部分层参数),这样显存压力会小非常多。别让显存限制变成调参的阻碍,能跑通小配置再逐步加大规模,远比一上来就追求极限配置高效。
5.4 一个容易忽视的评估陷阱:测试集污染
最后提一个很多人忽略的问题:评估集和训练集过度重叠。如果你在数据划分时不仔细检查重复样本,Gemini 3 在训练过程中已经“见过”这些测试样本,那评估指标会虚高,超参数无论怎么调都显得很好,但一到真实场景就露馅。
我的习惯是,在划分数据集之前,对全部样本做归一化处理和去重,再额外人工抽查一部分测试集样本,确保和训练集没有重叠。宁可测试集少一百条,也不能让评估信号失真。超参数调来调去,最终依赖的还是这个评测信号,如果信号本来就是脏的,那所有调参工作都等于白做。
6. 最后说点掏心窝的调参心得
在 Gemini 3 上折腾了这么多轮,我个人的体会是:超参数设置没有什么神奇公式,它更像是“在限制条件下找到最适合当前任务的平衡点”。这套限制条件包括你的显存、数据质量、任务目标、以及可接受的训练时长。做调参记录时,一定要把每个实验的 seed、数据版本、参数配置、评测结果完整记录下来。同一个配置,换一次数据清洗逻辑,结果都可能差出一大截,没有记录就没有复盘,没有复盘就很难有真正的进步。
最后再分享一个小技巧:每组实验跑完,不仅要看 loss 和评测分数,还要在固定评测集上看几遍生成结果。量化指标只能告诉你“好不好”,但只有肉眼见过一批输出,你才能知道模型是“因为学会而表现好”,还是“因为运气好在蒙对”。这份感觉,是任何指标都替代不了的。希望这篇 Gemini 3 超参数设置全攻略,能让你少走几个弯路,把有限的耐心花在真正值得打磨的地方。