位置偏差指的是:在用户 / item 不变的前提下,把同一条内容放在不同位置,用户的点击概率会系统性变化——这部分变化是由位置本身引起的,而不是内容质量变化引起的。
1.Recommending What Video to Watch Next: A Multitask Ranking System(google)
2.PAL: A Position-bias Aware Learning Framework for CTR Prediction in Live Recommender Systems(华为)
一、Google:Recommending What Video to Watch Next
1. 消偏的核心思想
YouTube 的“下一个看什么”模型使用线上日志训练,日志里存在明显的 selection bias / position bias:
排在前面的候选被看见、被点击的概率更高,并不完全因为它质量更高,而是因为上游系统已经给过“加成”。
这篇文章的思路,可以概括为一句话:
把“观测到的点击”拆成“内容本身的效用(utility)”和“各种展示条件带来的偏置(propensity)之和,在模型结构中用两个塔分别建模。
形式上,相当于在 logit 上做一个分解:
logit(CTR(x,bias_feat))=fmain(x)+gbias(bias_feat)
- fmain(x):用户–视频的“真实偏好”(希望尽量去掉位置等偏差);
- gbias(⋅):位置、设备、候选来源、上一版系统评分等造成的偏移。
训练时,两者相加来拟合日志中的点击;
排序上线时,可以选择只依赖 fmain(x),或者显著弱化/归一化 gbias,从而达到“减小偏差”的目的。
2. 具体实现结构
- Main Tower:多任务 MMoE Ranking 网络
- 输入:用户特征、历史行为(watch history)、候选视频特征、上下文特征等;
- 结构:embedding → shared-bottom DNN → MMoE(多个专家 + 每个任务各自的 gate);
- 输出:多个任务头(click、watch time、满意度等)。
- 这部分主要为 学习稳定的用户–视频表达,且要兼顾多个优化目标。
- Shallow Tower(Bias Tower):浅层偏差网络
- 输入:只选与 selection bias 强相关的特征:position、上游排序分、设备、入口、语言等;
- 结构:一到两层的小 DNN;
- 输出:一个标量偏置 gbias,加到 main tower 的 logit 上。
- 特征 Dropout:防止“全靠位置解释点击”如果简单把 position 交给 shallow tower,模型可能会走“捷径”:直接用位置来解释大部分点击,main tower 反而学不到有效的内容信号。因此训练中在 bias 特征上做较强的 dropout(或者给 shallow tower 很低的容量、较强正则),让 main tower 也必须承担足够的解释力。这样 fmain(x) 更接近“去位置偏差”的效用。
- Serving 策略
- 在排序阶段,常见做法是 不给 position 相关特征,或者固定为统一值,从而弱化甚至移除 gbias 对排序的影响;
- 如果某些模块确实需要“带偏的真实 CTR”(例如收益评估),还可以单独把 bias tower 再加回去算一个“现实 CTR”。
3. 各部分在消偏中的作用
- Main Tower:主要承载“真实兴趣”的建模,是最终用于排序的核心分数;MMoE 解决多目标之间梯度冲突,使这个表示尽可能稳定、泛化好。
- Shallow Tower:把短期、强烈、但结构较简单的 bias(位置、入口、曝光策略)吸收入一个可控制的通道,避免 main tower 对这些因素过拟合。
- Bias 特征 Dropout / 小容量设计:强迫 main tower 不得不解释一部分点击信号,否则 shallow tower 会把所有监督“吃掉”,去偏效果就会失真。
4.实验结果
1.训练样本的分布,被点击的样本其位置特征越靠前
2.最后的position bias符合预期,越靠前,其position bias越大,当推理去除时,对靠后的样本,补偿就越大,起到一个debias 的作用
5.评价
- 偏差建模是“隐式”的,而不是严格的因果建模虽然直观上可以解释为“utility + propensity”,但从优化上看只是对 logit 做了一个可学习的分解,没有任何硬约束保证 fmain 就是真实效用、gbias** 就是纯粹偏差**。两者之间存在可交换性:网络完全可以把一部分内容效用塞进 bias tower,只要整体 loss 不变。
- 能够处理的不只是 position bias,而是一揽子的“条件偏差”从工程角度很灵活,但从理论上说,它把所有与展示条件相关的因素统统扔进一个 shallow tower,难以区分各类 bias 的贡献,不适合做精细的公平性/因果分析。
- sample selection bias 仍然存在模型仍旧在上一版推荐系统生成的候选上训练,这天生带来 selection bias(没被召回的 item 没有 label)。shallow tower 只是在 ranking 这一层做了结构上的消偏,对候选生成阶段的偏差基本无能为力。
- “消偏效果”高度依赖工程细节例如:bias 特征放哪些、dropout 比例多大、shallow tower 容量如何设定、线上是否真的去掉 bias 特征等。这些并没有统一理论指引,更多依赖经验和 A/B 实验。
二、华为:PAL(Position-bias Aware Learning)
1. 消偏的核心思想
PAL 背景更具体:在一些线上业务中,训练 CTR 模型时可以使用 position 特征,但排序预测阶段并不知道最终位置——先要根据 CTR 排序,排序结果再决定位置。这就产生了典型的“训练有位置、预测没位置”的矛盾。
工业界常见的粗暴做法:
- 训练时让模型使用位置特征;
- 预测时给所有候选一个“默认位置”(比如 1、5、10),用该位置值喂进模型。
不同默认位置会得到完全不同的排序结果,且很不稳定。
PAL 的核心思想是把点击拆成两个阶段的概率乘积,并对每一项分别建模:
p(click∣x,pos)=p(seen∣pos)⋅p(click∣x,seen)
再做两个关键假设:
- “是否被看到”只由 position 决定即 p(seen∣x,pos)≈p(seen∣pos);
- 在已经被看到的前提下,点击与 position 无关即 p(click∣x,pos,seen)≈p(click∣x,seen)。
如此一来:
- 第一项是纯粹的 位置曝光概率;
- 第二项可视为 “在所有 item 都被同样看见”时的真实兴趣点击率。
训练阶段用乘积来拟合日志 CTR,
排序阶段直接用第二项 p(click∣x,seen),自然就不再需要位置特征。
2. 具体实现结构
- ProbSeen(pos):位置曝光模块
- 输入:position(可能再加少量页面级上下文);
- 结构:embedding → 小型 DNN → sigmoid 输出到 [0,1];
- 含义:学“该位置下被真正注意到的概率”,近似传统点击模型里的 examination 函数。
- pCTR(x):条件 CTR 模块
- 输入:用户、item、上下文等特征,但 不包含 position;
- 结构:任意现成 CTR 网络(DeepFM / Wide&Deep / DIN等);
- 输出:在“已看到”的前提下,点击概率。
- 联合训练
p^(y=1∣x,pos)=ProbSeen(pos)×pCTR(x)
- 使用普通二分类交叉熵对观测到的 click label 做监督;
- 两个模块参数一次性 end-to-end 更新。
这种训练方式保证了两部分在同一个目标下联合适配,而不是“先估曝光率,再单独训 CTR”。
- Serving 策略
- 排序阶段只上线 pCTR 模块:score = pCTR(x);
- 如果系统某处需要“带位置”的现实 CTR,可再用离线学习到的 ProbSeen(pos) 补回。
3. 各部分在消偏中的作用
- ProbSeen:显式承担位置偏差的建模任务,是 PAL 的“偏差塔”。
- pCTR:负责学习“内容兴趣 + 用户偏好”,在结构上完全与 position 解耦,是 PAL 想要的“去偏 CTR”。
- 乘积形式:保证这两个模块都在概率域是可解释的;与加法形态相比,这更像传统 exam–click 模型:先看见,再点击。
4. 批判性评价
- 核心假设过于理想化
- 实际上,用户是否“看到”一个推荐,不仅取决于位置,还取决于 item 的显眼程度、封面、标题长度、用户滚动速度、屏幕大小等;更合理的应是 p(seen∣x,pos),而不只是 pos。
- 即便在“已被看到”条件下,位置仍可能影响点击,例如:首条更可信、后面的更像广告,等等。这些都会违背“点击与 position 无关”的假设。
- 因此,PAL 在理论上是一个比较“干净”的分解,但在现实业务中一定会有系统偏差残留在 pCTR 模块里,消偏效果取决于场景是否“近似满足”这些假设。
- 存在可辨识性问题数学上,如果把 ProbSeen 整体乘以常数 c,再把 pCTR 整体除以 c,乘积不变,loss 一样小。这说明两个模块在纯数据层面并不是强可辨识的。实际训练中,谁负责什么,很大程度依赖于:
- 这会导致结果对实现细节很敏感,很难保证“ProbSeen 真的是位置曝光概率”。
- 只能处理“位置”这一维的偏差在很多业务里,selection bias 来自多种因素:入口、流量策略、探索策略、历史曝光频次等。PAL 把 bias 完全归因于 position,无法显式建模其他偏差来源;这些因素要么被 pCTR 强行吸收,要么只能另想办法处理。
- 训练数据仍来源于偏置系统PAL 没有改变训练样本本身“来源于旧系统排序”的事实,因此在候选集选择层面的偏差仍旧存在,只是对 position 这一维度做了结构化处理。
三、两篇工作在消偏上的共同点与差异
共同点
- 都承认:日志里的点击混杂了“用户真实偏好”和“展示条件偏差”,不能直接当作“公平的真实喜好”;
- 都采用了 “主塔 + 偏差塔” 的结构分解:
- 主塔强调内容/用户的效用;
- 偏差塔强调位置、入口、上游系统排序等引入的倾斜;
- 排序上线时,都倾向于 只用主塔(或显著弱化偏差塔)来提高公平性和泛化。
差异
- 分解形式不同
- Google:logit 加法,偏差与效用是可加的;
- PAL:概率乘法,偏差是“被看到概率”,效用是“看到后的点击概率”,解释接近经典点击模型。
- 偏差塔输入的范围不同
- Google 的 shallow tower 可以吃多种 bias 特征(位置、上游排序分、设备等),更工程化;
- PAL 的 ProbSeen 只吃 position,更专注但也更受限。
- 在“训练有位置、预测无位置”问题上的针对性
- Google 方案更像是“即便预测时还有 position,我也让模型知道它只是偏置的一部分,有机会在 serving 时关掉它”;
- PAL 则直接从概率分解出发,设计出一个在结构上就可以天然“训练有位置、预测不需要位置”的框架。
实践经验
当前采用 shallow tower 引入位置特征,并与主塔通过加法或乘法进行交互,本质上是在整体样本分布下学习不同位置对应的平均点击贡献。然而在真实数据中,位置与内容质量高度相关,靠前位置天然聚集了用户更感兴趣的内容,靠后位置则相反,因此 shallow tower 学到的并非纯粹的位置因果效应,而是位置偏置与内容分布偏置的混合结果。训练阶段引入 shallow tower、推理阶段将其移除,会导致模型在训练与推理阶段的函数形式不一致,主塔参数已隐含依赖 shallow tower 的补偿效果,从而难以保证去除的仅是位置贡献。
无论采用加法还是乘法交互,该问题本质上都无法通过建模形式解决,实际表现往往是训练指标改善有限、线上效果不稳定,目前认为该类基于相关性分解的位置消偏思路在当前数据分布下存在根本局限。
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作! |