Position Bias现象:
在排序结果中,排在前面的结果通常能获取更高点击率,如图1(a);对于同一个结果,排在不同的位置,点击率也有差异,排在靠前的位置时,它的点击率也越高,另外排在尾部是点击率也较高,如图1(b)。在一个信息流中,我们可能更容易记住头部和尾部的内容,对中间的内容容易忽视。从而使模型对用户偏好的感知出现偏差,预估CTR不准,并进一步通过feedback loop造成马太效应。
解决方法
bias
主要有两大来源:输入数据与推荐机制。所以要进行debias,我们可以采取干预数据与改进推荐机制两种方式。
干预数据的目的是为了获取无偏或者接近无偏的数据,但是,在很多场景下,我们无法获得无偏的数据,那么就只能从改进推荐机制入手,显式建模相应的bias或者对推荐结果施加debias约束。
这里介绍一些实践工作中的解决方案:
1. 通过某位置的历史平均CTR计算位置效应
比如在计算item的历史CTR
(i_CTR_real
)的时候,根据某种假设进行去除position bias
。一个常见的假设是,把表现CTR
(i_CTR
)看成是真实CTR
(i_CTR_real
)和位置效应
的乘积,而位置效应
用所有item在某个位置p的CTR的平均值进行表示。
2. 位置信息作为特征
最常见的做法是在构建训练样本时,把展示位置信息作为特征,在线推断时,因为无法获取位置特征这一点,把展示的位置特征设置一个统一置的值,比如0。
离线训练时加入位置特征,在线不获取,能够使模型更好地学习其余特征和点击率之间的关系。需要注意的是位置特征不能与其他特征做交叉(这里的原因是否有读者知道?)。
补充:
- 不与其他特征做交叉的原因:这里实际上指的是不与其他特征的结果做运算。一般是在做sigmoid前,与其他特征经过一系列运算后的embedding concat到一起, sigmoid前的logit相当于是f(position) 和 f(non-position)的加权和。让non-position的部分学得更准。与其他特征做交叉,线上实验效果有时候是好的,之前遇到过。但是与user和item侧特征发生过多关系,可能会不稳定。
- 当加入受position影响的特征,可以先做基于位置的归一化。比如点击率,可以统计展示位置的历史ctr,归一,再交叉。
-
问:关于在训练时候加入位置信息,线上使用默认值。线下训练既然使用了位置,那说明最后的得分是受到位置特征影响的,线上拿不到这个特征,不就意味着,线上线下是有偏的么?实际效果是否有用?
答:对,是有偏的。可以这么理解,理想情况下,离线建模时把位置偏差都建模到了position相关的部分,其余部分学习到的就是没有偏差的参数了。把它当做第二、三两种方法的简化版本就容易理解了。效果得看具体场景,我们有的场景拿到效果,有的没有。
3. 位置信息作为子网络
单独用一个子网络建模position bias
,线上serving时关闭该部分
通过一个shallow tower
(可理解为比较轻量的模型或者子网络)来预测位置偏置信息,输入的特征主要是一些和位置偏置相关的特征。在最后的sigmoid
前,将shallow tower
的输出结果加入进去。而在预测阶段,则不考虑shallow tower
的结果。(相当于考虑了一些和position相关的特征以及交叉特征的整体影响)
4. 完全展示随机化的结果:
最简单的干预数据的方法,就是在推荐时展示完全随机化的结果,使得用户点击行为排除结果相关性的影响,仅仅与position有关,以此获取需要的训练数据。
原理也可以理解为随机呈现推荐结果,获得的数据即为position bias的预测结果,计算出position bias,作为修正项参与Training和Serving。
缺点:实际工作场景往往是对已有推荐算法的场景进行优化,所以比较少会采用这种方法,(大场景可考虑单独一路的ABTest来专门生成该类训练数据);
5. 对训练数据进行各种加权处理
直接对rank排名较高的样本在迭代时进行降权处理
QA:
问:感觉前面三种方法没有本质区别呀,都是把pos当做一个特征,不管是不是有单独的pos小网络
答:对,从大的方向上是这样,经典的方式是隐式建模position,另外两种是利用子模块显式建模position
问:离线感觉如何评价?
答:我们离线测的时候position是置空的,和线上保持一致;如果测试的时候也用了position,auc是提升的
参考地址:https://zhuanlan.zhihu.com/p/145448160?from_voters_page=true