Wide & Deep 模型简介

6.1 点击率预估简介

点击率预估是用来解决什么问题?
点击率预估是对每次广告点击情况做出预测,可以输出点击或者不点击,也可以输出点击或者不点击的概率,后者有时候也称为pClick.
点击率预估模型需要做什么?
通过上述点击率预估的基本概念,我们会发现其实点击率预估问题就是一个二分类的问题,在机器学习中可以使用逻辑回归最为模型的输出,其输出就是一个概率值,我们可以将机器学习输出的这个概率值认为是某个shi用户点击某个广告的概率。
点击率预估与推荐算法有什么不同?
广告点击率预估是需要得到某个用户对某个广告的点击率,然后结合广告的出价用于排序;而推荐算法大多数情况下只需要得到一个最优的推荐次序,即TopN推荐的问题。当然也可以利用广告的点击率来排序,作为广告的推荐。

6.2 为什么不使用FM呢?

我们为什么不使用FM模型,而要去整这个Wide & Deep呢?其缺点在于:当query-item矩阵是稀疏并且是high-rank的时候(比如user有特殊的爱好,或者item比较小众),很难非常效率的学习出低维度的表示。这种情况下,大部分的query-item都没有什么关系。但是dense embedding会导致几乎所有的query-item预测值都是非0的,这就导致了推荐过度泛化,会推荐一些不那么相关的物品。相反,简单的linear model却可以通过cross-product transformation 来记住这些exception rules。

6.3 Wide & Deep 模型的“记忆能力”与“泛化能力”

Memorization 和 Generalization 是推荐系统很常见的两个概念,其中Memorization指的是通过用户与商品的交互信息矩阵学习规则,而Generalization则是泛化规则。FM算法就是一个很好Generalization的例子,它可以根据交互信息学习到一个比较短的矩阵V,其中vi存储着每个用户特征的压缩表示(embedding),而协同过滤与SVD都是靠记住用户之前与哪些物品发生了交互从而推断出的推荐结果,这两者推荐结果当然存在一些差异, Wide & Deep 模型能够融合这两种推荐结果做出推荐,得到比之前的推荐结果都好的模型。
Memorization趋向于更加保守,推荐用户之前有过行为的items。相比之下,Generalization更加趋向于提高推荐系统的多样性(diversity)。Memorization只需要使用一个线性模型即可实现,而Generalization需要时使用DNN实现。
如何根据自己的场景去选择将哪些特征放在Wide部分,哪些特征放在Deep部分就需要理解这篇论文提出者当时对于设计该模型不同结构时的意图了。
如何理解Wide部分有利于增强模型的“记忆能力”,Deep部分有利于增强模型的“泛化能力”?

  1. Wide部分是一个广义的线性模型,输入的特征主要有两部分组成,一部分是原始的部分特征,另一部分原始特征的交互特征(cross-product transformation)。
    Google W&D期望wide部分发现这样的规则:用户安装了应用A,此时曝光应用B,用户安装应用B的概率大。
  2. Deep部分是一个DNN模型,输入的特征主要分为两大类,一类是数值特征,一类是类别特征(需要经过embedding之后才能输入到DNN中)。
    我们知道DNN模型随着层数的增加,中间的特征就越抽象,也就提高了模型的泛化能力。
  3. Wide部分与Deep部分的结合
    Wide & Deep 模型是将两部分输出的结果结合起来联合训练,将deep和wide部分的输出重新使用一个逻辑回归模型做最终的预测,输出概率值。

代码实战

# 首先看全局实现
tf.keras.experimental.WideDeepModel(
        linear_model,dnn_model,activation=None,**kwargs
)
##-- 这一步很容易看出来将linear_model与dnn_model拼接在一起,对应于Wide&Deep  FM中的最后一步。

# 将linear_model与dnn_model做一个简单的实现
linear_model = LinearModel()
dnn_model = keras.Sequential([keras.layers.Dense(units=64),
                             keras.layers.Dense(units=1)])
combined_model = WideDeepModel(linear_model,dnn_model)
combined_model.compile(optimizer=['sgd','adam'],'mse',['mse'])
combined_model.fit([linear_inputs,dnn_inputs],y,epochs)
dataset = tf.data.Dataset.from_tensors(([linear_inputs,dnn_inputs],y))
combined_model.fit(dataset,epochs)

# linear_model与dnn_model在联合之前均可进行分别训练
linear_model = LinearModel()
linear_model.compile('adagrad','mse')
linear_model.fit(linear_inputs,y,epochs)

dnn_model = keras.Sequential([keras.layers.Dense(units=1)])
dnn_model.compile('rmsprop','mse')
dnn_model.fit(dnn_inputs,y,epochs)

combined_model = WideDeepModel(linear_model,dnn_model)
combined_model.compile(optimizer=['sgd','adam'],'mse',['mse'])
combined_model.fit([linear_inputs,dnn_inputs],y,epochs)
##--这里前三行代码训练了一个线性模型,中间三行代码训练了一个DNN模型,最后三行代码将两个模型联合训练。
#以上就完成了对Tensorflow的WideDeepModel的调用。
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值