原理
论文来源:《Wide & Deep Learning for Recommender Systems》
可见wide & Deep是专门为推荐系统点击率预估而设计的一个种联合模型。
1、记忆与泛化
- 记忆可以宽松定义为学习商品或者特征的共同出现频繁程度和利用历史数据中可用的相关性。
- 泛化是基于相关性的传递性,探索从未出现或者极少出现过的新的特征组合。
- 基于记忆的推荐系统通常更加直接地和与用户交互过的商品相关。
- 和基于记忆的推荐系统相比,基于泛化的推荐系统倾向于提升推荐商品的多样性。
- Wide Linear Model用于memorization。Deep Neural Network用于generalization
2、广义线性模型
- 在稀疏特征上使用跨产品(cross-product)特征变换可以有效的实现记忆
- 跨产品变换的一个局限性是不能产生没有在训练集中出现过的查询语句-商品特征对。
3、DNN模型
- DNN模型是基于嵌入的模型,分解机FM或者深度神经网络都是基于嵌入(embedding-based)的模型,这种模型通过学习每个query和item的低维稠密embedding向量,可以泛化从未出现过的查询语句-商品特征对,同时减少特征工程的负担。
- 相比之下,DNN几乎不需要特征工程。通过对低纬度的dense embedding进行组合可以学习到更深层次的隐藏特征。但是,缺点是有点over-generalize(过度泛化)。推荐系统中表现为:会给用户推荐不是那么相关的物品,尤其是user-item矩阵比较稀疏并且是high-rank(高秩矩阵)
wide部分
Wide模型就是一个广义线性模型。
$y=w^Tx+b$
w x分别是d维向量
可以在y的基础上加上sigmoid激活函数。
特征集x包含原始输入特征和转换特征。
最重要的转换是内积转换( cross-product transformation)。
内积转换公式:$ \phi_{k}(x) = \prod\limits_{i=1}^{d} x_i^{c_{ki}} \qquad c_{ki}\in \left\{0,1\right\}$
$c_{ki}$ 表示第i个特征是否是第k个转换的一部分,1表示是,0表示否。
内积转换这种方式可以捕捉特征间的相互作用,给原来的线性模型增加非线性特性。
特征的选择与喂入:
单个特征的喂入:根据人工经验、业务背景,将我们认为有价值的、显而易见的特征及特征组合,喂入Wide侧。
交叉特征的选择:
由模型调用人员自行选择需要交叉特征,使用cross_feature工具自行交叉后输入wide侧。
deep部分
Deep模型是一个前馈神经网络。
对于类别特征,原始输入是特征字符串。
每一个稀疏的高维的类别特征首先被转换进一个低维的稠密的实值(real-valued)向量,也就是经常说的embbeding向量。
embbedings的维度通常大约在$O(10)-O(100)$。
embedding向量是随机初始化的,并且该值在随后在模型训练期间被训练到使最终的损失函数最小。
这些低维实向量之后在前向传播时被喂入神经网络隐藏层。
隐层公式:
$a^{(l+1)} = f( W^Ta^{(l)} + b^{(l)}) $
l是层数,f是激活函数。
其中f是激活函数,可以是ReLU
其实看图可知,“第一层”是稀疏的类别特征,“第二层”才是dense embedding。
实际应用的时候,原始类别特征直接通过通过tensorflow的特征工具包装后输入到deep即可。
联合训练
联合训练是指同时训练Wide模型和Deep模型,并将两个模型的结果的加权和作为最终的预测结果。
区别于集成学习,集成学习的每个模型是独立训练的。
wide和deep模型的联合训练是通过使用小批量随机优化同时将输出的梯度反向传播到模型的wide和deep部分来完成的。
$P(Y=1∣x)=σ(w^T_{wide}[x,ϕ(x)]+w^T_{deep}a^{(l_{f})}+b)$
其中Y是二分类的label,$σ(x)$是sigmoid function。
$ϕ(x)$是对原始特征x做cross product transformations,b是bias项。
$w_{wide}$是所有wide模型权重向量,$w_{deep}$是应用在最终激活层$a^{(l_{f})}$上的权重。
训练的方法:
- Wide模型:FTRL
- Deep模型:AdaGrad
在线学习
热启动系统解决模型训练实时性问题,该系统使用原来模型中的嵌入和线性模型权重初始化。
在线预测
模型服务器每次收到(app召回集合+当前用户特征),模型服务器返回每个app的score。
score就是对于wide & deep模型的一次 forward pass。
为了缩短响应时间10ms以内,并行预测,例如可以将分布式多线程的计算不同批次app的得分。
评估
线下评估:离线auc
线上评估:点击率,下载率等
例子
谷歌应用市场
1、训练数据
数据生成包括:
- 词汇生成(可能是用户的查询词汇,和app的词汇表),
- 离散特征map成id,
- 连续特征“归一化”
训练数据构成:
- 用户数据(包括搜索关键词)
- item数据(展示的app)
- 用户与item共同出现一次表示一条数据,label是下载标签
原始的稀疏特征(用户安装和查询展示的app),在wide&deep两个部分中都会用。
2、deep 特征:
包括连续特征和类别特征
- 年龄(下一层是全连接层)
- 人口学特征 设备类型 用户安装的app 候选的app (下一层是embedding)
3、wide 特征:
- 用户安装的app 候选的app (首先会特征组合)
总结:这个例子是国外的例子,对于业务上的特征输入论文中没有说太清楚。
只能自己大胆推测原始数据以及特征是如何处理的。
我们要确定一条数据里面到底有哪些东西,正样本负样本如何区分的:
输入模型的数据例子:
搜索词 | 人口学特征(空间、年龄、性别、文化、职业、收入、生育率) | 设备类别 | app(类别、词汇、下载量) | 是否下载 |
---|
收入分类
原始数据
1、wide线性特征:
base_columns = [
education(categorical_column),
marital_status(categorical_column),
relationship(categorical_column),
workclass(categorical_column),
occupation(categorical_column_with_hash_bucket),
age_buckets(bucketized_column),
]
教育,婚姻状况,关系,工作类型,职业,年龄段
2、wide组合特征:
crossed_columns = [
tf.feature_column.crossed_column(
['education', 'occupation'], hash_bucket_size=_HASH_BUCKET_SIZE),
tf.feature_column.crossed_column(
[age_buckets, 'education', 'occupation'],
hash_bucket_size=_HASH_BUCKET_SIZE),
]
教育+职业,年龄+教育+职业。
3、deep特征:
deep_columns = [
age(numeric_column),
education_num(numeric_column),
capital_gain(numeric_column),
capital_loss(numeric_column),
hours_per_week(numeric_column),
tf.feature_column.indicator_column(workclass),
tf.feature_column.indicator_column(education),
tf.feature_column.indicator_column(marital_status),
tf.feature_column.indicator_column(relationship),
tf.feature_column.embedding_column(occupation, dimension=8),
]
连续特征:年龄,受教育年限,资本收益,资本损失,每周工作时长。
指标特征:工作类型,教育程序,婚姻状况,关系,职业。
文章推荐系统
Deep 特征:
- 连续特征(下一层是全连接层):
文章向量
文章权重
用户权重 - 类别特征(下一层是embedding)
渠道id
wide 特征(下一层特征组合):
渠道id
参考
简单易学的深度学习算法——Wide & Deep Learning
看Google如何实现Wide & Deep模型(1)
Wide & Deep Learning for Recommender Systems 论文PDF下载
Google推荐系统Wide & Deep Learning for Recommender Systems论文翻译&解读
Wide & Deep Learning for Recommender Systems 论文阅读总结
一文读懂并学会使用Wide&Deep 输入特征说明
推荐系统 Wide & Deep 谷歌app推荐部分代码
文章推荐系统 基于 Wide&Deep 模型的在线排序
kaggle-2美国人口普查年收入50K分类 原始数据
Wide&Deep kaggle-2美国人口普查年收入50K分类代码
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。