Sampling-Bias-Corrected Neural Modeling for Large Corpus Item Recommendations
现有主流推荐系统框架都是通过大物料下的用户信息、item 信息得到低阶特征向量,利用 NN 预测最终用户反馈。 往往模型优化目标都是最小化 batch loss,然而小样本采样往往都有有偏的「例如工业界常用的召回-排序链路,最后能透出的item是推荐系统认为好的item,天然有偏; 此外还有长尾效应问题」,学习有偏样本会使得模型优化方向摇摆,影响最终模型效果。此文提出一种能提供无偏估计并适应item分布变化的方案。「实时利用数据流中item频率实现纠偏」
背景
本文是在召回场景落地的一个纠偏方案。在目前主流双塔召回模型 (Figure 1, Figure2) 中,采用的架构是通过两个塔分别得到用户和item的向量表征,再通过点积「或其他距离度量方法」得到两个向量表征的相似度。该相似度近似看作用户对该 item 的倾向分。
这种双塔架构存在一个问题:正样本往往很好获得,用户只要点击了推荐样本就可以视作正样本。那么负样本应该怎么构建呢,一般有以下几种方案。
- 最简单的方案就是所有未点击的样本全部视做负样本。这个方案的问题在于 candidate 集合往往是巨大的,对这些 item 全部计算 embedding 再与 user 特征进行点积计算的计算量是不可承受的。
- 既然全集寻找不可行,那么 natural intutition 就是采样了。将未点击样本采样一个小集合作为负样本。既能解决计算量的问题,且在采样算法合理的前提下,原负样本的分布也能很好的表征在采样集合中。但是这个方法也有两个问题
- 样本会有热度;往往高热的样本会频繁出现在备选集合中,同理也就更容易透出给到用户。这样会不会导致正样本永远是那些大家喜欢或者说当前流行的内容呢?
- 系统会有自己的 bias;系统的 bias 类似一种道德规范的概念,不强制但限制。在整个推荐链路下最终会有系统自己的推荐倾向,如果不加限制。推荐系统就会越学越像自己,因为推荐系统只会学习自己认为是好的样本作为正样本。
主要工作
采样提到的两个问题其实都可以统称为 Sample Selection Bias(SSB),一种学术界常见的问题。该文章主要解决的就是这个问题,主要的工作内容有四点
- 流式频率估计:在数据流中,通过一种新式算法估计 item 的频率。在样本分布发生变化时能及时捕捉到样本动态信息
- 模型架构:介绍了一种通用的大型召回系统结构
- 在线实验:在 YouTube 线上服务应用了该系统结构
- 离线实验:离线证明了论文方法的实用性
具体方案
Algo 1其实就是双塔召回的基本流程,通过
u
(
.
,
θ
)
u(.,\theta)
u(.,θ) 得到用户向量表征,通过
v
(
0
,
θ
)
v(0,\theta)
v(0,θ) 得到item向量表征。设置学习率
γ
\gamma
γ和损失函数
L
B
L_B
LB 就可以串起整个双塔召回流程了。
Algo 2就是核心的采样流程了,维护两个长度为
H
H
H 的数组
A
A
A、
B
B
B,设置学习率
α
\alpha
α,利用第四步中的两个公式来计算每个item被采样的概率。核心思想是通过某个Item在模型中连续出现的 batch gap,估计 item 频率。例如:一个item第一次出现之后,下次出现是在50个batch之后,那么认为他的频率是
1
50
\frac{1}{50}
501,即0.02。
PS: A A A 用来记录上一次看见某个item是在什么时候, B B B用来记录item的频率。函数 h h h是一个hash函数,保证所有item都能映射到数组内。
在实际使用中,数组
A
A
A、
B
B
B的长度
H
H
H是固定的。 而且不会特别大,考虑hash collision的问题。样本的频率的准确性除了算法本身质量以外,还要考虑
H
H
H的大小,
H
H
H越大,算法越准。
文中用了一种多重hash的近似方案解决hash collision的问题。如 Algo 3 中所示,其实就是用了 m 个函数代替单个函数高频collision 的问题。