文章目录
- 背景
- Wide & Deep模型
- Wide模型:
- Deep模型
- Wide & Deep模型的联合训练(joint training)
- 度量的标准
- 实验结果
- apps的推荐系统
- 代码
- 数据
- DNNLinear组合分类器的使用
背景
与传统搜索类似,推荐系统的一个挑战是如何同时获得推荐结果准确性和扩展性。推荐的内容过于精准,用户兴趣收敛,无新鲜感,不利于长久的用户留存;推荐内容过于泛化,用户的精准兴趣无法得到满足,用户流失风险很大。相比较推荐的准确性,扩展性倾向于改善推荐系统的多样性。基于这个问题,Wide and deep 能够兼顾准确性与扩展性。
Wide and deep 模型是 TensorFlow 在 2016 年 6 月左右发布的一类用于分类和回归的模型,并应用到了 Google Play 的应用推荐中。wide and deep 模型的核心思想是结合线性模型的记忆能力(memorization)和 DNN 模型的泛化能力(generalization),在训练过程中同时优化 2 个模型的参数,从而达到整体模型的预测能力最优:
- 记忆(memorization):即从历史数据中发现item或者特征之间的相关性。
- 泛化(generalization):即相关性的传递,发现在历史数据中很少或者没有出现的新的特征组合。
在推荐系统中,记忆体现的准确性,而泛化体现的是新颖性。
Wide & Deep模型
Wide & Deep模型的结构如下图所示:
Wide & Deep模型中包括两个部分,分别为Wide部分和Deep部分,Wide部分如上图中的左图所示,Deep部分如上图中的右图所示。Wide起记忆功能, Deep起泛化功能,可以认为:WideDeep = LR + DNN。
Wide模型:
Wide模型如上图中的左侧的图所示,实际上,Wide模型就是一个广义线性模型:
其中,特征 是一个
维的向量,
为模型的参数。最终在
的基础上增加Sigmoid函数作为最终的输出。
在Wide模型部分,输入的特征包括了原始特征和交叉特征。
交叉特征的定义:
其中,。
表示第
个组合特征。
表示输入
的第
维特征。
表示这个第i维度特征是否要参与第
个组合特征的构造。
表示输入
的维度。在论文中,当
、
其他值都是 0 时,就添加一个交叉特征 1 ,由于输入的
是one-hot类型,交叉特征可以理解为任意两个特征的乘积。
Deep模型
Deep模型如上图中的右侧的图所示,实际上,Deep模型是一个前馈神经网络。深度神经网络模型通常需要的输入是连续的稠密特征,对于稀疏,高维的类别特征,通常首先将其转换为低维的向量,这个过程也称为embedding。
在训练的时候,首先随机初始化embedding向量,并在模型的训练过程中逐渐修改该向量的值,即将向量作为参数参与模型的训练。
隐含层的计算方法为:
其中,称为激活函数,如ReLUs。
Deep模型特征的输入包括了连续的特征和 embedding特征,对于每个field embedding特征采样随机初始化的方式。
像FM和DNN这种Embedding类的模型,可以通过学习到的低纬度稠密向量实现模型的泛化能力,包括可以实现对未见过的内容进行泛化推荐。当模型query-item矩阵比较稀疏时,模型的会过分泛化,推荐出很多无相关性的内容,准确性不能得到保证。
Wide & Deep模型的联合训练(joint training)
联合训练是指同时训练Wide模型和Deep模型,并将两个模型的结果的加权和作为最终的预测结果:
训练的方法:
在论文实验中,训练部分,Wide使用Follow-the-regularized-learder(FTRL)+L1正则, Deep使用了AdaGrad。
联合训练和模型集成要进行区分,他们有着以下两点区别:
训练方式。 集成模型的子模型部分是独立训练,只在inference阶段合并预测。而联合训练模型是同时训练同时产出的。
模型规模。集成模型独立训练,模型规模要大一些才能达到可接受的效果。而联合训练模型中,Wide部分只需补充Deep模型的缺点,即记忆能力,这部分主要通过小规模的交叉特征实现。因此联合训练模型的Wide部分的模型特征较小。
度量的标准
度量的指标有两个,分别针对在线的度量和离线的度量,在线时,通过A/B test,最终利用安装率(Acquisition);离线则使用AUC作为评价模型的指标。
实验结果
wide和deep 对于推荐系统都很重要。 Wide 线性模型可以通过交叉特征记忆稀疏特征;Deep模型可以通过embedding 生成看不见的特征。
apps的推荐系统
本文将上述的Wide & Deep模型应用在Google play的apps推荐中。
对于类别特征,通过词典(Vocabularies)将其映射成向量;对于连续的实数特征,将其归一化到区间[0,1]。
代码
DNNLinear组合分类器实战
数据
人口普查数据https://www.jianshu.com/p/6868fc1f65d0
14个特征,6个连续
连续:
'age':年龄,
'fnlwgt':表示受访者提供的消息的置信度,
'education_num':市民最高学历的数字形式,
'capital_gain':利得记录,
'capital_loss':亏损记录,
'hours_per_week':每周工作时间,
离散:
'workclass':市民职位的所属类型(政府, 军队, 私人, 等等)
'education':表示受访者提供的消息的置信度,
'marital_status':市民的婚姻状况,
'occupation':市民的职位,
'relationship':关系,
'race':种族,
'gender':性别,
'native_country':市民的祖国,
'income_bracket收入':收入<=50K
DNNLinear组合分类器的使用
https://www.w3cschool.cn/tensorflow_python/tensorflow_python-4gn82dty.html
参考:
https://www.jianshu.com/p/dbaf2d9d8c94 https://zhuanlan.zhihu.com/p/57247478
待解决:
问题:
1、怎么选择交叉特征?
2、对于连续特征是否需要归一化
4、深度神经网络模型通常需要的输入是连续的稠密特征,为什么?
DNN几乎不需要特征工程。通过对低纬度的dense embedding进行组合可以学习到更深层次的隐藏特征。但是,缺点是有点over-generalize(过度泛化)。推荐系统中表现为:会给用户推荐不是那么相关的物品,尤其是user-item矩阵比较稀疏并且是high-rank(高秩矩阵)
6、深度部分的公式不对
9、FTRL
10、AdaGrad
12、在联合训练的时候,为什么wide和deep的方法不一样
说一下我的理解。deep的时候模型采用的dnn,dnn的网络是稠密型网络不适合采用FTRL等产生稀疏参数的方法。而LR一般是人为的挑选一些特征进行训练,当中必然有一些“冗余”的特征,我们需要一种稀疏性较强的梯度更新方法。