`pref_beta` 0.1、`pref_loss` sigmoid:偏好对齐那一组参数

2026-08-09

本文所有事实以 hiyouga/LlamaFactory 官方仓库 2026-08-09 的内容为准。我们没有安装、训练或部署过任何模型,文中数字均为仓库源码里写着的值。

做偏好对齐的时候,最先撞上的往往不是算法名,而是一串以 pref_ 开头的字段。pref_beta 默认 0.1pref_loss 默认 "sigmoid"——这两个值写在 src/llamafactory/hparams/finetuning_args.pyfield(default=...) 里。它们的特点是:你不在 YAML 里写,它们也在。

这篇只做一件事:把偏好对齐那一组参数的确切名字、确切默认值和它们所处的层级说清楚,并且把我们不知道的部分明确划出去。这篇不给调参建议。 这组值该设成多少,取决于你的数据和硬件,官方没有给通用值,我们也没有训练过任何模型,编不出来。

先定位:它们住在超参目录的哪一层

LlamaFactory 把超参按职责拆开放在 src/llamafactory/hparams/ 下,我们实读这个目录,里面是 8 个文件:

src/llamafactory/hparams/
  __init__.py
  data_args.py
  evaluation_args.py
  finetuning_args.py
  generating_args.py
  megatron_bridge_args.py
  model_args.py
  parser.py
  training_args.py

偏好对齐这一组在 finetuning_args.py 里。这个归属不是细节,它决定了你写配置时该把这些字段和什么放在一起想:它们和 stagefinetuning_type 是同一层的东西,而不是数据侧(data_args.py)或生成侧(generating_args.py)的字段。同一件事在不同层有不同取值的情况,这个仓库里是有的,所以先把层级钉住,能省掉不少”我改的到底是哪个”的困惑。

需要说明的是,megatron_bridge_args.pyparser.pytraining_args.py 这三个文件我们没有抽取过里面的字段,所以本文不描述它们的内容——只写”目录被拆成了 8 个文件”这一层结构事实。

与本篇直接相关的那九行

源码里这一片区域实际上是”偏好对齐与 RL”混编的,PPO 的那几个字段和参考模型、奖励模型的字段也在附近。这篇只取和偏好损失直接相关的九行,ppo_ 开头的那几个字段与参考/奖励模型那一组字段我们另有一篇专门讲,这里不整表搬过来。

参数默认值
pref_beta0.1
pref_ftx0.0
pref_bco_weight0.0
pref_loss"sigmoid"
dpo_label_smoothing0.0
kto_chosen_weight1.0
kto_rejected_weight1.0
simpo_gamma0.5
ld_alphaNone

这九个值都是从 field(default=...) 里读出来的,可以逐字对照。需要提醒的是,这里列的是默认值,不是推荐值——源码写下一个默认值这件事本身,不构成”这个值适合你”的任何依据。

字段名的前缀本身就是一层信息

把这九个名字按前缀排一下,能看出一个分层:

  • 不带具体算法名的四个pref_betapref_ftxpref_bco_weightpref_loss。前缀统一是 pref_,也就是”偏好”这个更上位的词,而不是某个具体方法的名字。
  • 带具体算法名的四个dpo_label_smoothingkto_chosen_weightkto_rejected_weightsimpo_gamma。名字里直接挂着 DPO、KTO、SimPO。
  • 谁也不像的一个ld_alpha

这个观察的用处很实际:当你在别人的配置里看到一个陌生字段,先看它的前缀是通用的还是挂算法名的,就能大致判断它属于”这一组共用的旋钮”还是”某个具体方法专有的旋钮”,找文档时不至于搜错方向。

这只是字段命名层面的观察。命名上的分层不等于实现上的分层,我们没有读过这些参数在代码里的使用逻辑,也不知道哪些字段在哪些组合下会被读到。到这里就停,不往下推。

三个 0.0、两个 1.0,和一个 None

把这九个默认值按”数值形状”再看一遍,有三处值得单独记:

三个 0.0pref_ftxpref_bco_weightdpo_label_smoothing 的默认值都是 0.0。它们在各自的公式里取零值意味着什么,属于实现细节,我们没有读过,不做解释。

两个 1.0 且相等kto_chosen_weightkto_rejected_weight 的默认值都是 1.0。这是一组成对出现、默认值对称的参数——这是参数表层面的客观对照,不是任何效果判断。

