推荐系统之:Wide&Deep
1.介绍
Wide and deep 模型是 TensorFlow 在 2016 年 6 月左右发布的一类用于分类和回归的模型,并应用到了 Google Play 的应用推荐中。wide and deep 模型的核心思想是结合线性模型的记忆能力(memorization)和 DNN 模型的泛化能力(generalization),在训练过程中同时优化 2 个模型的参数,从而达到整体模型的预测能力最优。
记忆(memorization)即从历史数据中发现item或者特征之间的相关性。
泛化(generalization)即相关性的传递,发现在历史数据中很少或者没有出现的新的特征组合。
论文链接:https://arxiv.org/pdf/1606.07792.pdf
2.原理
2.1 W&D模型的网络结构
● Wide部分就是基础的线性模型。
● Deep部分就是个前馈网络模型。
1.Wide部分:
Wide部分就是基础的线性模型,表示为y=WX+b。X特征部分包括基础特征和交叉特征。交叉特征在wide部分很重要,可以捕捉到特征间的交互,起到添加非线性的作用。
交叉特征可表示为:
2.Deep部分
Deep部分就是个前馈网络模型。特征首先转换为低维稠密向量,维度通常O(10)-O(100)。向量随机初始化,经过最小化随时函数训练模型。激活函数采用Relu。前馈部分表示如下:
3.Wide&Deep联合训练
在联合模型中,Wide和Deep部分的输出通过加权方式合并到一起,并通过logistic loss function进行最终输出。
- 训练结构:
- 最终输出的公式:
4.联合训练和模型集成要进行区分,他们有着以下两点区别:
- 训练方式。 集成模型的子模型部分是独立训练,只在inference阶段合并预测。而联合训练模型是同时训练同时产出的。
- 模型规模。集成模型独立训练,模型规模要大一些才能达到可接受的效果。而联合训练模型中,Wide部分只需补充Deep模型的缺点,即记忆能力,这部分主要通过小规模的交叉特征实现。因此联合训练模型的Wide部分的模型特征较小。
联合模型求解采用FTRL算法,L1正则。深度部分用AdaGrad优化算法。
2.2 Google Play的推荐系统结构
推荐系统运作流程:
1.query召回 100 个 相关的items;
2.根据query+items+用户日志学习排序模型;
3.利用 2 的模型,对 1中召回的items排序,先去top10 推荐给用户;
4.论文主要讲排序的部分,排序时使用到的特征:
- user features (e.g., country, language, demographics);
- contextual features (e.g., device, hour of the day, day of the week);
- impression features (e.g., app age, historical statistics of an app).
3.编程实现
代码讲解参考:
http://datawhale.club/t/topic/45
上面的代码运行有任何问题,可以在论坛中反馈。
代码爬坑tips:上面的代码推荐使用TensorFlow2.0版本。
我用的是TensorFlow1.5版本,遇到报错TypeError 。在第168行 中的输入数据格式为inte64和函数需所需要的浮点或复数格式不匹配。有其他小伙伴用2.0以上的也遇到其他的数据类型不匹配问题。
以下是我的解决方法(注释的那2句添加上就可以)
# deep部分的NN结构
d = concatenate(deep_inp_embed)
d = Flatten()(d)
'''
如果下面报错TypeError ,输入数据格式为inte64和目标的浮点或复数格式不匹配,
可以把下面2句取消注释,加上一起运行试试。
'''
# import tensorflow as tf
# d = tf.to_folat(d)
d = Dense(50, activation='relu', kernel_regularizer=l1_l2(l1=0.01,
l2=0.01))(d)
d = Dropout(0.5)(d)
d = Dense(20, activation='relu', name='deep')(d)
d = Dropout(0.5)(d)