Laya训练原理揭秘:RLCD如何用严格评分规则逼出诚实概率?REINFORCE与 TD(λ) 更新完整详解
【免费下载链接】laya项目地址: https://ai.gitcode.com/hf_mirrors/convaiinnovations/laya
Laya 是一个多语言、非自回归的 System 1 决策模型:给它一段文本(邮件、工单、JSON)和若干"带类型的问题",它在单次前向传播(约 33ms)内返回带数学上校准的概率的答案。它的训练方法叫RLCD(Reinforcement Learning for Calibrated Decisions,面向校准决策的强化学习)——奖励函数采用严格 proper 评分规则,模型想多拿分,唯一的办法就是报告自己"真实的信念"。本文详解 RLCD 的评分规则、REINFORCE 更新与 TD(λ) 更新是怎么工作的,并附上 Laya 概率校准的实测证据。
1. Laya 是什么:只输出概率的决策模型
传统 LLM 做分类要"生成文字再解析",Laya 完全不走这条路:
- 每个选项各占一个
[MASK]标记,模型在每个标记位置给该选项打分,再对这道题的所有选项做 softmax,直接得到一份概率分布; - 答案空间在请求时定义——新增一套业务 schema 无需重训;
- 一次前向传播同时回答所有问题,10 问批量只需 72.3 ms(T4 GPU)。
结构上它是"预训练双向编码器(ModernBERT-large,395M)+ 从零训练的 2 层决策头",总共 421M 参数。这套架构定义在 rl_common.py 的DecisionModel中。
关键点:Laya 不"说出答案",而是"报出概率"。整个训练系统的设计目标,就是让这份概率报告尽可能诚实。
2. 为什么需要"诚实概率":校准问题
模型报 80% 不代表它真的对了 8 成 10。一个常见故障是:模型明明在乱猜,却报出 95% 的置信度——README 里就记录了 Laya 的英文检查点在 Khmer 文字上"0.000 准确率却配 0.952 置信度"的现象,此时靠置信度门控根本救不了你。
Laya 训练完的实测结果见 eval/results.md:14 个任务族整体 ECE(期望校准误差,越低越好)仅0.030,意图路由任务 ECE 低至 0.009。上图左半部分是可靠性曲线:蓝点几乎贴着灰色"完美校准"对角线,说明"模型报 0.6,就大约对 0.6";右半部分是风险-覆盖曲线(AURC 0.083),按置信度从高到低取答案,错误率上升非常缓慢——概率真的可以用在路由和分流上。
那么问题来了:怎么让模型学会不撒谎?答案在奖励函数里。
3. RLCD 核心一:严格 proper 评分规则
什么是"严格 proper"
严格 proper 评分规则有一个数学保证:给定你对世界的真实信念,唯一能最大化期望得分的报法,就是照实报告这份信念。报虚高、报保守、报"安全的中庸值",期望分数都会更低。评分规则一旦 strict proper,诚实就从道德要求变成了最优策略。
Laya 的奖励由三部分构成(实现见 rl_common.py 的proper_reward函数):
| 评分规则 | 适用问题类型 | 作用直觉 |
|---|---|---|
| Log score(对数得分) | 全部(choice / score / noul) | 重罚"把正确答案概率压到接近 0"——log(0.01) ≈ -4.6,一次严重误判痛不欲生 |
| Spherical score(球面得分) | 全部,权重 0.5 | 惩罚概率分布整体与真实分布"方向偏离",鼓励分布形状贴合 |
| RPS(排名概率得分) | 仅有序 score 题,权重 1.0 | 基于 CDF 比较,专治"等级题"上概率错位(比如把 3 分的题报成 1 分) |
以 noul(是非题)为例:若"真"的真实概率是 70%,报 70% 期望得分最高;报 90% 或 50% 都会掉分。模型没有任何"演技"空间,训练出来的概率分布只能越来越贴近真实。
探索:给 logits 加噪声
RL 训练需要探索。Laya 的做法很克制:在 logits 上叠加零均值高斯噪声再采样概率,让模型尝试不同的报告,但平均意义上不偏不倚——探索不会污染"诚实"的方向。
4. RLCD 核心二:REINFORCE + 组基线(GRPO 风格)更新
拿到奖励后,权重怎么更新?Laya 用的是经典REINFORCE策略梯度,并加了一个关键改进——组均值基线(GRPO 风格):
- 一组采样:同一条数据(同一状态 + 同一组问题)采样一组概率报告;
- 组内算奖励:每条报告各自按上节的 proper 评分规则打分;
- 减组均值:策略梯度方向 = (该条奖励 − 这组奖励的均值) × log 概率梯度。
减掉组均值这个基线,作用是把"这道题整体容易/难"的公共部分从梯度中剔除,只保留"这条报告比同组别的报告更好/更差"的相对信号。好处是梯度方差小、不需要额外训一个价值网络,这也是 GRPO 系方法的核心思想。
另外训练里还藏了两个实用细节:
- 选项随机洗牌:choice 题训练时每步打乱选项顺序,防止模型记住"第 2 个选项"这种位置偏见;
- act/escalate 决策头:模型还输出"自己处理 / 升级人工"的动作概率,答错成本在 rl_agent_config.json 里设为 3.0,升级成本 0.5——训练会学会"没把握就升级",这本身就是概率诚实的一种体现。
5. RLCD 核心三:TD(λ) 更新处理多轮对话
单条记录是 REINFORCE 用"最终奖励"回传即可,但多轮对话是个序列决策:同一个问题在对话第 1 轮、第 3 轮、第 5 轮看到不同长度的前缀,各自要报一份概率。奖励怎么分摊到每个前缀?
Laya 用TD(λ)(λ=1.0):
- 把一段对话切成多个前缀切片(配置 rl_agent_config.json 中
max_prefixes = 6); - 从最后一个前缀(结果已知,目标就是真实结局)往前递推:
G_t = (1−λ)·V_{t+1} + λ·G_{t+1},其中V_{t+1}是模型对下一前缀自己报的概率; - λ=1.0 时退化为蒙特卡洛回传:每个前缀的软目标都被最终结果"拉齐",但递推路径保证了信息从后向前平滑传播。
完整实现只有十几行,在 rl_common.py 的td_lambda_targets函数里。它输出的"软目标"(而非 0/1 标签)会直接作为 proper 评分规则里的真值分布——每个前缀学的是"在该信息量下,诚实的概率应该长什么样"。
6. 训练成果:零样本泛化与温度标定
训练完成后的检查点存于仓库根目录(model.safetensors,rl_agent_config.json 记录训练了 7313 步、约 2 小时、单卡)。两个值得新手知道的点:
- 零样本也基本诚实:完全没训过的任务族上 ECE 0.204,可靠性曲线整体仍贴近对角线(见下图),说明"诚实"是 RLCD 塑造出来的通用行为,而非任务内过拟合;
- 出厂略偏自信,温度标定一下就好:配置里按"(题型, 选项数)"分桶拟合了温度参数(如
choice:2桶 1.906、noul:2桶 1.983,见 rl_agent_config.json),把 ECE 从 0.466 压到 0.081。在自己的数据上复做一次温度拟合,再信任它的概率。
7. 总结:三条设计,一个诚实的决策器
| 组件 | 技术 | 解决什么 |
|---|---|---|
| 奖励函数 | Log + Spherical + RPS 严格 proper 评分 | 让"报真"成为唯一最优策略 |
| 策略更新 | REINFORCE + 组均值基线(GRPO 风格) | 低方差地学会把分布对准真值 |
| 序列任务 | TD(λ=1.0) 前缀切片回传 | 多轮对话中每轮前缀各自学会诚实 |
| 推理输出 | 每选项[MASK]打分 + 分桶温度缩放 | 毫秒级拿到可直接用于路由的概率 |
对新手来说,Laya 最值得借鉴的思路只有一句话:如果你要模型输出概率,就别指望它"自觉",把奖励函数设计成只奖励诚实,剩下的交给 REINFORCE。想深入阅读实现,建议按 rl_common.py(奖励与 TD 目标)→ rl_agent_api.py(推理与温度标定)→ eval/results.md(评测明细)的顺序走一遍。
【免费下载链接】laya项目地址: https://ai.gitcode.com/hf_mirrors/convaiinnovations/laya
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考