桃子桃子快讯
←返回首页
工具

冻结编码器蒸馏小头实测:option 预算从 67.5% 拉到 76.0%

作者在冻结的 ModernBERT 上训练决策头,发现 label token 预算过小导致碰撞,将窗口按标签数重新分配…

2026.09.26 · 周六约 4 分钟阅读

在 r/MachineLearning 的一篇项目分享中,作者基于开源 ModernBERT(400M)编码器 Laya,把应用让 LLM 做出的封闭决策(选标签、yes/no、打分)蒸馏成挂在冻结编码器上的小决策头。整套流程包含每类决策训练 Laya 自带的 head(type embedding + 两层 transformer + 对选项 marker 打分)、在 holdout 上拟合温度、从覆盖率曲线上按目标一致性挑选工作阈值,并在阈值以下回退到 teacher 模型。作者在最近一周的测量中总结出三条经验。

1. 选项窗口过小,模型只读到约 3 个 token

Laya 给所有选项共享 192 个 token 的预算。在 banking77 这种 77 类的任务里,每类平均只剩 4 个 token 的位置,包含 marker 在内,declined_card_payment、declined_cash_withdrawal、declined_transfer 都被截断成 declined_。有 Reddit 评论者跑过 ModernBERT 的 tokenizer:带下划线的标签平均 6.48 个 token,在 3 token 截断下会有 18 个碰撞;换成空格分隔后平均 3.74 个 token,碰撞降到 7 个。作者随后的改动是把选项窗口按每个决策的标签数量单独分配,并在展示标签时换成空格,结果在 banking77 官方完整测试集(3,080 行)上的准确率为:

  • zero-shot Laya:38.2%(jevbench 样本)
  • 训练好的 head,192 token 预算:67.5%
  • 窗口按标签数单独分配:75.2%
  • 同上,48 个 epoch(在 holdout 上挑选):76.0%(±1.5)

作为参考,托管版 Jev 模型在 500 行 jevbench 样本上为 76.4%,完全微调的 ModernBERT-base 可达约 94%。也就是说冻结编码器本身就是天花板,head 的改动只能逼近这个上限。

2. 冻结编码器学语义,不学算术

作者测试了一条支付风控规则,对金额、小时、国家三个字段做判断,holdout 一致性只有 0.42。把同样的规则改写成关于这个客户的自然语言描述(「首次向该收款人转账、金额高于平时」),同样的行、同一个 head,一致性就拉到 0.94。这说明冻结编码器捕捉的是文本所表达的含义,而不是结构化字段之间的算术关系。

3. 与 teacher 一致不等于准确,加 gold 校验

作者新增了 report --gold 命令,让 head 和 teacher 一起和人工校验过的行对比,并把 head 可能训练过的行和未见过的行分开统计。在一个 banking 演示里,店铺见过的行上为 100%,新行上为 93.5%,这个差异说明不拆分统计会高估实际效果。在 holdout 上挑选的阈值迁移到新数据时,承诺一致性 99.1%、实际服务一致性 99.0%,其中 55% 的请求由本地 head 直接回答。

性能与资源

把每个决策的编码器输出缓存一次后,8,000 行上跑 24 个 epoch 在笔记本 RTX 5060 上耗时约 18 分钟。代码、数据脚本和全部数字已开源(Apache-2.0):github.com/bladedevoff/stuntd,浏览器 demo 挂在 HuggingFace Spaces:huggingface.co/spaces/pollix/stuntd。作者表示下一步打算解冻顶部编码器层(28 层中的第 26 层之后)同时保留缓存,看与完全微调之间的差距还能收窄多少。

信源