基于 Upworthy 的 A/B 测试训练标题排序模型、修正评估方法,并测试它与 Gemini 的对比效果以及向 Reddit 的迁移能力。
榜单
| 条目 | 得分 |
|---|---|
| ModernBERT, 2015 tail | 0.704 |
| 已撤回:2015 尾部数据 | 0.704 |
| ModernBERT, holdout | 0.637 |
| ModernBERT, exploratory | 0.624 |
| MSE | 0.637 |
| MSE, more data | 0.724 |
| Bradley-Terry | 0.775 |
| Bradley-Terry, more data | 0.787 |
| VERA, best-vs-worst | 0.812 |
| VERA, every pair | 0.689 |
| Linguistic features | 0.544 |
| Gemini 3.1 Pro | 0.751 |
| 人类 | ~随机水平 |
| Llama-3-8B LoRA | 0.469 |
| 邮件主题行 | 无公开数据 |
我梳理了基于新型决策模型构建的大约 300 个公开项目中属于“打分与排序”类的 26 个项目。这 26 个项目获取分数的方式全都是向模型提问:给这篇文章打分、评估这段文案、判断这篇文档是否相关。
我想用实际测得的结果来尝试这件事。我最终想给邮件主题行打分,因此预测哪个标题获得了更多点击似乎是个不错的切入点。
最终的产物是 NovusEdge/vera-deberta-v3-large11NovusEdge/vera-deberta-v3-large, huggingface.co,一个在 Apache 2.0 协议下发布的 435M 参数标题排序模型。它通过单次前向传播给文本打分。基础模型是 com-kotobalabs/open-jev-deberta-v3-large22com-kotobalabs/open-jev-deberta-v3-large, huggingface.co,一个在类型化决策(typed decisions)上预训练的 DeBERTa-v3-large。权重已经上传,想试试的话可以去看看。
| 指标 | 本模型 | 随机水平 |
|---|---|---|
| 未见划分集上的所有测试内配对 | 0.689 | 0.524 |
| 测试得出显著结论的配对(p<0.05) | 0.843 | 0.547 |
| 干净配对(无类似训练集文本) | 0.671 | 0.524 |
| 在 4–5 个变体中选出最佳 | 47.7% | 24.9% |
| 避开最差变体 | 90.3% | 75.1% |
| Reddit 标题配对(域外) | 0.522 | 0.500 |
只有 29% 的配对在 5% 水平下达到统计显著。第一行包含所有配对,包括那些观察到的点击率差异可能是噪音的配对。第二行则把评估限制在显著的配对上。
该模型拟合了 16,129 次随机标题实验中的 47,168 个实验组(arms)。上面的结果使用的是它未参与训练的数据。下文中的大部分运行记录使用的是更窄的评估方式:每个测试只取一对最佳对比最差的配对。我后来发现了这个错误;修正说明一节对其进行了阐述,上表汇报的是全配对准确率。
Upworthy Research Archive33Upworthy Research Archive, osf.io 自 2021 年起在 CC BY 协议下公开。它包含 2013 年 1 月至 2015 年 4 月期间进行的 32,487 次随机标题 A/B 测试,涵盖 5.38 亿次分发,以及每个变体的曝光量和点击量。没错,就是写出“你绝对想不到接下来发生了什么”的那帮人。他们的标题风格非常特定,但该档案库让我能把各个变体与实际点击量进行对比。
我一开始使用了 ModernBERT-large 加上一个回归头。目标是以每次测试自身均值为中心的收缩 logit 点击率(shrunk logit click rate)。文章本身决定了大部分点击率的方差,因此我想预测的是一个标题相对于该文章其他标题的表现。Beta-binomial 收缩会将估计值拉向测试均值,对于曝光量为 600 的组,其收缩力度比曝光量为 20,000 的组更强。
在单张 L4 上运行耗时 25 分钟,成本大约 40 美分。我在 confirmatory 划分集的 2013–2014 部分上进行训练,留出其 2015 年的测试,得到了 0.704 的成对准确率(pairwise accuracy)。
当时我把这个结果与多伦多一个团队用手工提取的语言学特征得到的 0.544440.544, journals.plos.org 做了对比。他们的论文称这个问题“本质上很难,不仅是样本量大小的问题”。这种对比也存在问题:他们的配对选择和研究问题与我的不同,这部分我会在前人工作里进行解释。
我把最初的结果记录为“标题信号在两年的漂移中依然有效”。
我原本以为 2015 年的结果表明模型能够应对标题风格随时间发生的变化。因为我最终想把它用在邮件上,所以我很关注它在训练数据之外的表现究竟如何。
该档案库有三个划分集:exploratory、confirmatory 和 holdout。到目前为止我只用过 confirmatory。在另外两个集上运行相同的权重得到了:
confirmatory 2015: 0.704
holdout: 0.637
exploratory: 0.624
在我检查的每一个效应量层级上,holdout 和 exploratory 的差异都在 0.013 以内。两者的得分都远低于 confirmatory 2015 年的数据集。
档案库文档说明测试是随机分配到这三个划分集中的。每个划分集几乎覆盖了整个时间段:
| 划分集 | 实验组数 | 日期范围 | 2015 年前占比 |
|---|---|---|---|
| confirmatory | 51,891 | 2013-01-24 → 2015-04-30 | 83.5% |
| holdout | 11,231 | 2013-01-24 → 2015-04-29 | 82.8% |
| exploratory | 10,804 | 2013-01-26 → 2015-04-29 | 83.8% |
holdout 中大约 83% 的数据来自训练时间段内,但那里的准确率却比 2015 年末尾部分低了 7 个百分点。因此,这个差距不能用“更新的标题更难预测”来解释。我在 confirmatory 内部基于日期的评估,不足以证明我此前所声称的时间泛化能力。
接下来我检查了数据泄露问题。Upworthy 在不同测试中复用了文章,因此随机分配可能会把相似的标题同时放入训练集和评估集中。
我的第一轮检查只查找了完全匹配,在 650 个标题中找到了 5 个共用标题。但这漏掉了近似重复的标题。我使用倒排索引测量了每个评估标题与 47,168 个训练标题之间的最大 Jaccard token 重叠度。
| 评估集 | n | 重叠度 ≥0.9 | 中位数 |
|---|---|---|---|
| confirmatory 2015 | 1,300 | 0.5% | 0.227 |
| holdout | 4,274 | 30.5% | 0.300 |
尽管 holdout 的准确率更低,但其近似重复项的比例大约是前者的 60 倍。剔除这些近似项后准确率为 0.646,略高于 0.637。这项检查既没有解释性能差距,也没有表明近似重复项带来了准确率提升。
我还检查了 holdout 是否曝光量更少或标签噪音更大:
| 评估集 | 中位曝光量 | 中位 z 值 | 中位 CTR 比率 |
|---|---|---|---|
| confirmatory 2015 | 2,462 | 2.37 | 2.24 |
| holdout | 3,096 | 2.64 | 1.99 |
Holdout 的曝光量更多,z 值也更高。2015 年的配对确实具有更大的中位 CTR 比率(2.24 对比 1.99),这可能让它们更容易区分。但我仍然无法完全解释这一差距,因此我将其记为“原因未明”,并将另外两个划分集所支持的约 0.63 作为基准。
随后我对比了增加训练数据与更换损失函数的效果。加入 exploratory 使可用训练集达到 62,695 个实验组。我在相同的 2,137 个 holdout 配对(每个测试取一组最佳对比最差的配对)上评估了每种配置。
Phase 0 confirmatory MSE 0.637
more-data expl+confirmatory MSE 0.724
rank confirmatory Bradley-Terry 0.775
rank+more expl+confirmatory Bradley-Terry 0.787
增加数据使准确率提升了 0.087。改用 Bradley-Terry 则提升了 0.138,且使用的是较小的训练集,训练轮数也从 3 轮减少到了 2 轮。
我之前一直在训练一个点击率回归器,然后评估它是否能正确给配对排序。排序损失函数显然更适合这种评估方式。
Bradley-Terry55Bradley-Terry, en.wikipedia.org 基于成对偏好进行训练。对于单次测试内的每一对实验组,我最大化 logsigmoid(score_winner - score_loser),并以曝光量较小那一组的对数曝光量进行加权。47,168 个训练实验组生成了 76,892 个测试内配对。
ModernBERT-base 以三分之一的参数量达到了 0.761,使其成为在 CPU 上运行的一个可行选择。
在决策任务上预训练的 DeBERTa-v3-large 变体最初并没有学到东西。在全部 4,804 步中,它的损失一直停留在 -log(0.5),得分仅为 0.519。
损失完全不下降让我去检查了训练设置。编码器加载正常,只有分类器和池化层是全新初始化的。
我复用了 ModernBERT 的 2e-5 学习率。在查阅到关于 DeBERTa 训练不稳定66DeBERTa 训练不稳定, github.com 的反馈后,我尝试了 6e-6。
在 6e-6 下,损失呈现 0.709 → 0.682 → 0.620 → 0.360 的下降走势。准确率达到了 0.812,比 ModernBERT 高出 2.5 个百分点,在最高置信度层级上更是达到了 0.913。
在通过近似重复过滤的配对上,它取得了 0.797 的得分,而 ModernBERT 为 0.769。过滤后它的准确率降幅也更小。
成对准确率并不能告诉我模型的选择能带来多少额外点击。这取决于各变体之间的差异大小。
对于每次测试,我将模型得分最高的实验组的实测点击率与该测试所有实验组的均值进行对比。均值代表均匀随机选择一个变体,并不代表编辑的选择。
| CTR | |
|---|---|
| 测试均值(无模型) | 1.20% |
| 模型选中的变体 | 1.42% |
| 理想上限(Oracle,完美选择) | 1.60% |
在 2,140 次测试中,这相当于 +18.3% 的相对点击率提升。
这 18.3% 的提升取决于 Upworthy 1.20% 的基础点击率以及其标题变体之间的差异离散度。对于点击率为 2.5% 且主题行差异更小的 B2B 邮件通讯(newsletter),我不知道能带来多少提升。
我还衡量了模型在一次测试中做出有用选择的频率。这些指标与绝对点击率的关联度较低,但仍需在其他受众群体上进行测试:
| 指标 | 数值 |
|---|---|
| 避开最差变体 | 90.3% |
| 优于测试平均水平 | 76.6% |
| 选中实际最佳变体 | 47.7% |
| 捕获的提升空间(中位测试) | 89.2% |
| Spearman 相关系数(得分 vs 点击率) | 0.526 |
90.3% 的情况下避开最差变体在这里很有用,相比之下随机选择为 75.1%。47.7% 的最佳变体准确率大约是 24.9% 随机基准的 1.9 倍。但这两个结果都不能证明它在邮件上的表现会如何。
捕获的提升空间差异很大:中位数是 89.2%,四分位距为 5% 到 100%,汇总值为 55.4%。较高的中位数并不意味着模型能捕获总可用收益的那么多。
我拟合了一个保序回归77保序回归, en.wikipedia.org(isotonic regression)来将得分映射到预期提升。它在不强加特定曲线形状的情况下拟合单调关系。Bradley-Terry 学习的是排序,它不会让原始得分变成校准后的点击率。我在测试级别进行了 bootstrap 自助抽样,因为同一测试内的实验组共用一篇文章,彼此并不独立。
| 得分 | 相比基线 | 90% 区间 |
|---|---|---|
| −2.72 | −19.1% | [−0.252, −0.209] pp |
| −1.06 | −8.2% | [−0.111, −0.086] pp |
| −0.20 | −0.7% | [−0.023, −0.000] pp |
| +0.56 | +3.7% | [+0.030, +0.056] pp |
| +1.62 | +11.1% | [+0.115, +0.147] pp |
| +2.82 | +21.8% | [+0.231, +0.274] pp |
中间区间的得分映射出与基线之间较小的估计差异。这些区间描述的是校准后的提升,而不是两个特定标题是否等价。
针对该档案库的其他研究采用了不同的任务、输入和评估子集:
| 来源 | 任务 | 指标 | 数值 | 随机水平 |
|---|---|---|---|---|
| LOLA,人类(n=4,571) | k 选 top-1 | 准确率 | ~随机水平 | 0.330 |
| LOLA,GPT-4 上下文学习 | k 选 top-1 | 准确率 | 0.400 | 0.330 |
| LOLA,LoRA Llama-3-8B | k 选 top-1 | 准确率 | 0.469 | 0.330 |
| LOLA,微调 GPT-4o | k 选 top-1 | 准确率 | 0.488 | 0.330 |
| arXiv:2506.0015288arXiv:2506.00152, arxiv.org,Pythia-12B | 显著配对,+ 导语 + 时间戳 | ROC AUC | 0.82 | 0.50 |
| PLOS ONE 028168244PLOS ONE 0281682, journals.plos.org | 按文章+配图+周匹配配对,K≤15 | 准确率 | 0.544 | ~0.50 |
| VERA | 所有测试内配对,仅标题 | 准确率 | 0.689 | 0.524 |
得出 0.544 的那篇论文根据文章、配图和测试周来匹配配对,然后对配对数超过 15 的实验进行随机二次抽样。它在 5,048 个配对上进行训练。这是一项注册报告(registered report),旨在测试预测是否能超越随机水平,因此直接将该数值与我模型的准确率对比会夸大我的成果。
Pythia-12B 奖励模型报告的 ROC AUC 为 0.82。它在 CTR 差异在 5% 水平下显著的配对(约占配对总数的 28%)上训练,并且除了标题外还会读取文章导语和发布时间戳。它的 AUC 和我的准确率不能直接等同,因此这些数字无法用来判定哪个模型更好。
我还没找到已发表的结果中,有仅使用标题文本、在未经过滤的测试内配对上报告微调编码器的成对准确率的。这使得本文成为一个有用的补充评估,但并不构成 SOTA(state-of-the-art)结论。
我在评估配对上运行了 Gemini 3.1 Pro 和 Laya 以进行直接对比。
我将每对标题输入两次(调换标题顺序),只有当两次顺序选择的都是同一个标题时才保留预测结果。这是为了检查位置偏差。下表报告了在一致配对上的准确率,以及在两种顺序下预测保持一致的比例;单看准确率会忽略系统未通过该检查的频率。
| 系统 | 参数量 | 匹配配对 | 自洽率 |
|---|---|---|---|
| VERA | 435M | 0.823 | — |
| Gemini 3.1 Pro | frontier | 0.751 | 83.7% |
| Laya typed-decisions | 421M | 0.504 | 52.9% |
在匹配配对上,VERA 的得分比 Gemini 高出约 7 个百分点,而每次调用的成本大约只有后者的千分之一。Gemini 的评估花费了 5.60 美元。我之前曾引用人类随机水平的表现作为证据,认为这对模型来说也会很难;Gemini 0.751 的表现并不支持这一假设。
Laya 得分为 0.504,在 52.9% 的配对上给出了前后一致的答案。它的 model card 涵盖了发票处理、安全事件、客户服务和 agent 轨迹。本次评估是在这些领域之外对其进行的测试,所以我不会用这个结果来评价它在那些任务上的表现。
在点击率差距未达到 5% 显著水平的配对上,Gemini 也取得了 0.641 的得分(随机基准为 0.500)。VERA 在该分层上的得分为 0.696。我之前一直把这些配对称为噪音,但未达到显著性阈值并不意味着没有预测信号。Gemini 并没有在这些标签上微调过;它的结果支持了这种区分,尽管这并不能排除 VERA 评估中存在数据泄露的可能。
Upworthy 的结果来自一家出版机构在 2013–2015 年间的病毒式社交媒体标题。我仍然希望给邮件主题行打分。
一份发送给 4,000 名订阅者的 B2B 邮件通讯是完全不同的场景,在 Upworthy 上表现良好并不能说明它在那里也能奏效。
为了进行初步的迁移测试,我使用了 SNAP 的 Reddit 数据集:涵盖 16,242 张图片的 132,308 条发帖,每张图片平均以不同的标题提交约 8 次。
这些发帖并不是随机分组的。我在相同图片和 subreddit 内构建配对,按 subreddit 拟合表现随重复发帖序号递减的趋势,并对残差进行排序。我只保留了残差差距足够大、能分出胜负的配对。
共 117,118 个配对。VERA 得分为 0.522。随机水平为 0.500。“更长标题获胜”规则的得分是 0.507。
将配对视为相互独立时的标准误差为 0.0015,比随机水平高出约 15 个标准误差。不过各个配对共用了图片,因此仅凭该计算不足以确立显著性。在残差差距四分位数间,准确率从 0.508 上升到 0.531,在 r/WTF 上为 0.495,而在 r/fffffffuuuuuuuuuuuu 上达到 0.558。无论如何,0.522 的准确率对于我想构建的应用来说都不够实用。
Reddit 的点赞数不是点击率,我也未对发帖时间和发帖人声誉进行控制。较弱的结果可能反映了迁移能力差、存在混杂变量,或者两者兼有。这让我没有理由对 Upworthy 之外的实用性能做出任何保证。
要直接测试邮件场景,我需要附带实际发送结果测量的邮件主题行。但我找不到适合训练的公开数据集:
| 来源 | 规模 | 可用性 |
|---|---|---|
| Return Path 主题行研究 | 900 万主题行 | 专有数据,2015 年,从未公开 |
| Belkins B2B 语料库 | 550 万封邮件 | 仅有聚合统计数据 |
| Yahoo (IEEE 7004277) | 10 万+ 主题行,数十亿次曝光 | 专有数据 |
| Oracle 的 NLORP 论文 | 300 条 | 从 Google 抓取,未测量点击率 |
| 各种 Kaggle “email campaign” 数据集 | 各异 | 模拟或合成数据 |
例如,Oracle 的论文使用的是“通过 Google 搜索从多个互联网来源收集的 300 多个特惠邮件的不同主题行”。这些都没有实测的比率数据。关于主题行长度或用词的汇总发现,也无法提供本训练设置所需的单次发送级标签。
训练数据是公开的,训练出这些权重的成本大约是 4 美元。这是一个可复现的实验,而我仍需验证这种方法在邮件上是否行得通。
拥有 A/B 测试日志的邮件服务提供商和 newsletter 运营者可以提供相关数据。我需要主题行变体及其测得的结果,以及一种在全新发送中评估预测的方法。我目前还没有搭建好这套环境。
我想在其他有记录结果的决策场景中尝试这种方法。如果你使用 Optimizely、Statsig 或 LaunchDarkly 等实验平台,你可能已经有了可用的候选变体和实验结果。一些潜在的任务:
| 决策场景 | 你已有的标签 |
|---|---|
| 主题行、标题、推送文案 | 打开量、点击量 |
| 客服宏模板选择 | 未升级工单即解决 |
| 检索重排 | 用户采纳了哪个结果 |
| 错误提示文案 | 自助解决还是提交了工单 |
| 商品列表标题 | 转化率 |
| Agent 工具选择 | 轨迹执行是否成功 |
我对 agent 的工具选择尤其感兴趣。Jev 的三个原语是 choice、score 和 noul;本实验使用的是 score。尝试使用 choice 需要记录可用选项、所选工具以及后续发生情况的日志。这些日志仍需检查是否支持公平的对比。
到目前为止,我只在一个任务上测试了基于结果训练与零样本判断的对比。我不知道这种优势在其他任务中是否依然成立。
Variant Evaluation from Real Analytics。
NovusEdge/vera-deberta-v3-large11NovusEdge/vera-deberta-v3-large, huggingface.co,Apache 2.0。
from transformers import AutoModelForSequenceClassification, AutoTokenizer
tok = AutoTokenizer.from_pretrained("NovusEdge/vera-deberta-v3-large")
model = AutoModelForSequenceClassification.from_pretrained(
"NovusEdge/vera-deberta-v3-large")
# Score a set of candidates for ONE piece of content. Higher wins.
enc = tok(candidates, padding=True, truncation=True, max_length=64,
return_tensors="pt")
scores = model(**enc).logits.squeeze(-1)
可以使用这些得分来比较同一内容的候选变体,例如单次发送的 3 到 6 个变体。最终模型学习的是测试内的相对排名,因此原始得分并不是质量的绝对度量,也不是点击概率。权重中还包含了一个基于 Upworthy 结果拟合的校准器。
另外还有一个较小的 ModernBERT-base 模型可供 CPU 使用。它以三分之一的参数量在最佳对比最差评估中取得了 0.761 的成绩。
我还没有在邮件上测试过这个模型,而且 Reddit 上的结果较弱。不应将 Upworthy 的得分视为邮件通讯的预期表现。
如果你运营一份 newsletter,且有以往发送的实测打开率或点击率数据,欢迎联系我。我很乐意测试一下,数据归你所有。
在 2026-09-24 复查评估代码时,发现了几处问题。
我的评估代码调用了 pairs_from,该函数在每次测试中只保留一对:表现最好与最差的实验组。而训练时构建了所有配对。因此 0.812 的结果仅衡量了每次测试中差距最大的一对。在全部 18,485 个测试内配对中,准确率为 0.689(基线为 0.524)。
| 配对集 | n | 长度基线 | VERA |
|---|---|---|---|
| 所有测试内配对 | 18,485 | 0.524 | 0.689 |
| 最佳对最差实验组(每个测试一对) | 2,137 | 0.546 | 0.812 |
我还用完全相同的流程跑了原版 microsoft/deberta-v3-large。它在同一集合上的得分为 0.805,对比 0.812,差异小于报告的 0.009 标准误差。这无法证明类型化决策预训练带来了收益。降低学习率对这两种基础模型都解决了训练问题。
上面的消融实验全部使用的是最初的 2,137 对数据集,因此它们在该评估基准下彼此具有可比性。但它们并不是全配对结果。
其他修正项:权重中附带的校准器之前是在另一次运行中拟合的;我的 bootstrap 在有放回抽样时使用了 .isin(),从而丢弃了重复样本;随机基准偏差了 2 个百分点,因为我之前没有根据实际实验组数量来计算它们。
开篇的表格汇报的是修正后的结果。早期的运行记录仍保留在上文的叙述中,并标明了其评估子集。
数据来源:The Upworthy Research Archive33The Upworthy Research Archive, osf.io。Matias, J., Munger, K., Le Quere, M.A., Ebersole, C. (2021), Nature Scientific Data。CC BY 4.0。因维护者在 2024 年披露的随机化失效问题,全文均排除了 2013 年 6 月 25 日至 2014 年 1 月 10 日期间进行的实验。权重 DOI:10.57967/hf/105739910.57967/hf/10573, doi.org。