文章来源:
Cheng H T, Koc L, Harmsen J, et al. Wide & deep learning for recommender systems[C]//Proceedings of the 1st workshop on deep learning for recommender systems. 2016: 7-10.
摘要
具有非线性特征变换的广义线性模型被广泛用于具有稀疏输入的大规模回归和分类问题。通过一组广泛的跨产品特征转换来记忆特征交互是有效的和可解释的,而泛化需要更多的特征工程工作。通过较少的特征工程,深度神经网络可以通过为稀疏特征学习的低维密集嵌入,更好地推广到看不见的特征组合。然而,当用户-项目交互是稀疏和高秩的时,具有嵌入的深度神经网络可能会过度泛化并推荐不太相关的项目。在本文中,我们提出了宽深度学习——联合训练的宽线性模型和深度神经网络——以结合推荐系统的记忆和泛化优势。我们在Google Play上对该系统进行了产品化和评估,Google Play是一家拥有超过10亿活跃用户和超过100万应用程序的商业移动应用商店。在线实验结果显示,与仅宽和仅深的模型相比,宽和深显著增加了应用程序的收购量。我们还在TensorFlow中开源实现。
介绍
推荐系统可以被视为搜索排名系统,其中输入查询是一组用户和上下文信息,输出是项目的排名列表。给定一个查询,推荐任务是在数据库中查找相关项目,然后根据某些目标(如点击或购买)对项目进行排名。
推荐系统中的一个挑战,类似于一般的搜索排名问题,是实现记忆和泛化。记忆可以松散地定义为学习项目或特征的频繁共现,并利用历史数据中可用的相关性。另一方面,泛化是基于相关性的传递性,并探索过去从未或很少发生的新特征组合。基于记忆的建议通常更具话题性,并且与用户已经执行操作的项目直接相关。与记忆相比,概括往往会提高推荐项目的多样性。在本文中,我们关注的是Google Play商店的应用程序推荐问题,但该方法应适用于通用推荐系统。
对于工业环境中的大规模在线推荐和排名系统,广义线性模型(如逻辑回归)被广泛使用,因为它们简单、可扩展和可解释。模型通常是在具有一个热编码的二进制稀疏特征上进行训练的。例如,如果用户安装了Netix,二进制功能\user_installed_app=netflix“的值为1。可以通过对稀疏功能进行跨积转换来有效地实现记忆,例如AND(user_installed_app=netflix,impra-sion_app=pandora”),如果用户已安装Netix,则其值为1,然后显示为pandora。这解释了特征对的共现如何与目标标签相关。可以通过使用不太精细的功能来添加泛化,例如AND(user_installed_category=video,impression_categore=music),但通常需要手动功能工程。跨产品转换的一个局限性是,它们不能推广到训练数据中没有出现的查询项特征对。
基于嵌入的模型,如因子分解机[5]或深度神经网络,可以通过为每个查询和项目特征学习低维密集嵌入向量来推广到以前看不见的查询-项目-特征对,从而减少特征工程的负担。然而,当底层查询-项目矩阵稀疏且排名较高时,例如具有特定偏好的用户或吸引力较小的利基项目,很难学习查询和项目的有效低维表示。在这种情况下,大多数查询项对之间不应该有交互,但密集的嵌入会导致所有查询项对的预测为非零,因此可能会过度泛化,产生更少的结果。
在本文中,我们提出了宽深度学习框架,通过联合训练线性模型组件和神经网络组件,在一个模型中实现记忆和泛化,如图1所示。
论文的主要贡献包括:
•宽深度学习框架,用于为具有稀疏输入的通用推荐系统联合训练具有嵌入的前馈神经网络和具有特征变换的线性模型。
•在Google Play上生产的Wide&Deep推荐系统的实施和评估,Google Play是一家拥有超过10亿活跃用户和超过100万应用程序的移动应用商店。
•我们在TensorFlow1中开源了我们的实施以及高水平的API。虽然想法很简单,但我们表明,Wide&Deep框架显著提高了移动应用商店的应用获取率,同时满足了培训和服务速度的要求。
相关工作
理论部分
Wide&Deep模型分Wide和Deep两部分:
总体如下:
P
(
Y
=
1
∣
x
)
=
σ
(
w
wide
T
[
x
,
ϕ
(
x
)
]
+
w
deep
T
a
(
l
f
)
+
b
)
P(Y=1 \mid \mathbf{x})=\sigma\left(\mathbf{w}_{\text {wide}}^{T}[\mathbf{x}, \phi(\mathbf{x})]+\mathbf{w}_{\text {deep}}^{T} a^{\left(l_{f}\right)}+b\right)
P(Y=1∣x)=σ(wwideT[x,ϕ(x)]+wdeepTa(lf)+b)
模型使用Wide来增强模型的记忆能力,使用Deep来增强模型的泛化能力。Deep可以学习高阶特征。因为线性组合是一阶特征,多个有效的线性组合就是n阶特征。DNN在特征和权重相乘时进行了高阶特征的学习。
Wide部分为:
ϕ
k
(
x
)
=
∏
i
=
1
d
x
i
c
k
i
c
k
i
∈
{
0
,
1
}
\phi_{k}(\mathbf{x})=\prod_{i=1}^{d} x_{i}^{c_{k i}} \quad c_{k i} \in\{0,1\}
ϕk(x)=i=1∏dxickicki∈{0,1}
这里的特征交叉可以使用笛卡尔积。tensorflow中使用了笛卡尔积,然后又进行了hash。
w
wide
T
[
x
,
ϕ
(
x
)
]
\mathbf{w}_{\text {wide}}^{T}[\mathbf{x}, \phi(\mathbf{x})]
wwideT[x,ϕ(x)]
上述公式做了一个特征组合(包含原始的特征和交叉后的特征)。交叉特征反映了原始特征的非线性关系(两个变量之间的关系是一次函数关系就是线性的,如果不是一次函数关系就是非线性的)。可以这样理解
w
wide
T
x
\mathbf{w}_{\text {wide}}^{T}\mathbf{x}
wwideTx是一个线性模型,但是加入
ϕ
(
x
)
\phi(\mathbf{x})
ϕ(x)增加了模型的非线性性。
k
k
k是人为指定的,即在
k
k
k变换时,所用到的特征。
Deep部分为:
a
(
l
+
1
)
=
f
(
W
(
l
)
a
(
l
)
+
b
(
l
)
)
a^{(l+1)}=f\left(W^{(l)} a^{(l)}+b^{(l)}\right)
a(l+1)=f(W(l)a(l)+b(l))