Laya 微调教程:RLCD Notebook、置信度校准与自定义决策头
用自己的标注数据微调 Laya:免费 2xT4 Kaggle Notebook、RLCD 训练流程、温度校准、留出集评估,以及更轻量的替代方案。
Laya 的大部分价值来自微调。上游项目说得很直接:在 typed-decisions benchmark 上,基础 checkpoint 的 zero-shot 表现接近随机,而微调后的 checkpoint 在同样 2,000 个决策上达到 0.766。应该把 Laya 当成一个可以快速专项化的底座,而不是开箱即用的 zero-shot 决策引擎。
本文说明官方微调路径、这些数字该怎么理解,以及如何避开上游已经记录过的校准陷阱。
一手资料:Laya GitHub 仓库 与 laya-typed-decisions 模型卡。
为什么需要微调?
上游在 typed-decisions benchmark(400 个案例、2,000 个决策)上的结果:
| Checkpoint | 准确率 | Brier(越低越好) | Score MAE |
|---|---|---|---|
laya(未微调) | 0.362 | 0.316 | 0.694 |
laya-multilingual(未微调) | 0.342–0.352 | 0.439–0.463 | 0.687–0.760 |
laya-typed-decisions(已微调) | 0.766 | 0.062 | 0.242 |
| 每题多数类基线 | 0.461 | ||
| 随机猜测 | 0.318 |
在这个 benchmark 上,基础 checkpoint 甚至低于多数类基线,全部能力都来自在该 benchmark 自带的 1,200 条训练集上的微调。如果你的业务不属于这四类合成工作流(发票处理、安全事件、客户服务、Agent trace 观测),基本也需要用自己的数据微调。
准备工作
- 来自你业务领域的标注决策数据:每条包含一个 state(工单、邮件、JSON 文档)以及你关心的每个 typed question 的正确答案。
- GPU:官方 Notebook 面向 Kaggle 免费的 2 张 T4。上游给出的耗时约为 4 个 epoch、约 3 万个问题需要 4–5 小时。
- 一份模型从未训练过的留出评估集,并从中再划出一部分专门用于校准。
- Python 3.10+,并执行
pip install laya(见 安装 Laya)。
官方 Notebook
上游仓库提供了 laya_finetune_typed_decisions_2xT4_kaggle.ipynb,完整覆盖:
- 构建 state 与 typed question 数据集;
- 用 RLCD 训练(proper scoring rule 奖励 + GRPO 风格的策略梯度);
- 拟合校准温度;
- 评估;
- 推送到 Hugging Face Hub。
为了塞进 T4 的显存,Notebook 对 encoder 和决策头都开启了 gradient checkpointing。如果你写自己的训练循环,model.head_checkpointing = True 会为决策头开启激活重计算,encoder 的 gradient checkpointing 需要单独开启。
RLCD 训练原理
根据模型卡:策略输出各选项的概率分布,探索时在 logits 上加零均值高斯噪声,奖励是严格恰当评分规则(strictly proper scoring rule)——对数分 + 球面分,ordinal 的 score 题再加 ranked probability score。在严格恰当评分规则下,只有如实报告概率才能让期望奖励最大。参数更新使用带组均值基线的 REINFORCE,同时对教师分布做 soft cross-entropy。
落到实践上:Laya 被训练成输出"可以拿来设阈值"的概率——但前提是你先在自己的数据上检查校准。
校准:最容易被跳过的一步
上游明确指出,发布的 checkpoint 都偏过度自信:
- 在留出数据上为每个(题型, 选项数)重新拟合一个温度,
laya的平均 ECE 从 0.466 降到 0.081,laya-multilingual从 0.314 降到 0.106。 laya-multilingual发布时完全没有拟合温度。- 已发布的
laya-typed-decisions温度是在它自己的训练样本上拟合的,所以数值几乎都接近 1.0(issue #186)。现在的 Notebook 已经把这部分数据从训练中留出。
Notebook 会为每种题型(choice、score、noul)拟合一个 temperature,并从导出配置中删除继承来的 temperature_by_options——因为旧的分桶温度在推理时优先级更高,会悄悄覆盖掉新的拟合结果。
由此得出两条规则:
- 永远不要在训练数据上拟合校准,要用留出集。
- 在独立测试集上评估之后再宣称有提升。Notebook 修复的是配置持久化问题,它本身不能证明准确率或校准变好了。
从 0.3.12 开始,可以用 lang_temperatures= 为不同语言设置各自的温度。官方没有预置任何数值,需要你自己拟合。
如何设计微调数据集
以下建议是我们根据上游已知限制做的归纳,不是上游的 benchmark 结论:
- 题目与线上完全一致:
instructions、选项 key 和描述都和实际服务时保持相同。 - 单个
choice题控制在约 20 个选项以内。所有选项共享固定的 head 预算(laya为 192 token,其余 checkpoint 为 256)。标签更多时,拆成粗分类 + 细分类两题,或使用predict_shortlist。 choice题不要用布尔词做标签(true/false、yes/no),改用语义化的 key 或A/B这类中性 key。- 加入难负例和模棱两可的样本,让模型学会什么时候不该自信。
- 语言与 checkpoint 匹配:英文从
laya出发,其他语言(包括中文)从laya-multilingual出发。
社区实战案例
上游链接了一个浏览器 Agent 的完整专项化案例(文档):单张 16 GB GPU,不依赖任何付费 API。报告结果:在约 45 个候选元素中选中正确元素的 top-1 准确率从 zero-shot 的 0.10 提升到 0.66,真实任务成功率从 0% 提升到 62%,每步 17–23 ms。权重与流水线代码在 cklxx/laya-browser。
更轻量的方案:冻结 encoder,只训练决策头
如果完整的 RLCD 微调对你来说太重,社区项目 stuntd 把 Laya 部署在 Jev 兼容 API 之后,并用你自己的标注数据在冻结的 encoder 上为每个决策训练一个头,同时给出校准后的置信度阈值。作者报告一个 12 类意图任务从 zero-shot 的 89.5% 提升到训练后的 100%——这是该项目在它自己的任务上的数据。
微调之后
- 用
laya.load("your-org/your-checkpoint")加载,或通过router.attach(...)注册到Router。 - 按
confidence决定是否自动执行,低置信度的样本交给人工或更大的模型(见 Laya Python 指南)。 - 上游提示
action.act_probability目前还没有可用信号(#185),请以confidence为准。 - 每次更换 checkpoint、batch 设置或精度后,都要重新检查阈值。
相关阅读
最后核实:2026 年 9 月 24 日。