推荐算法deep & wide 原理

背景

与传统搜索类似,推荐系统的一个挑战是如何同时获得推荐结果准确性和扩展性。推荐的内容过于精准,用户兴趣收敛,无新鲜感,不利于长久的用户留存;推荐内容过于泛化,用户的精准兴趣无法得到满足,用户流失风险很大。相比较推荐的准确性,扩展性倾向于改善推荐系统的多样性。基于这个问题,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模型就是一个广义线性模型:
y = w T x + b y = \mathbf{w}^{T}\mathbf{x}+b y=wTx+b
其中,特征 x = [ x 1 , x 2 , ⋯ , x d ] \mathbf{x} = [x1,x2,⋯,xd] x=[x1,x2,,xd] 是一个 d d d维的向量, w = [ w 1 , w 2 , ⋯ , w d ] \mathbf{w} = [w1,w2,⋯,wd] w=[w1,w2,,wd]为模型的参数。最终在 y y y的基础上增加Sigmoid函数作为最终的输出。
在Wide模型部分,输入的特征包括了原始特征和交叉特征。
交叉特征的定义:
ϕ k ( x ) = ∏ i = 1 d x i c k i \phi ^{k}(x) = \prod_{i=1}^{d}x_{i}^{c_{ki}} ϕk(x)=i=1dxicki
其中, c k i ϵ { 0 , 1 } c_{ki}\epsilon{\left \{ 0,1 \right \}} ckiϵ{0,1} k k k表示第 k k k个组合特征。 i i i表示输入 x \mathbf{x} x的第 i i i维特征。 c k i c_{ki} cki表示这个第i维度特征是否要参与第 k k k个组合特征的构造。 d d d表示输入 x \mathbf{x} x的维度。在论文中,当 x i = 1 x_{i}=1 xi=1 x j = 1 x_{j}=1 xj=1 其他值都是 0 时,就添加一个交叉特征 1 ,由于输入的 x x x是one-hot类型,交叉特征可以理解为任意两个特征的乘积。

Deep模型

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

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

联合训练是指同时训练Wide模型和Deep模型,并将两个模型的结果的加权和作为最终的预测结果:
训练的方法:
P ( Y = 1 ∣ x ) = σ ( w w i d e T [ x , ϕ ( x ) ] + w d e e p T a l f + b ) P(Y=1\mid \mathbf{x})=\sigma (\mathbf{w}_{wide}^{T}[\mathbf{x},\phi (\mathbf{x})]+\mathbf{w}_{deep}^{T}a^{lf}+b) P(Y=1x)=σ(wwideT[x,ϕ(x)]+wdeepTalf+b)
在论文实验中,训练部分,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://blog.csdn.net/google19890102/article/details/78171283
https://www.jianshu.com/p/dbaf2d9d8c94
https://zhuanlan.zhihu.com/p/57247478
https://blog.csdn.net/u010352603/article/details/80590129

待解决:
问题:
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一般是人为的挑选一些特征进行训练,当中必然有一些“冗余”的特征,我们需要一种稀疏性较强的梯度更新方法。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值