前半段解释公开设计;小实验使用完全虚构的候选(candidate)、分数和向量。

预测行为,不等于定义价值

候选已经拿到了。现在有两个不同问题:这一条值不值得看?和旁边几条放在一起,还值不值得看? 前一个偏单条预测,后一个是列表决策。下面的小实验会让你亲手改后者,而不重新训练模型。

Twitter Heavy Ranker 的 2023 年公开说明采用多个行为预测,再按配置合成分数。这里重要的不是记住某年的系数,而是区分模型预测什么和产品希望鼓励什么。固定版本的 Heavy Ranker 说明

教学上可以先写成:

$$s(u,i)=\sum_{a}w_a\,\hat p(a\mid u,i).$$

$u$ 是用户,$i$ 是候选,$a$ 是一个行为任务。$\hat p$ 预测这个行为发生的概率,$w_a$ 决定排序时给它多大权重。两者都需要检查:概率是否校准(calibration)?行为是否真代表满意?多个行为相关,直接相加会不会重复奖励(reward)同一件事?这不是把“喜欢”测量成了一个客观真值。

模型没变,排序也能变

只保留点赞和“不感兴趣”的预测概率。最后两列按“点赞 − 惩罚系数 × 拒绝”计算,所有数字都是虚构的。

候选 点赞 拒绝 惩罚 2 惩罚 5
A 0.20 0.04 0.12 0.00
B 0.12 0.01 0.10 0.07

惩罚系数从 2 改成 5,B 就排到 A 前面了,但模型对两个行为的预测都没变。这只能说明选择偏好变了,不能说模型更准了。合成分数也不是概率,可以为负,不必加起来等于 1。

这里乘的是这个用户发生该行为的预测概率,不是帖子已经收到多少个赞或举报。若加入阅读时长这类连续预测,还要另说单位和缩放,不能把它直接叫作行为概率。

排序目标和训练损失是两回事

多任务模型可以分别学习点击、收藏、拒绝等标签;每个任务的可观测范围和缺失机制不同。训练时的 loss 权重控制优化,服务时的 $w_a$ 控制分数组合,二者不必相同。

如果一条行为没被记录,不能不加区分地当成 0。先弄清曝光(exposure)、采样、标签窗口和 task mask,再讨论多加几个 head 有没有价值。多目标设计不是近几年才出现的问题,YouTube 2019 的多任务排序论文已经讨论了目标冲突与选择偏差。

一屏不是若干独立分数的和

3 篇几乎一样的摄影教程,单看可能都不错,连着出现却重复。可以在选下一条时给“与已选内容太像”一个惩罚。下面是教学用的贪心重排,不是 Twitter 或 X 的线上公式:

$$g(i\mid S)=s(i)-\lambda\max_{j\in S}\max(0,\cos(v_i,v_j)).$$

$S$ 为空时,惩罚为 0;之后每选一条都重新算。它只考虑最像的那条,不保证最终选出全局最优的列表。

不启用 JavaScript 也可以读这个结论:当 $\lambda=0$ 且不限制作者时,示例选出 A、B、C;它们都属于 ML。增加惩罚后,列表可能换入其他主题,但平均原始分也可能降低。

看结果时别只盯着“更散”

观察 能说明什么 不能说明什么
主题更多 覆盖到更多人工设定的类别 用户一定更满意
Embedding 距离更大 在这套表示里更不相似 真实语义一定不同,或内容一定与用户相关
平均原始分下降 偏离原打分目标 新列表一定更差
同作者不重复 满足作者约束 内容质量或观点多样性(diversity)已经解决

把不相关内容加进去也能让向量变散。所以要把相关性、覆盖和列表体验放在一起看,再用受控实验检验。参数扫过一遍,不等于找到了普遍最优的多样性强度。

多任务头多了,标签也真的多了吗?

下面是一份虚构的训练小表。先假设曝光已确认、两个动作的日志都完整、观察窗口也已结束;明确点击“不感兴趣”才算本例的拒绝动作。

记录 点赞标签 / mask 拒绝标签 / mask 解释
点赞,没有拒绝动作 1 / 1 0 / 1 0 只表示窗口内没有该动作
明确不感兴趣,没有点赞 0 / 1 1 / 1 有拒绝证据,不是随机未曝光项
两个动作都发生过 1 / 1 1 / 1 若产品允许,两项可以同时为 1
仅进入候选,没有曝光 — / 0 — / 0 不知道会不会喜欢,也没观察到拒绝

“没有点赞”不是“不喜欢”,“没有拒绝”也不是“喜欢”。 两个任务预测各自的动作,不是把用户分成互斥的两类。若日志不完整或窗口没结束,只把无法确认的任务 mask 掉;它们不必共用同一个 mask。

若把最后一行全补 0,多挂几个 head 也没增加真实信号,只是让模型更用力地学习我们的假设。而且,mask 只是避免把未知写成已知,不会消除曝光策略带来的选择偏差。

Loss 到底除以多少?

一种明确的教学约定是:每个任务只对自己的有效样本求均值,再加权。

$$N_a=\sum_n m_{na},\qquad L=\sum_{a:N_a>0}\alpha_a\, \frac{\sum_n m_{na}\,\ell_{na}}{N_a}.$$

$n$ 是样本,$m_{na}\in\{0,1\}$ 表示这条标签是否可用,$\ell_{na}$ 是该任务的逐样本损失,$\alpha_a$ 是训练权重。某个任务在这批没有标签时,跳过这一项,并把标签数记为 0;不要把它报成“loss 为 0,所以预测完美”。

例如,点赞任务的 3 个有效 loss 是 [0.2, 0.6, 0.4],均值为 0.4;拒绝任务是 [0.1, 0.3, 0.5],均值为 0.3。权重设为 1 和 0.5,总 loss 就是 0.55。再加一条两个任务都未知的样本,分子和分母都不该变。多卡训练也应按全局有效数计算,不能在各卡标签数量不同的时候直接平均各卡均值。

求均值仍不能保证任务间没有干扰,要一起看有效标签数和梯度。训练权重 $\alpha_a$ 与前面的排序权重 $w_a$ 是两回事:把服务端的拒绝惩罚调大,可能减少令人反感的内容,也可能压低探索,需要分别检查。

自测

换了多样性权重,为什么不能说模型学会了更多兴趣?

本例没有训练模型,也没增加候选,只改了选择顺序。表示、召回覆盖和列表选择是不同层面。

同作者上限和向量相似度惩罚能互相替代吗?

不能完全替代。一个作者也能写不同主题,不同作者也可能发重复内容;两种约束需要分别解释和验证。

下一期:今天的推荐系统改了什么。

本页术语 5
候选 candidate
召回阶段捞出来、等待精排挑选的内容
校准 calibration
模型给出的置信度是否等于真实正确率
奖励 reward
RL 里指导策略更新的标量信号
曝光 exposure
内容真的被展示给用户这件事,和「被检索到」不是一回事
多样性 diversity
结果之间在主题、来源或其他指定维度上有多大差异