LlamaFactory:PPO 的六个参数与四个参考/奖励模型字段
本文所有事实以
hiyouga/LlamaFactory官方仓库 2026-08-09 的内容为准,参数默认值全部来自src/llamafactory/hparams/下源码的field(default=...),仓库身份数字来自同日的 GitHub 仓库信息。我们没有安装、训练或部署过任何模型,也没有读过 PPO 的实现代码,因此本文只谈字段名与默认值,不谈算法。
很多人翻 LlamaFactory 的 PPO 相关资料,翻到的都是”PPO 是什么”,而真正卡住动手的那一步往往更土:配置文件里到底该写哪几个键、不写会是什么值、奖励模型是从哪个字段进来的。 这篇只回答后面这类问题。
先把边界说死:我们读的是 src/llamafactory/hparams/finetuning_args.py 与 model_args.py 里的参数定义,不是 PPO 的训练实现。所以下文出现的每一个数字都可以逐字核对,但你不会在这里看到任何”这个值调大会怎样”的说法——那需要读实现、需要跑训练,两件事我们都没做。
先把”六个”怎么数说清楚
以 ppo_ 为前缀的字段一共五个:
| 参数 | 默认值 |
|---|---|
ppo_buffer_size | 1 |
ppo_epochs | 4 |
ppo_score_norm | False |
ppo_target | 6.0 |
ppo_whiten_rewards | False |
第六个不带这个前缀,但它决定你这次训练走的是哪条线——就是 stage。stage 的源码默认值是 "sft",同一处的 finetuning_type 默认是 "lora"。也就是说,一份什么都不写的配置,跑的是 LoRA 的 SFT,跟 PPO 没有任何关系;要走 PPO 这条线,stage 必须显式改掉。
这五个 ppo_ 字段本身能读出来的信息其实很有限,但都是硬事实:两个布尔字段 ppo_score_norm 与 ppo_whiten_rewards 默认都是 False,即默认不开;ppo_target 是这一组里唯一的浮点数,默认 6.0;ppo_buffer_size 默认 1、ppo_epochs 默认 4 是整数。
我知道你想问这两个布尔开关打开之后有什么区别。老实说:我们没有读过实现,说不了。 该设成什么,取决于你的数据和硬件,官方也没有给出通用值。这类问题唯一靠谱的做法是回 llamafactory-cli train -h 看当前版本对这些字段的说明,而不是听任何人(包括这篇文章)转述。
参考模型与奖励模型:七个字段,六个默认 None
这是 PPO 这条线上真正需要你填东西的地方。同样在 finetuning_args.py 里,一共七个字段:
| 参数 | 默认值 |
|---|---|
ref_model | None |
ref_model_adapters | None |
ref_model_quantization_bit | None |
reward_model | None |
reward_model_adapters | None |
reward_model_quantization_bit | None |
reward_model_type | "lora" |
这张表的结构一眼就能看出来:参考模型侧三个、奖励模型侧四个,前三个是完全对称的命名——*_model 指路径或名称,*_model_adapters 指适配器,*_model_quantization_bit 指量化位数。奖励模型侧多出来的那一个是 reward_model_type,也是这七个里唯一一个默认值不是 None 的字段,默认 "lora"。
标题里说的”四个”指的就是奖励模型侧这四个;参考模型侧另有对称的三个,加起来是七个。写配置时把这两侧分开记,比记一个”七”要省事。
值得单独强调的是那六个 None。它的字面含义只有一条:你不写,它就是 None,不是”框架会替你挑一个”。至于代码拿到 None 之后做什么,我们没有读那段逻辑,不做推断。
这不是我在故意留白。同一个文件里就有一个现成的例子:lora_alpha 的默认值也是 None,而不是某个具体数字——意味着不显式设置时由代码另行决定。这段逻辑我们同样没读过,所以也不会告诉你它”其实等于多少”。把 None 当成”未指定”来理解,比当成”某个隐藏默认值”要安全。
量化字段为什么在两个文件里各有一套
这是配置分层上最容易踩的一处:同一件事——量化——在 LlamaFactory 里有不止一套字段名,分属不同文件。
finetuning_args.py 这边,参考模型和奖励模型各自带一个自己的量化位数字段:ref_model_quantization_bit 和 reward_model_quantization_bit,两个都默认 None。
而主模型的量化字段在 model_args.py:
| 参数 | 默认值 |
|---|---|
quantization_method | QuantizationMethod.BNB |
quantization_bit | None |
quantization_type | "nf4" |
double_quantization | True |
quantization_device_map | None |
从命名上看,这是三套独立的字段:主模型一套、参考模型一套、奖励模型一套。它们各自具体怎么被加载逻辑消费,我们没有读,不推断。但仅就”配置该写在哪”这件事而言,结论已经够用了——**quantization_bit 和 reward_model_quantization_bit 是两个不同的键、住在两个不同的文件里,写配置时要分别落笔。**至于写了一个之后另一个会不会被牵动,属于加载逻辑,我们没读,不推断。
顺带记一个已经被官方文档印证过的对照:double_quantization 的源码默认值是 True,而 README 在 Ascend NPU 那一节让用户显式设 double_quantization: false。默认是开着的,所以那条提示才有必要存在。这个前后对照本身就说明了一件事:源码默认值和示例配置/文档提示里的值不总是一回事,动手前两边都要看一眼。
reward_model_type 与 finetuning_type 的默认值撞在一起
一个从默认值表里直接读得出来的对照:reward_model_type 默认 "lora",finetuning_type 也默认 "lora"。
这只是两处默认值恰好相同这一客观事实,我不会替源码解释它们之间有没有约束关系——那需要读校验逻辑。对写配置的人来说有用的是:这两个键管的是不同的东西(一个说奖励模型怎么来,一个说你这次微调怎么做),改其中一个不等于改了另一个,检查配置时要分别核对。
顺手定位一下 PPO 在参数表里的邻居
ppo_ 那五个字段并不是孤立的,同一个文件里还住着偏好对齐那一族,比如 pref_beta 默认 0.1、pref_loss 默认 "sigmoid"、pref_ftx 与 pref_bco_weight 都默认 0.0、simpo_gamma 默认 0.5、dpo_label_smoothing 默认 0.0、kto_chosen_weight 与 kto_rejected_weight 都默认 1.0,另有一个 ld_alpha 默认 None。
之所以把这些一并列出来,是因为它们和 ppo_* 挤在同一份参数定义里,肉眼扫配置时很容易串行——尤其是 pref_beta 和 ppo_target 这种都带”目标/系数”意味的名字。真正区分它们的不是含义猜测,而是前缀:ppo_ 开头的归 PPO,pref_ / dpo_ / kto_ / simpo_ 开头的归偏好损失那一族。
这里有一个结构性的观察值得记住:train/ 目录下并没有独立的 orpo / simpo 目录,而参数这边却有 pref_loss 和 simpo_gamma 这类字段。也就是说,这类方法是通过偏好损失参数表达的,不是独立的训练阶段目录。这个结论来自目录结构与参数命名的交叉对照,再往下的算法细节我们不写。关于这一点我们另有一篇专门讲,这里只是帮你在参数表里定位——PPO 的五个字段和这一族是同层的兄弟,不是包含关系。
想自己核对时,去哪个文件查
src/llamafactory/hparams/ 目录实读下来一共 8 个文件:data_args.py、evaluation_args.py、finetuning_args.py、generating_args.py、megatron_bridge_args.py、model_args.py、parser.py、training_args.py,外加一个 __init__.py。仓库把超参按数据、模型、微调、生成、评测、训练、Megatron 桥接分成了这几个文件。
本文涉及的字段全部来自其中两个:ppo_*、stage、finetuning_type、参考/奖励模型七件套在 finetuning_args.py,量化那一组在 model_args.py。megatron_bridge_args.py、parser.py、training_args.py 里的字段我们没有抽取,不做任何描述。
最后补一句身份信息,方便你对上版本:截至 2026-08-09,hiyouga/LlamaFactory 的 star 是 73947、fork 9049、open issues 1109,许可标注 Apache-2.0。star 数只说明被收藏过多少次,跟这些参数默认值稳不稳定没有关系。另外仓库内部新旧写法并存,LLaMA-Factory(带连字符)和 LlamaFactory 都能见到,搜 issue 时两种拼法都试一遍。
参数会随版本变。 这篇里的每个默认值都标了出处,但真正说了算的是你本地那个版本的 llamafactory-cli train -h。把这张表当成”知道该找哪些键”的索引,而不是当成可以照抄的配置。
本文依据 LlamaFactory 官方仓库(github.com/hiyouga/LlamaFactory)的 README、data/README.md、examples/ 下的配置与 src/llamafactory/hparams/ 的参数定义整理,核对日 2026-08-09。本文内容为仓库源码与文档口径,我们没有安装、训练或部署过任何模型,文中显存数字均为官方标注的估算值(README 原文标 * estimated)而非实测占用。参数与默认值随版本变动,请以 llamafactory-cli train -h 的实际输出为准。