算法复现·推荐算法 | DeepFM for CTR Prediction
背景
点击率(CTR)的预测在推荐系统中至关重要,目的是估算用户点击推荐项目的可能性。大多数推荐系统的目标都是最大程度地增加点击次数,因此返回给用户的项目也根据估算的点击率进行排名;而在其他应用场景(例如互联网广告)中,提高收入也很重要,因此项目的排名策略调整为所有候选项的点击率X出价,其中“出价”是用户点击商品后系统获得的收益。故无论哪种情况,很明显,关键都在于正确估算点击率。
难点与现状
对于CTR预测而言,了解用户点击行为背后的隐式交互特征非常重要:
比如,人们经常在用餐时下载用于送餐的APP,这表明应用程序类别和时间戳之间的(2阶)交互作用可用作CTR预测的一个特征。再比如,男性青少年喜欢射击游戏和RPG游戏,这意味着应用类别,用户性别和年龄的(3阶)交互作用也是CTR的一个特征。
如上,用户点击行为背后的各种交互非常复杂,其中低阶和高阶特征交互均发挥重要作用。
因此,CTR预测关键在于如何有效的建模捕捉交互特征。一些功能交互很容易理解(如上面的实例),但其实大多数交互都隐藏在数据中,并且很难识别(例如,零售业经典关联规则“尿布和啤酒”是从数据中提取的,而不是由专家发现的),这类交互只能通过机器学习自动捕获。而即使对于易于理解的交互,当其规模很大时,也很难做到详尽的建模描述。
目前主流的几种方法,如FTRL、FM、CNN、RNN、DNN、PNN、Wide&Deep要么仅支持低阶特征(或高阶特征),要么就需要大量的特征工程。
故本文提出了一种DeepFM方法,既能支持低阶与高阶的特征交互,同时引入了特征嵌入的共享策略,以避免特征工程。
文章模型
数据集描述:
假设用于训练的数据集包含n个实例(x,y)
其中x是涉及用户和产品的m个字段的数据记录,y∈{0,1}是表示用户点击行为的标签(1表示点击、0表示未点击), x通常包括类别字段(例如,性别,位置)和连续字段(例如,年龄)。
数据处理阶段,每个类别字段均表示为one-hot的向量,而每个连续字段则表示为值本身,或离散化后的one-hot的向量。
然后,将每个实例转换为(x,y)
其中,
是d维向量,其中X field j是x的第j个字段的矢量表示。通常,x是高维且极为稀疏的。
CTR预测的任务就是建立一个预测模型y = CT R_model(x)来估计用户在给定上下文中点击特定应用的概率。
DeepFM:
DeepFM由两个部分组成,FM部分和Deep部分,它们共享相同的输入。
对于特征i,标量wi用于权衡其1阶重要性,而潜在矢量Vi用于测量其与其他特征相互作用的影响。
Vi馈入FM组件以建模2阶特征交互,并馈入深层组件以建模高阶特征交互。
联合训练预测模型所有参数,包括wi,Vi和网络参数(下文提到的W(l),b(l)),则有:
其中ˆ y∈(0,1)是预测的CTR,yFM是FM分量的输出,而yDNN是DNN分量的输出。
FM Component:
除了特征之间的线性(1阶)交互作用外,FM模型将2阶的特征交互作为各个特征潜在向量的内积。它可以比以前的方法更有效地捕获2阶特征交互,尤其是在数据集稀疏的情况下。在先前的方法中,仅当特征i和特征j都出现在同一数据记录中时,才能训练特征i和j的交互作用的参数。在FM中,通过其潜在向量Vi和 Vj的内积对其进行测量。由于这种灵活的设计,只要i(或j)出现在数据记录中,FM都可以训练潜矢量Vi(Vj)。因此,FM可以更好地学习从未或很少出现在训练数据中的特征交互。
如图2所示,FM的输出是2个单元的总和:
其中,
前半部分反映了1阶特征的重要性,后半部分表示2阶特征交互的影响。
Deep Component:
Deep部分用于学习高阶特征交互。如图3所示,数据记录(向量)被馈送到神经网络,这些原始特征输入向量通常是高度稀疏且超高维的,类别字段与连续字段混合并且按标签(例如性别,位置,年龄)分组。
故在进一步馈入第一隐藏层之前,嵌入层会将输入向量压缩为低维,密集的实值向量,否则网络可能不堪重负。
图4突出显示了从输入层到嵌入层的子网结构。注意:1)虽然不同输入场矢量的长度可以不同,但它们的嵌入大小相同(k);2)FM中的潜在特征向量(V)现在用作网络权重,这些权重已被学习并用于将输入场向量压缩为嵌入向量。
与[Zhang et al,2016]不同,本文没有使用FM的潜在特征向量来初始化网络,而是将FM模型作为整体学习架构的一部分。这样一来,我们就无需通过FM进行预训练。
将嵌入层的输出表示为:
其中ei是第i个字段的嵌入,m是字段数。然后,馈入深度神经网络,正向过程为:
其中l是层深度,σ是激活函数。a(l),W(l),b(l)是第l层的输出,模型权重和偏差。进一步,生成一个密集的实值特征向量,最终将其输入到用于CTR预测的S型函数中:
其中| H |是隐藏层的数量。
算法复现
数据处理
设定权重
模型训练
模型预测
模型评估
结果输出
参考文献:
Guo H , Tang R , Ye Y , et al. DeepFM: A Factorization-Machine based Neural Network for CTR Prediction[J]. 2017.
参考代码:
https://github.com/ChenglongChen/tensorflow-DeepFM
数据下载:
https://www.kaggle.com/c/porto-seguro-safe-driver-prediction/overview
--------- END ----------
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Linux文件/目录的权限及归属管理使用
- Android自定义环形LoadingView效果
- Android隐藏标题栏及解决启动闪过标题的实例详解
- Linux使用sed命令替换字符串教程
- Android实现获取短信验证码并自动填写功能
- Android 定时器实现图片的变换
- Android 软键盘状态并隐藏输入法的实例
- Linux磁盘管理之LVM的使用
- Android编程之菜单Menu的创建方法示例
- Ubuntu下Docker CE的安装
- 基于Android自定义控件实现雷达效果
- Android 中 onSaveInstanceState()使用方法详解
- Linux修改主机名的简单方法
- Android RecycleView使用(CheckBox全选、反选、单选)
- Android自定义滑动解锁控件使用详解