文章目录

  • 背景
  • 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模型的结构如下图所示:

深度学习算法一般epochs写多少 deep算法_联合训练


Wide & Deep模型中包括两个部分,分别为Wide部分和Deep部分,Wide部分如上图中的左图所示,Deep部分如上图中的右图所示。Wide起记忆功能, Deep起泛化功能,可以认为:WideDeep = LR + DNN。

Wide模型:

Wide模型如上图中的左侧的图所示,实际上,Wide模型就是一个广义线性模型:
深度学习算法一般epochs写多少 deep算法_交叉特征_02
其中,特征深度学习算法一般epochs写多少 deep算法_推荐_03 是一个深度学习算法一般epochs写多少 deep算法_deep_wide_04维的向量,深度学习算法一般epochs写多少 deep算法_深度学习算法一般epochs写多少_05为模型的参数。最终在深度学习算法一般epochs写多少 deep算法_交叉特征_06的基础上增加Sigmoid函数作为最终的输出。
在Wide模型部分,输入的特征包括了原始特征和交叉特征。
交叉特征的定义:
深度学习算法一般epochs写多少 deep算法_deep_wide_07
其中,深度学习算法一般epochs写多少 deep算法_交叉特征_08深度学习算法一般epochs写多少 deep算法_交叉特征_09表示第深度学习算法一般epochs写多少 deep算法_交叉特征_09个组合特征。深度学习算法一般epochs写多少 deep算法_深度学习算法一般epochs写多少_11表示输入深度学习算法一般epochs写多少 deep算法_deep_wide_12的第深度学习算法一般epochs写多少 deep算法_深度学习算法一般epochs写多少_11维特征。深度学习算法一般epochs写多少 deep算法_推荐_14表示这个第i维度特征是否要参与第深度学习算法一般epochs写多少 deep算法_交叉特征_09个组合特征的构造。深度学习算法一般epochs写多少 deep算法_deep_wide_04表示输入深度学习算法一般epochs写多少 deep算法_deep_wide_12的维度。在论文中,当深度学习算法一般epochs写多少 deep算法_联合训练_18深度学习算法一般epochs写多少 deep算法_deep_wide_19 其他值都是 0 时,就添加一个交叉特征 1 ,由于输入的深度学习算法一般epochs写多少 deep算法_联合训练_20是one-hot类型,交叉特征可以理解为任意两个特征的乘积。

Deep模型

Deep模型如上图中的右侧的图所示,实际上,Deep模型是一个前馈神经网络。深度神经网络模型通常需要的输入是连续的稠密特征,对于稀疏,高维的类别特征,通常首先将其转换为低维的向量,这个过程也称为embedding。
在训练的时候,首先随机初始化embedding向量,并在模型的训练过程中逐渐修改该向量的值,即将向量作为参数参与模型的训练。
隐含层的计算方法为:
深度学习算法一般epochs写多少 deep算法_交叉特征_21
其中,深度学习算法一般epochs写多少 deep算法_deep_wide_22称为激活函数,如ReLUs。
Deep模型特征的输入包括了连续的特征和 embedding特征,对于每个field embedding特征采样随机初始化的方式。
像FM和DNN这种Embedding类的模型,可以通过学习到的低纬度稠密向量实现模型的泛化能力,包括可以实现对未见过的内容进行泛化推荐。当模型query-item矩阵比较稀疏时,模型的会过分泛化,推荐出很多无相关性的内容,准确性不能得到保证。

Wide & Deep模型的联合训练(joint training)

联合训练是指同时训练Wide模型和Deep模型,并将两个模型的结果的加权和作为最终的预测结果:
训练的方法:
深度学习算法一般epochs写多少 deep算法_推荐_23
在论文实验中,训练部分,Wide使用Follow-the-regularized-learder(FTRL)+L1正则, Deep使用了AdaGrad。

联合训练模型集成要进行区分,他们有着以下两点区别:
训练方式。 集成模型的子模型部分是独立训练,只在inference阶段合并预测。而联合训练模型是同时训练同时产出的。
模型规模。集成模型独立训练,模型规模要大一些才能达到可接受的效果。而联合训练模型中,Wide部分只需补充Deep模型的缺点,即记忆能力,这部分主要通过小规模的交叉特征实现。因此联合训练模型的Wide部分的模型特征较小。

度量的标准

度量的指标有两个,分别针对在线的度量和离线的度量,在线时,通过A/B test,最终利用安装率(Acquisition);离线则使用AUC作为评价模型的指标。

实验结果

深度学习算法一般epochs写多少 deep算法_推荐_24


wide和deep 对于推荐系统都很重要。 Wide 线性模型可以通过交叉特征记忆稀疏特征;Deep模型可以通过embedding 生成看不见的特征。

apps的推荐系统

本文将上述的Wide & Deep模型应用在Google play的apps推荐中。

深度学习算法一般epochs写多少 deep算法_联合训练_25


对于类别特征,通过词典(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一般是人为的挑选一些特征进行训练,当中必然有一些“冗余”的特征,我们需要一种稀疏性较强的梯度更新方法。