FM
模型能够解决大规模稀疏数据下的特征组合问题,
FM
模型公式如下图所示,公式前半部分其实就是
LR
(
Logistic Regression
),后半部分是两两特征的交叉形式(以二阶形式为例)。例如特征
Xi
和
Xj
的交叉后变成一个新特征,特征值为
Xi*Xj
,特征权重为
Wij
,这里的
Wij
又可以表示为两个
K
维向量
Vi
和
Vj
的乘积,
FM
模型在训练过程中能够自动学习出向量
Vi
和
Vj
,向量
Vi
称之为特征
Xi
的隐向量。这里的
K
是
FM
模型的参数,我们可以任意指定,针对
500W
维的用户
ID
类特征,若
K
设置为
10
,则可以得到每个用户
ID
对应的
10
维隐向量。由此可见,
FM
是一种有效的
embedding
模型,它能将高维稀疏特征转化为稠密特征。
我们的应用中,我们先使用分布式
FM
(
DiFacto
)训练出模型,得到每个特征的权重和隐向量,然后针对每个特征类别(
Field
,例如用户
ID
类特征)将特征权重和隐向量拼接起来,构成一个稠密的特征向量,输入到神经网络,这就是
FNN
,详细网络结构如下图所示。我们在
2017
年
1
月份在详情页相关推荐场景实验并上线了
FNN
模型,上线后相比
base
模型,帖子点击率有
5%
左右的提升。
FNN
的开源代码是使用
Theano
实现的,我们使用
TensorFlow
重新进行了实现,离线使用分布式
TensorFlow
进行训练,线上预测部分使用
Java
自主实现了神经网络的前向计算。
2. Wide&Deep
Wide&Deep
模型是
Google
于
2016
年
6
月发表的《
Wide&Deep Learning for RecommenderSystems
》文章中提出的,目前被各大公司广泛使用。顾名思义,它是将
Wide
模型和
Deep
模型相结合。模型框架如下图所示:左边是
Deep
部分,首先将各类离散特征进行
One-Hot
编码并输入
embedding
层得到稠密向量,然后与连续特征拼接在一起得到特征向量作为神经网络的输入;右边
Wide
部分我们使用原始特征(离散特征的
One-Hot
编码)和人工交叉特征作为输入;将两个模型的输出相结合即可得到最终的结果。
我们直接应用了
TensorFlow
中
Wide&Deep
的开源实现,离线使用分布式
TensorFlow
进行训练,相比
base
模型,离线
AUC
有
0.026
的提高。值得一提的是,与
FNN
需要借助
FM
模型预训练来做稀疏特征的
embedding
不同,
Wide&Deep
模型内部自主实现了
embedding
,稀疏特征对应的
embedding
稠密向量可以在整个网络训练过程中自动学习得到。
我们从
Wide&Deep
的模型结构可以看到,
Deep
部分其实就是自动学习出了高阶特征,然后输入给
LR
,而
Wide
部分需要依赖传统的人工特征工程,会使用原始离散特征和低阶交叉特征(例如二阶交叉)。我们可以理解为
Wide&Deep
模型将多阶特征的使用进行了拆分,
Deep
部分是用于生成更高阶的复杂特征,而
Wide
部分是使用较简单的低阶特征。
在深度学习之前,我们常用的是使用
GBDT
模型自动生成高阶特征,这一方法在
Facebook
提出
GBDT+LR
模型后被工业界广泛使用,它使用
GBDT
模型将每个样本映射到
GBDT
各棵树的叶子节点上,并拼接成一个稀疏向量,然后作为
LR
模型的输入特征。之后在
Kaggle
竞赛中,参赛者将
GBDT
生成的高阶特征输入到
FM
模型,取得了良好的效果,
GBDT+FM
模型也逐渐被工业界使用,下图是
GBDT+LR/FM
的模型框架图。
Wide&Deep
模型使用了
Deep
部分的更高阶复杂特征和
Wide
部分的人工特征工程得到的低阶特征,
GBDT
生成的高阶特征可以理解为介于二者之间,因此我们可以将
GBDT
生成的高阶特征也输入到
Wide&Deep
模型当中。我们使用
XGBoost
(
GBDT
)生成了高阶特征,然后输入到
Wide
模型构成了
XGBoost+Wide&Deep
模型,相比
Wide&Deep
模型,离线
AUC
有
0.018
的提升。我们也尝试了将
GBDT
高阶特征向量继续输入给
Deep
模型,离线
AUC
能有千分之一左右的提升,模型结构如下图所示。
我们可以看到,
Wide&Deep
模型的
Wide
部分的输入依赖人工特征工程,并非是一个端到端的学习过程。华为诺亚方舟实验室在
2017
年
3
月发表的文章《
DeepFM: A Factorization-Machine basedNeural Network for CTR Prediction
》中提出了
DeepFM
模型,
DeepFM
的结构中包含了
FM
部分以及
DNN
部分,分别负责低阶特征和高阶特征的提取,实现了端到端的学习过程,我们正在尝试该模型。
3. CNN+DNN
在我们的部分推荐场景中帖子图片比较大,例如优质高清的房源大图对用户会有较强的吸引,因此我们考虑将图像特征引入到排序模型当中,例如将帖子图像转化成一个特征向量输入到排序模型。腾讯
2015
年在
IJCIA
上发表的文章《
Image Feature Learning for Cold StartProblem in Display Advertising
》中就提出了该思路,它首先利用
CNN
对图像进行特征抽取得到特征向量,然后输入到
LR
等常见模型。针对深度图像特征的应用,阿里广告团队在
2016
年
9
月于
Multimedia
会议上发表的文章《
Deep CTR Prediction in Display Advertising
》中提出了全新的端到端的思路(
DeepCTR
模型),模型结构是一部分利用CNN抽取出图像特征,一部分使用一个全连接层对连续和离散特征做embedding,两者拼接在一起输入神经网络进行训练。但在我们的场景下,每天有数百万的发帖,样本中图片数量大,
DeepCTR
模型离线训练受
CNN
限制会很缓慢,并且线上预测时
CNN
部分也有较大的性能压力。因此我们转变了一下思路,尝试了下图所示的
CNN+DNN
模型,在这个模型中,我们使用
CNN
图像分类模型来做预训练,生成了每张图片的特征向量,然后将图像特征、离散特征、连续特征一起输入至
Wide&Deep
中的
Deep
模型。在我们的场景下,该模型离线
AUC
相比
base
模型有
0.01
的提升。
4. DNN召回模型
近些年在推荐排序上涌现出了很多深度学习模型,在推荐召回上的深度模型相对偏少,比较有名的是
YouTube
于
2016
年
9
月在
RecSys
上发表的文章《
Deep Neural Networks for YouTube Recommendations
》中提出的
DNN
召回模型(后文称作
YouTube DNN
召回模型)。我们也引入了该模型,模型结构如下图所示。
YouTube DNN
召回模型将推荐当做一个超大规模的多分类问题,用户点击过的帖子即为一个分类,模型就是预测用户
U
在时刻
t
和当前上下文
C
下对帖子
i
的点击概率
P(Wt=i|U,C)
,模型输出层是一个
softmax
,类别数量即帖子数量。模型会将用户历史浏览记录做
embedding
处理,并与用户人口属性特征、上下文特征等一起作为神经网络的输入。
在训练出来的模型中,最后一层隐藏层与输出层帖子结点之间的连接权重可以当做帖子的向量,例如图中的帖子
V1
的向量就是
(w1, w2, w3)
,这样每个帖子都会得到一个向量。最后一层隐藏层的输出可以当做用户的向量,当线上推荐服务收到请求时,将特征向量输入网络,最后一层隐藏层的输出结果便是用户向量,如图中的向量
(x1,x2,x3)
,这样推荐逻辑就变成计算与用户向量最相近的
K
个帖子向量。
在我们的应用中,我们借助
Facebook
人工智能实验室(
FAIR
)提出的最邻近搜索(
nearest neighbor search
)算法
FAISS
(
Facebook AI similarity search
)实现了用户向量的最近邻帖子向量的实时计算,当推荐服务接收到推荐请求时便实时计算用户感兴趣的帖子候选集合。该召回模型上线后,相比
base
召回模型,我们的点击率有
1%
左右的稳定提升。
YouTube DNN
召回模型相比传统协同过滤模型,可以引入更多的特征,有更多的优化空间,后续我们将继续调优该模型,提高推荐效果。
原文链接: https://mp.weixin.qq.com/s/qCpCHueEK7Nja-cPmlCaCg
作者:詹坤林 58架构师