一个 Noneld_alpha 的默认值是 None,和其余八个”默认就是一个具体数字”不同。None 的含义不是”零”,而是”不显式设置时由代码另行决定”,具体决定成什么,我们没有读过那段逻辑,不推断它等于多少。顺带一提,同一个文件里 lora_alpha 的默认值也是 None,是同一种写法;同样地,我们也没有读过它的取值逻辑。

这个区别在读别人配置时很容易踩:一个字段”配置里没写”,可能意味着它取的是一个确定的默认数字(比如 pref_beta 就是 0.1),也可能意味着它走的是 None 分支、值由代码在运行时决定。这两种”没写”不是一回事。

为什么这里有 simpo_gamma,训练目录里却没有 simpo

有一处交叉对照值得写下来:train/ 目录下并没有独立的 orposimpo 目录,而 finetuning_args.py 里却明确有 pref_loss(默认 "sigmoid")和 simpo_gamma(默认 0.5)这样的字段。

把这两件事放在一起,能得到一个结构性的结论:这一类方法是通过偏好损失相关的参数来表达的,而不是各自占一个独立的训练阶段目录。这个结论来自目录结构与参数命名的交叉对照,仅此而已——再往下的算法细节,我们没有读过实现,一个字都不写。关于目录结构这条线索本身,我们另有一篇专门讲。

默认值一直在,但”什么时候起作用”是另一回事

同一个文件里还有两个字段值得和这一组并排看:stage 默认 "sft"finetuning_type 默认 "lora"

把两件事并置:默认的训练阶段是 "sft",而上面那九个偏好参数的默认值也一直写在那儿。这两者之间在什么条件下互相作用、哪些字段在哪个阶段才会被读到,属于代码逻辑,我们没有抽取,不推断

你能确定的只有一件事,而且这件事对复现别人的配置很有用:配置文件里没写某个字段,不等于这个字段没有值。 你照抄一份别人的 YAML,看到里面没有 pref_beta,不代表这次训练里没有 pref_beta 这个东西——它就是 0.1。要判断两份配置是不是真的等价,得把”显式写出来的”和”落到默认值的”一起比,只 diff 文件是比不全的。

那到底该设成多少

直说:我们不知道,这篇也不打算编。

理由有三条。第一,我们没有安装、训练或部署过任何模型,没有任何可以支撑”建议值”的依据。第二,源码里能读到的是默认值,默认值和推荐值是两码事——一个框架把 pref_beta 写成 0.1,说明的是”不设它就取这个数”,不是”这个数在你的任务上合适”。第三,这类参数的取值和你的数据分布、基座模型、硬件条件都相关,我们在仓库文档里没有读到一份通用取值表。

所以这一步只能靠你自己。我们能替你做的只有一件事:把起点标准了——pref_beta 就是 0.1pref_loss 就是 "sigmoid",这两个值不是我们猜的,是 field(default=...) 里写着的。至于往哪个方向动、动多少,官方没给通用值,我们也不编。看到别人给的具体数字,先问一句它是从哪读来的:是源码默认、是某篇论文、还是对方自己跑出来的经验?出处不同,可迁移性完全不同,这一点我们同样不替你判断。

想自己核一遍,两条路

路一,直接读文件。 打开 src/llamafactory/hparams/finetuning_args.py,搜字段名,看它的 field(default=...)。本文这九行就是这么来的。

路二,看命令行帮助。 参数与默认值会随版本变动,最终应以下面这条命令在你本地环境里的实际输出为准:

llamafactory-cli train -h

两条路对不上的时候,以你手上这个版本的实际情况为准——我们只能保证本文对应的是 2026-08-09 那天仓库里的内容。

小结

这一组参数的信息量其实集中在三个点上:它们统一住在 finetuning_args.py 这一层;pref_ 是跨方法共用的前缀而 dpo_ / kto_ / simpo_ 挂着具体算法名;ld_alpha 是这一组里唯一默认 None 的字段,与另外八个默认为具体数字的性质不同。

剩下的事情——每个系数在损失里怎么参与计算、在什么数据上该往哪个方向调——我们没有依据,就不写。把默认值记准,比记住一堆来路不明的”经验值”更有用。


本文依据 LlamaFactory 官方仓库(github.com/hiyouga/LlamaFactory)的 README、data/README.mdexamples/ 下的配置与 src/llamafactory/hparams/ 的参数定义整理,核对日 2026-08-09。本文内容为仓库源码与文档口径,我们没有安装、训练或部署过任何模型,文中显存数字均为官方标注的估算值(README 原文标 * estimated)而非实测占用。参数与默认值随版本变动,请以 llamafactory-cli train -h 的实际输出为准。

想系统学会用 AI?报名体系课或加入会员,照着学、照着用。