解决的问题
解决推荐系统中的召回问题,标准的方法就是通过采样进行极大似然估计。然而真实的推荐系统通常存在严重的曝光偏差,而极大似然估计从长期来讲会加重曝光偏差,而不合适的采样和特征选取会使得item表示学习效果打折扣。本文提出了CLRec,一种对比学习范式,来解决召回阶段的曝光偏差。
问题形式化
推荐系统的召回阶段范式为学习一个用户行为encoder
f
θ
(
x
)
∈
R
d
f_\theta(x) \in R^d
fθ(x)∈Rd和一个item encoder
g
θ
(
y
)
∈
R
d
g_\theta(y) \in R^d
gθ(y)∈Rd,每个encoder的参数是
θ
\theta
θ的自己。然后我们会用item encoder搭建一个k最近邻搜索服务,例如faiss。然后在线上服务中,给出任意用户行为序列
x
x
x,我们就可以召回相关的top k个item。多数实现中都会用内积或cosine距离作为度量相似度的分数。这种召回范式在训练阶段通常令极大似然估计来拟合数据:
arg min
θ
1
∣
D
∣
∑
(
x
,
y
)
∈
D
−
l
o
g
p
θ
(
y
∣
x
)
\argmin_\theta\frac{1}{|D|}\sum_{(x, y)\in D}-logp_\theta(y|x)
θargmin∣D∣1(x,y)∈D∑−logpθ(y∣x)
其中
p
θ
(
y
∣
x
)
=
e
ϕ
θ
(
x
,
y
)
∑
y
′
∈
Y
e
ϕ
θ
(
x
,
y
′
)
p_\theta(y|x) = \frac{e^{\phi_\theta(x, y)}}{\sum_{y'\in Y}e^{\phi_\theta(x, y')}}
pθ(y∣x)=∑y′∈Yeϕθ(x,y′)eϕθ(x,y)
p
θ
(
y
∣
x
)
p_\theta(y|x)
pθ(y∣x)将所有可能取值的item对进行求和,这在实际场景中是很难实现的,因此需要通过采样来进行近似,于是训练样本就会出现曝光偏差,以至于通过MLE训练出来的模型对点击较少的item不友好。
目前为减轻这种曝光偏差有以下几种方法,我们称之为逆向加权(inverse propensity weighting):
sampled softmax sampled softmax有很多种变体,其中最常用的tensorflow的实现:
arg min
θ
1
∣
D
∣
∑
(
x
,
y
)
∈
D
−
l
o
g
e
x
p
(
ϕ
θ
(
x
,
y
)
−
l
o
g
p
n
(
y
∣
x
)
)
e
x
p
(
ϕ
θ
(
x
,
y
)
−
l
o
g
q
(
y
∣
x
)
)
+
∑
i
=
1
L
e
x
p
(
ϕ
θ
(
x
,
y
i
)
−
l
o
g
p
n
(
y
i
∣
x
)
)
(
2
)
\argmin_\theta \frac{1}{|D|} \sum_{(x, y) \in D} -log \frac{exp(\phi_\theta(x, y)-logp_n(y|x))}{exp(\phi_\theta(x, y)-logq(y|x))+ \sum^L_{i=1}exp(\phi_\theta(x, y_i) - logp_n(y_i|x))} (2)
θargmin∣D∣1(x,y)∈D∑−logexp(ϕθ(x,y)−logq(y∣x))+∑i=1Lexp(ϕθ(x,yi)−logpn(yi∣x))exp(ϕθ(x,y)−logpn(y∣x))(2)
其中
{
y
i
}
i
=
1
L
\{y_i\}^L_{i=1}
{yi}i=1L是从先验分布
p
n
(
y
∣
x
)
p_n(y|x)
pn(y∣x)中采样的L个负样本,减去
l
o
g
p
n
(
y
∣
x
)
logp_n(y|x)
logpn(y∣x)是必要的,可以让上式与原loss收敛到一处。绝大多数实现都假设
p
n
(
y
∣
x
)
=
p
n
(
y
)
p_n(y|x) = p_n(y)
pn(y∣x)=pn(y),并将
p
n
(
y
)
p_n(y)
pn(y)设置为与item的热度成比例。在实际场景中我们会为一个正样本采样上千个负样本。sampled softmax在样本item数很多的时候通常有比NCE和负采样更好的效果。
Contrastive Loss如下所示:
arg min
θ
1
∣
D
∣
∑
(
x
,
y
)
∈
D
−
l
o
g
e
x
p
(
ϕ
θ
(
x
,
y
)
)
e
x
p
(
ϕ
θ
(
x
,
y
)
)
+
∑
i
=
1
L
e
x
p
(
ϕ
θ
(
x
,
y
i
)
)
(
3
)
\argmin_\theta \frac{1}{|D|} \sum_{(x, y)\in D}-log\frac{exp(\phi_\theta(x, y))}{exp(\phi_\theta(x, y)) + \sum^L_{i=1}exp(\phi_\theta(x, y_i))} (3)
θargmin∣D∣1(x,y)∈D∑−logexp(ϕθ(x,y))+∑i=1Lexp(ϕθ(x,yi))exp(ϕθ(x,y))(3)
其中
{
y
i
}
i
=
1
L
\{y_i\}^L_{i=1}
{yi}i=1L依旧是从
p
n
(
y
∣
x
)
p_n(y|x)
pn(y∣x)中采样得到的。这个公式与上式相比是没有校正由采样带来的偏差的。很多研究都是基于本公式来探索一个合适的分布
p
n
(
y
∣
x
)
p_n(y|x)
pn(y∣x),InfoNCE论证了如果我们设定分布p_n服从数据集中y的真实分布,那么这个loss就能够拟合x和y之间交互信息下界的极大似然。
减掉了曝光偏差的Contrastive Learning最近对上式的优化取得了突破性进展,我们首先回顾一下,contrastive loss是一种基于采样的对于逆倾向加权(inverse propensity weighted, IPW) loss的近似。IPW loss如下所示:
arg min
θ
1
∣
D
∣
∑
(
x
,
y
)
∈
D
−
1
q
(
y
∣
x
)
l
o
g
p
θ
(
y
∣
x
)
(
4
)
\argmin_\theta \frac{1}{|D|} \sum_{(x, y)\in D} - \frac{1}{q(y|x)} log p_\theta(y|x) (4)
θargmin∣D∣1(x,y)∈D∑−q(y∣x)1logpθ(y∣x)(4)
其中
q
(
y
∣
x
)
q(y|x)
q(y∣x)是propensity score function,也就是我们在构建数据集时y被推荐给x的概率(即曝光分布)。IPW的思想就是要通过propensity score来建模非随机缺失值,从而校正曝光偏差。一个标准IPW loss的实现包含两步:第一步是利用一个单独的模型来建模
q
(
y
∣
x
)
q(y|x)
q(y∣x),然后通过极大似然拟合曝光历史来对模型进行优化;第二步就是通过上面的公式来优化
p
θ
(
y
∣
x
)
p_\theta(y|x)
pθ(y∣x),然而IPW的两阶段求解以及由
1
q
(
y
∣
x
)
\frac{1}{q(y|x)}
q(y∣x)1带来的数值的不稳定性给真实场景中IPW loss的应用带来的挑战。
幸运的是我们能够证明(3)和(4)理论上是一致的。并且我们会在下面一节提出一种方法,不需要通过两步就可以计算出IPW loss。证明过程参考原论文。
基于队列的contrastive learning实现
我们在本节提出两种方法来在实际生产环境中实现contrastive loss。首先我们会对CLRec进行说明,它会利用非个性化的propensity score q ( y ) q(y) q(y)构建一个队列,然后从中选择负样本。然后我们会对Multi-CLRec进行说明,它会利用表征用户不同意图的多个独立队列来生成样本。我们的方法与IPW不同的是,它不需要用一个辅助的模型来得到propensity score q ( y ∣ x ) q(y|x) q(y∣x),省去了训练这个模型的时间。
CLRec: 基于队列的能够减小马太效应的对比学习
propensity score
q
(
y
∣
x
)
q(y|x)
q(y∣x)的精确值是很难得到的,因为真实推荐系统中包含很多模块并且数据稀疏。因此CLRec用
q
(
y
)
q(y)
q(y)来代替
q
(
y
∣
x
)
q(y|x)
q(y∣x)(也就是用item被推荐的概率来代替系统把y推荐给x的概率),然后
q
(
y
)
q(y)
q(y)又与
p
d
a
t
a
(
y
)
p_{data}(y)
pdata(y)有高度关联,因为如果一个推荐系统已经被深度优化过了,那么它就会倾向于把有高点击率的item推荐出去。于是,我们进一步把propensity score用item的点击分布(也就是它在数据集中的分布)替换。
然而用item的点击分布来替换propensity score依旧会带来额外的开销。例如分布式系统中的通信开销,并且采样也不能保证数据集中的所有item都被采样到。