点击蓝字关注,提升学习效率
title:Zero Shot on the Cold-Start Problem: Model-Agnostic Interest Learning for Recommender Systems
link:https://arxiv.org/pdf/2108.13592.pdf
from:CIKM 2021
code:https://github.com/LiangjunFeng/MAIL
1. 导读
本文是针对新用户方面的冷启动文章,作者提出双塔结构的MAIL,一个塔用于冷启动,另一个塔关注排序问题。
零样本塔首先 使用双自动编码器进行跨模态重建,从高度对齐的隐藏特征中为新用户获取虚拟行为数据; 然后 排名塔可以根据零样本塔完成的数据为用户输出推荐。
2. 方法
2.1 问题定义与符号 2.1.1 特征 用户属性
a in mathcal{A} ,用户行为
v in mathcal{V} ,上下文
c in mathcal{C} ,目标商品
t in mathcal{T} 。用户属性包含用户的ID,公司等,用户行为是用户交互过的商品的ID序列,上下文包含日期,地理位置等,目标商品的属性包含ID,类型等。推荐系统就是学习一个映射函数f(x)得到每个商品的分数,其中x={a,c,v,t}。
通常原始的特征可以表示为one-hot向量,然后经过映射得到低维稠密的embedding,这里的a,v即为embedding,
a=[a_1,...,a_{n_a}]in mathbb{R}^{n_a times d} ,
v=[v_1,...,v_{n_v}] in mathbb{R}^{n_v times d} 。
2.1.2 RS中的零样本学习 在冷启动推荐中,有两个范围:旧用户范围 S 和新用户范围 O。对于老用户,有四类特征准备好对模型进行排序,表示为
x_s={a_s,v_s,c_s,t_s} 。对于新用户,行为
v_o 缺失,新用户的特征表示为
x_o={a_o,c_o.t_o} 。在本文中,在老用户的基础上训练了一个零样本塔
hat{v}_s=g(a_s,v_s) ,可以应用于新用户获取虚拟行为数据
hat{v}_o=g(a_o) 来应对冷启动问题。
2.2 MAIL方法 2.2.1 整体想法 MAIL 的总体思路如图所示。除了一般排名塔外,还有一个新的零样本塔。排名塔基于零样本塔完成的数据输出推荐,零样本塔采用排名塔的embedding。两个塔的协同训练使推荐系统不受冷启动影响,从而实现了性能的增量提升。
2.2.2 零样本塔 首先,明确零样本塔是针对老用户进行训练 ,对新用户进行推理 ,根据属性将老用户的行为数据传递给新用户。因此,训练的时候用到老用户的用户特征和行为数据,这部分是通过embedding层得到的,embedding层经过排名塔训练,从图中也可以看到embedding层是共享的。
为了对不同的特征进行加权,然后将自我注意技术应用于
a_s 和
v_s ,分别构造属性特征
h_s^a 和行为特征
h_s^v 。以属性特征为例,注意力机制执行如下,
begin{array}{c}
h_s^a=sum_{i=1}^{n_a}{alpha_ia_{si}} \
alpha_{i}=frac{exp left(e_{i}right)}{sum_{j=1}^{n_{a}} e_{j}} \
e_{i}=z^{T} tanh left(w a_{s i} bright),
end{array} 基于注意力机制得到的
h_s^a 和
h_s^v ,执行跨模态重建以对齐用户属性和行为,从而更有效地生成基于属性的行为。在属性空间,损失函数为下式,
mathcal{L}_{a}=left|D 1left(p_{s}right)-a_{s}right|_{2}^{2} left|D 2left(p_{s}right)-v_{s}right|_{2}^{2}
在行为空间,损失函数为下式
mathcal{L}_{v}=left|D 1left(q_{s}right)-a_{s}right|_{2}^{2} left|D 2left(q_{s}right)-v_{s}right|_{2}^{2}
其中
p_s=E1(h_s^a) in mathbb{R}^{d_h} ,
q_s=E2(h_s^v) ,E是编码器,D是解码器。跨模态重构损失利用p和q来重构a和v,使得q和p对用户属性和用户行为具有相同的预测能力。一个batch的
p_s 表示为
P_s ,一个batch的
q_s 表示为
Q_s ,通过MMD来最小化两个矩阵的分布的距离从而引到跨模态重构。公式如下,其中H表示再生希尔伯特空间,
phi 是表示将embedding映射到H空间,具体可见https://zhuanlan.zhihu.com/p/25418364。k是核函数,具体如下,其中σ=1。
begin{aligned}
mathcal{L}_{d} &=D_{mathcal{H}}left(boldsymbol{P}_{s}, boldsymbol{Q}_{s}right)=left|frac{1}{n} sum_{i=1}^{n} phileft(boldsymbol{p}_{s i}right)-frac{1}{n} sum_{j=1}^{n} phileft(boldsymbol{q}_{s j}right)right|_{2}^{2} \
&=frac{1}{n} sum_{i=1}^{n} sum_{j=1}^{n} kleft(boldsymbol{p}_{s i}, boldsymbol{p}_{s j}right) frac{1}{n} sum_{i=1}^{n} sum_{j=1}^{n} kleft(boldsymbol{q}_{s i}, boldsymbol{q}_{s j}right) \
&-frac{2}{n^{2}} sum_{i=1}^{n} sum_{j=1}^{n} kleft(boldsymbol{p}_{s i}, boldsymbol{q}_{s j}right)
end{aligned} k(p_s,q_s)=exp(|p_s-q_s|^2/2sigma^2)
结合上面三个损失函数,总的损失函数构建为,
L_{zst}=L_a L_v L_d ,前两个损失函数是训练模型的重构能力,最后一个是使得不同模态的信息在同一空间。然后就可以生成新用户的虚拟数据,如下,
hat{v}_0=D2(p_0)=D2(E1(h_0^a))
2.2.3 排名塔 排名塔以不同的方式对待新用户和老用户,也就是说应该有一个标志来表示一个用户是否是新用户,如下,
text { flag }=left{begin{array}{lc}
text { true } & v=varnothing \
text { false } & text { otherwise }
end{array}right. 有了flag后,从而可以根据不同的flag得到不同的输入,
text { x}=left{begin{array}{lc}
{a_o,c_o,t_o,hat{v}_o} & flag=true \
{a_s,c_s,t_s,v_s} & flag=false
end{array}right. 在得到输入x后,通过pooling层可以得到表征
z=[z^v,z^a,z^t,z^c] ,以用户属性为例,其他也一样,公式如下,
z^a=sum_{i=1}^{n_a}{a_i}
通过多层感知机,得到最终的预测值,公式如下,
begin{array}{c}
boldsymbol{h}_{z 1}=text { LeakyReLU }(text { BN }(text { Dense }(text { Dropout }(z, 0.5)))) \
boldsymbol{h}_{z 2}=text { LeakyReLU }left(text { BN }left(text { Dense }left(text { Dropout }left(boldsymbol{h}_{z 1}, 0.5right)right)right)right) \
left.hat{y}=operatorname{Sigmoid}left(text { Dense }left(boldsymbol{h}_{z 2}right)right)right)
end{array} 排名塔采用交叉熵损失函数进行训练,
mathcal{L}_{r t}=-sum_{i=1}^{n}left(y_{i} log hat{y}_{i} left(1-y_{i}right) log left(1-hat{y}_{i}right)right)
因此总的损失函数为
L=L_{zst} L_{rt} 其中两个塔被共同训练 以解决推荐系统的冷启动问题。在实际应用中,不仅测试数据会有新用户,训练数据也会有新用户。排序和冷启动两阶段模型很难解决排序模型训练阶段的数据缺失问题,因为基于embedding的冷启动模型必须在排序模型之后进行训练。相比之下,所提出的 MAIL 被设计为端到端模型,以便在需要时从零样本塔获取排名塔的虚拟行为数据。
2.2.4 实现 MAIL在训练中涉及两个优化器,G_A训练L_zst,G_B训练L_rt。embedding层完全有G_B训练,这也对应于前面说的embedding由排名塔训练得到。
具有残差结构的自动编码器:在零样本塔中使用两个自动编码器来执行跨模态重建。考虑到推荐系统中的稀疏信息,为自动编码器设计了一种残差结构,以更好地执行重建任务。以图2中的左自编码器为例,残差结构如图3所示。残差编码器的前向传播可以表述为:
begin{array}{c}
z_{s}^{a 1}=operatorname{LeakyReLU}left(operatorname{Dense}left(operatorname{Dropout}left(boldsymbol{h}_{s}^{a}, 0.5right)right)right) \
z_{s}^{a 2}=operatorname{LeakyReLU}left(operatorname{Dense}left(operatorname{Dropout}left(text { Concat }left(z_{s}^{a 1}, boldsymbol{h}_{s}^{a}right), 0.5right)right)right) \
left.boldsymbol{p}_{s}=operatorname{LeakyReLU}left(operatorname{Dense}left(text { Concat }left(z_{s}^{a 2}, boldsymbol{h}_{s}^{a}right)right)right)right)
end{array} 残差解码器的前向传播可以表述为:
begin{array}{c}
z_{s}^{a 3}=operatorname{LeakyReLU}left(operatorname{Dense}left(operatorname{Dropout}left(boldsymbol{p}_{s}, 0.5right)right)right) \
z_{s}^{a 4}=operatorname{LeakyReLU}left(operatorname{Dense}left(operatorname{Dropout}left(operatorname{Concat}left(z_{s}^{a 3}, boldsymbol{p}_{s}right), 0.5right)right)right) \
hat{boldsymbol{a}}_{s}^{prime}=operatorname{Dense}left(operatorname{Concat}left(z_{s}^{a 4}, boldsymbol{p}_{s}right)right)
end{array} 伪代码如下,
3. 结果