我们来自字节跳动飞书商业应用研发部(Lark Business Applications),目前我们在北京、深圳、上海、武汉、杭州、成都、广州、三亚都设立了办公区域。我们关注的产品领域主要在企业经验管理软件上,包括飞书 OKR、飞书绩效、飞书招聘、飞书人事等 HCM 领域系统,也包括飞书审批、OA、法务、财务、采购、差旅与报销等系统。欢迎各位加入我们。
本文作者:飞书商业应用研发部 黄兆龙
欢迎大家关注飞书技术,每周定期更新飞书技术团队技术干货内容,想看什么内容,欢迎大家评论区留言~
推荐系统的本质可以理解为是三个关键组件的反馈循环:User、Data、Model;
通过这个循环,用户和推荐系统之间处于一个相互动态进化的过程,用户的个人兴趣和行为通过推荐系统不断的得到更新,而推荐系统可以通过不断更新的数据自我学习。
Bias这个词在推荐系统中很常见,可以翻译为「偏差」,定义为学习算法的期望预测与真实结果的偏离程度。上面说到推荐系统本质上是一个反馈循环,那么在这个反馈循环的链路中每个结点都会导致不同类型的偏差。
第一类偏差是数据偏差,主要发生在user->data的阶段,那么为什么会发生这类偏差?
所以数据偏差的本质,就是训练数据集的分布和理想的测试集分布不一致;
蓝色线是训练的经验风险,红色线是理想的真实风险,
假设训练数据找到最优解f^T的时候,此时和理想的真实风险,仍然有△L的偏差;
选择偏差主要发生在用户的显示反馈中,比如需要用户对物品进行数字打分的场景(图书的星级评分,电影的喜好打分等场景),因为用户可以自由选择要评分的项目,因此我们收集到的打分数据是稀疏的,并不是所有数据的代表性样本,这就是选择偏差的定义。
导致选择偏差的原因主要有两点:
一致性偏差,同样也是发生在用户的显示反馈中,但同选择偏差不同的是,一致性偏差的原因并非是受观测到的数据所影响,更多是受人的“社会性”因素以及“从众效应”所影响,一致性偏差的定义如下:
一致性偏差发生在用户的行为往往趋于与“同组”的其他人相似,即使这样做违背了他们自己的判断,使得反馈并没有反映出用户的真实偏好。
假设《阿甘正传》我看完心里觉得只值2星:
- 显示反馈:比如评分、评级等行为,表示用户明确对物品的态度,数据准确性较高,但比较稀疏;
- 隐式反馈:主要反映在用户的自然行为中,比如查看、停留、点击、购买等等,数据量非常大,但准确性不足且包含噪声;
位置偏差也是发生在用户的隐式反馈中:用户倾向于与推荐列表更高位置的物品进行交互,无论物品的实际相关性如何,所以导致交互的物品可能不会高度相关,位置偏差在推荐系统中非常常见,尤其是广告系统和搜索引擎中。
归纳偏差是发生在数据到模型的训练阶段,是指为了让模型更好的学习目标函数以及泛化训练数据,我们不得不做出一些额外的假设而带来的偏差。
在矩阵分解算法里,会将用户和物品的交互估算成二者向量的内积,这就是一种假设;
在负采样的过程中,会采样一些hard数据来提升模型学习能力,要么由此产生的损失函数与原始的就会有所区别;
在label的选取上,用户对一个视频是否感兴趣,应该使用播放时长为目标,还是完播为目标,不同的目标都带来了不同的假设;
流行度偏差,简单来说热的更热,冷的更冷,受欢迎的物品被推荐的频率甚至比它们的受欢迎程度更频繁 ,为什么会出现这种偏差?
长尾效应在推荐系统中很常见,大多数情况下,一小部分流行的物品会占据大多数用户的交互,此类数据的训练将会导致热门物品的打分越来越高,推荐热门商品的频率甚至比数据集中显示的原始受欢迎程度还要频繁;
关于公平的一种定义:没有基于个人或群体的内在或后天特征而对他们有任何偏见或偏袒
那么推荐系统中不公平偏见,即是系统不公平的歧视某些个人或群体,以利好其他人;
不公平问题一直在推荐系统中很常见。特别是根据种族、性别、年龄、教育水平或财富等属性,不同的用户群体在数据中的代表性通常不平等。在对此类不平衡数据进行训练时,这些模型极有可能了解这些代表性过高的群体,在排名结果中强化他们,并可能导致系统性歧视并降低弱势群体的可见度;
推荐系统本质上就是一个循环,那么当循环的每个路径过程中都会发生偏差的情况下,就会变成恶性循环不断的放大Bias。
上面系统介绍了学术界常见的7种Bias,本文针对其中工业界最常见的3种bias总结了一些解决的方法。
第一类方式主要从模型评估的角度出发,引入IPS来纠偏
理想中的评估方式:
R(Z^)=1∣U∣∑u∈U1∣Gu∣∑i∈Guc(Z^ui)R(\hat{Z})=\frac{1}{|\mathcal{U}|} \sum_{u \in \mathcal{U}} \frac{1}{\left|\mathcal{G}_{u}\right|} \sum_{i \in \mathcal{G}_{u}} c\left(\hat{Z}_{u i}\right) R(Z^)=∣U∣1∑u∈U∣Gu∣1∑i∈Guc(Z^ui)
Gu\mathcal{G}_{u} Gu代表了和user相关的所有item的集合
但是由于曝光偏差,用户只观察到部分项目,因此模型通常根据有偏见的隐式反馈进行评估:
R^AOA(Z^)=1∣U∣∑u∈U1∣Gu∗∣∑i∈Gu∗c(Z^ui)\begin{aligned} \hat{R}_{\mathrm{AOA}}(\hat{Z}) &=\frac{1}{|\mathcal{U}|} \sum_{u \in \mathcal{U}} \frac{1}{\left|\mathcal{G}_{u}^{*}\right|} \sum_{i \in \mathcal{G}_{u}^{*}} c\left(\hat{Z}_{u i}\right) \\ \end{aligned} R^AOA(Z^)=∣U∣1u∈U∑∣Gu∗∣1i∈Gu∗∑c(Z^ui)
Gu∗\mathcal{G}_{u}^{*} Gu∗代表了那些被曝光给用户的物品集合;
为了解决这个问题,我们可以给每一条隐式反馈的数据增加一个反向的倾向分ρui\rho_{u i} ρui。直觉的做法就是降低曝光数据的权重,同时提升未曝光数据的权重。因此,基于IPS的无偏评估的定义如下:
R^IPS(Z^∣ρ)=1∣U∣∑u∈U1∣Gu∣∑i∈Gu∗c(Z^ui)ρui=1∣U∣∑u∈U1∣Gu∣∑i∈Guc(Z^ui)ρui⋅sui\begin{aligned} \hat{R}_{\mathrm{IPS}}(\hat{Z} \mid \rho) &=\frac{1}{|\mathcal{U}|} \sum_{u \in \mathcal{U}} \frac{1}{\left|\mathcal{G}_{u}\right|} \sum_{i \in G_{u}^{*}} \frac{c\left(\hat{Z}_{u i}\right)}{\rho_{u i}} \\ &=\frac{1}{|\mathcal{U}|} \sum_{u \in \mathcal{U}} \frac{1}{\left|\mathcal{G}_{u}\right|} \sum_{i \in \mathcal{G}_{u}} \frac{c\left(\hat{Z}_{u i}\right)}{\rho_{u i}} \cdot s_{u i} \end{aligned} R^IPS(Z^∣ρ)=∣U∣1u∈U∑∣Gu∣1i∈Gu∗∑ρuic(Z^ui)=∣U∣1u∈U∑∣Gu∣1i∈Gu∑ρuic(Z^ui)⋅sui
在实际应用中,该方法是否有效主要取决于IPS的设计,如果设计不好,可能会引入更大的人为偏差;
第二类方式主要是在模型训练中修正bias的方式,为了可以从隐式反馈提取负例的数据,一种直观的策略是把所有未曝光的数据都当做负例,但是每条数据需要赋予一个置信度的权重。
我们的目标函数通常可以这么表示:
L^W=1∣U∣∣I∣∑u∈U,i∈IWuiδ(r^ui,sui)\hat{L}_{W}=\frac{1}{|\mathcal{U}||\mathcal{I}|} \sum_{u \in \mathcal{U}, i \in \mathcal{I}} W_{u i} \delta\left(\hat{r}_{u i}, s_{u i}\right) L^W=∣U∣∣I∣1∑u∈U,i∈IWuiδ(r^ui,sui)
WuiW_{ui} Wui表示置信度权重,控制(u,i)(u,i) (u,i)有可能存在交互行为的概率
那么问题的核心就变成了置信度的权重该如何设计,通常有如下几种常见的方式:
核心思路:
sui=0s_{ui}=0 sui=0的时候,Wui =c (0<c<1)W_{ui} = c (0< c <1) Wui =c (0<c<1)
缺点:
核心思路:通过采样的方式来控制哪些数据可以进行模型训练以及这些数据的训练频次,假设采样概率为puip_{ui} pui,那么损失函数等价于:
E(u,i)∼p[δ(r^ui,sui)]=∑u∈U,i∈Ipuiδ(r^ui,sui)\mathbb{E}_{(u, i) \sim p}\left[\delta\left(\hat{r}_{u i}, s_{u i}\right)\right]=\sum_{u \in \mathcal{U}, i \in \mathcal{I}} p_{u i} \delta\left(\hat{r}_{u i}, s_{u i}\right) E(u,i)∼p[δ(r^ui,sui)]=∑u∈U,i∈Ipuiδ(r^ui,sui)
那么采样分布其实就等价于我们的置信度权重;
关于位置偏差的消偏方式,主要有两大类方法:
第一类方法是在模型中引入position的信息,在模型训练中进行消偏;
position作为特征(Airbnb的做法):
如果不去除position bias,那么用户对一个item的ctr是由user engagement(用户偏好)和position bias共同造成的。如果能够将user engagement和position bias独立开来,将有助于提升模型的推荐质量。
YouTube提出的做法类似wide&deep,即添加一个浅层网络(shallow tower),输入position feature, device info(原因是在不同的设备上会观察到不同的位置偏差), 以及其他能够带来位置偏差的特征,输出为position bias分量。这就将user engagement和position bias 独立开来了。
在主模型的输出层的sigmoid激活函数之前,加上浅层网络的bias分量。训练的时候,随机丢掉10%的位置特征,防止模型过度依赖位置特征。预测的时候,直接丢掉浅层网络。
首先有这样的假设:如果用户点击了某个物品,那么一定是“看到了”该物品,并且对该物品感兴趣,那么用户对于物品i在位置p点击的概率可以表示为:
P(C=1∣u,i,p)=P(C=1∣u,i,E=1)⏟rui⋅P(E=1∣p)⏟hp\begin{aligned} &P(C=1 \mid u, i, p) \\ &=\underbrace{P(C=1 \mid u, i, E=1)}_{r_{u i}} \cdot \underbrace{P(E=1 \mid p)}_{h_{p}} \end{aligned} P(C=1∣u,i,p)=ruiP(C=1∣u,i,E=1)⋅hpP(E=1∣p)
基于该假设,就可以分开建模:
其中:ProbSeen部分是预估广告被用户看到的概率,pCTR部分是用户看到广告后,点击广告的概率,然后loss是两者的结合:
L (θps,θpCTR) =1N∑i=1Nl(yi,bCTRi)=1N∑i=1Nl(yi,ProbSeeni×pCTRi)L \left(\theta_{p s}, \theta_{pCTR}\right) =\frac{1}{N} \sum_{i=1}^{N} l\left(y_{i}, bCTR_{i}\right)=\frac{1}{N} \sum_{i=1}^{N} l\left(y_{i}, \operatorname{ProbSeen}_{i} \times p C T R_{i}\right) L (θps,θpCTR) =N1∑i=1Nl(yi,bCTRi)=N1∑i=1Nl(yi,ProbSeeni×pCTRi)
线上servering的时候,直接预估pCTR即可(ProbSeen都看作是1);
PAL的设计其实和ESMM非常类似,都是将事件拆解为两个概率事件的连乘,只不过PAL的假设过强,某些场景下这样的假设并不合适。
PAL和shallow tower的区别在于PAL是连乘概率,而shallow tower是类似wide&deep的相加。
第二类方法是用通用的IPS方法来解决,引入和位置相关的倾向分,来对训练loss进行调权,
LIPS(f)=∑u∈U,i∈I1ρ(q)suiλ(u,i∣f)L_{\mathrm{IPS}}(f)=\sum_{u \in \mathcal{U}, i \in I} \frac{1}{\rho(q)} s_{u i} \lambda(u, i \mid f) LIPS(f)=∑u∈U,i∈Iρ(q)1suiλ(u,i∣f)
我们引入和位置q相关的ρ(q)\rho(q) ρ(q)来作为每个instance的loss的权重,这个模型背后的直觉是,那些用户更难看见的物品(比如排序更靠后的物品)应该赋予更大的权重,以此来弥补偿位置偏差的影响。
关于流行度偏差的消偏方式,主要有几种方法:
利用对抗学习的思路,设计一个判别器D来抵消这种偏差,提升长尾数据的曝光机会;
判别器D的输入有两个,
一个是生成的“流行-长尾”pair对(i~p,i~n∣u)\left(\tilde{i}^{p}, \tilde{i}^{n}\mid u\right) (i~p,i~n∣u),通过推荐系统的结果生成;
一个是真实的“流行-长尾”paire对(ip,in)\left(i^{p}, i^{n}\right) (ip,in),通过全局的共现采样中得出;
通过推荐模型G和判别器D的对抗训练,可以让判别器D学出流行物品与长尾的潜在联系,同时让推荐模型G能够学到和用户历史相关的长尾物品。从而为用户推荐各种长尾物品。
因果图是反事实推理的有力工具,假设用户的点击取决于兴趣和流行度,那么可构建如图a的因果图:
在实际应用过程中如图b,可以将用户和物品的Emebdding解耦为兴趣Embedding和流行度Embedding,利用多任务的框架训练,让兴趣Embedding和流行度Embedding尽可能独立,空间足够远,最终在线上应用的时候,可以只用兴趣的Embedding,以此来消除流行度偏差。
扫码发现职位&投递简历