Laya 微调教程:RLCD Notebook、置信度校准与自定义决策头

用自己的标注数据微调 Laya:免费 2xT4 Kaggle Notebook、RLCD 训练流程、温度校准、留出集评估,以及更轻量的替代方案。

最后更新: 2026/9/24

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.3620.3160.694
laya-multilingual(未微调)0.342–0.3520.439–0.4630.687–0.760
laya-typed-decisions(已微调)0.7660.0620.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,完整覆盖:

  1. 构建 state 与 typed question 数据集;
  2. RLCD 训练(proper scoring rule 奖励 + GRPO 风格的策略梯度);
  3. 拟合校准温度;
  4. 评估;
  5. 推送到 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.081laya-multilingual0.314 降到 0.106
  • laya-multilingual 发布时完全没有拟合温度
  • 已发布的 laya-typed-decisions 温度是在它自己的训练样本上拟合的,所以数值几乎都接近 1.0(issue #186)。现在的 Notebook 已经把这部分数据从训练中留出。

Notebook 会为每种题型(choicescorenoul)拟合一个 temperature,并从导出配置中删除继承来的 temperature_by_options——因为旧的分桶温度在推理时优先级更高,会悄悄覆盖掉新的拟合结果。

由此得出两条规则:

  1. 永远不要在训练数据上拟合校准,要用留出集。
  2. 在独立测试集上评估之后再宣称有提升。Notebook 修复的是配置持久化问题,它本身不能证明准确率或校准变好了。

从 0.3.12 开始,可以用 lang_temperatures= 为不同语言设置各自的温度。官方没有预置任何数值,需要你自己拟合。

如何设计微调数据集

以下建议是我们根据上游已知限制做的归纳,不是上游的 benchmark 结论:

  • 题目与线上完全一致instructions、选项 key 和描述都和实际服务时保持相同。
  • 单个 choice 题控制在约 20 个选项以内。所有选项共享固定的 head 预算(laya 为 192 token,其余 checkpoint 为 256)。标签更多时,拆成粗分类 + 细分类两题,或使用 predict_shortlist
  • choice 题不要用布尔词做标签true/falseyes/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 日。