深入理解推荐系统:Position Bias

Position Bias现象:

在排序结果中,排在前面的结果通常能获取更高点击率,如图1(a);对于同一个结果,排在不同的位置,点击率也有差异,排在靠前的位置时,它的点击率也越高,另外排在尾部是点击率也较高,如图1(b)。在一个信息流中,我们可能更容易记住头部和尾部的内容,对中间的内容容易忽视。从而使模型对用户偏好的感知出现偏差,预估CTR不准,并进一步通过feedback loop造成马太效应。


解决方法

bias主要有两大来源:输入数据推荐机制。所以要进行debias,我们可以采取干预数据改进推荐机制两种方式。

干预数据的目的是为了获取无偏或者接近无偏的数据,但是,在很多场景下,我们无法获得无偏的数据,那么就只能从改进推荐机制入手,显式建模相应的bias或者对推荐结果施加debias约束

这里介绍一些实践工作中的解决方案:

1. 通过某位置的历史平均CTR计算位置效应

比如在计算item的历史CTRi_CTR_real)的时候,根据某种假设进行去除position bias。一个常见的假设是,把表现CTRi_CTR)看成是真实CTR(i_CTR_real)和位置效应的乘积,而位置效应所有item在某个位置p的CTR的平均值进行表示。

2. 位置信息作为特征

最常见的做法是在构建训练样本时,把展示位置信息作为特征,在线推断时,因为无法获取位置特征这一点,把展示的位置特征设置一个统一置的值,比如0。

离线训练时加入位置特征,在线不获取,能够使模型更好地学习其余特征和点击率之间的关系。需要注意的是位置特征不能与其他特征做交叉(这里的原因是否有读者知道?)。

补充:

  1. 不与其他特征做交叉的原因:这里实际上指的是不与其他特征的结果做运算。一般是在做sigmoid前,与其他特征经过一系列运算后的embedding concat到一起, sigmoid前的logit相当于是f(position) 和 f(non-position)的加权和。让non-position的部分学得更准。与其他特征做交叉,线上实验效果有时候是好的,之前遇到过。但是与user和item侧特征发生过多关系,可能会不稳定。
  2. 当加入受position影响的特征,可以先做基于位置的归一化。比如点击率,可以统计展示位置的历史ctr,归一,再交叉。
  3. 问:关于在训练时候加入位置信息,线上使用默认值。线下训练既然使用了位置,那说明最后的得分是受到位置特征影响的,线上拿不到这个特征,不就意味着,线上线下是有偏的么?实际效果是否有用?
    :对,是有偏的。可以这么理解,理想情况下,离线建模时把位置偏差都建模到了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

你可能感兴趣的:(深入理解推荐系统:Position Bias)