前半段解释公开设计;小实验使用完全虚构的候选(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
- 结果之间在主题、来源或其他指定维度上有多大差异