闲聊DNN CTR预估模型
原文:http://www.52cs.org/?p=1046
闲聊DNN CTR预估模型
作者:Kintocai, 北京大学硕士, 现就职于腾讯。
伦敦大学张伟楠博士在携程深度学习Meetup[1]上分享了Talk《Deep Learning over Multi-field Categorical Data – A Case Study on User Response Prediction in Display Ads》。他在2016 ECIR发表了篇同名的paper[2]。八卦一句, 熟悉推荐领域的人应该会知道此人, svdfeature[3]的作者之一, 11年、12年的KDDCUP都有他的身影。本文不打算完完整整详解Dr. Zhang的这篇文章, 而是希望借此来闲聊DNN在 CTR Prediction 问题上的一些设计思路。
基于Neural Network 解决CTR Prediction并不是很新的想法, 虽然我无从追溯最早尝试实用NN解决CTR Prediction 问题的年份, 但是可以确定2010年已经有了很多NN的尝试, 2012年KDDCUP Track 2 腾讯搜索广告CTR 预估Task上亚军团队使用单隐层的ANN了(包括ANN单模型以及基于ANN的Ensemble)[4]。NN是典型的连续值模型,而CTR Prediction 的输入更多时候是离散特征。理所当然地可以把离散特征全部设计成连续特征(表现为各种similarity、ctr等等), 而事实上大量的特征并不适合设计成连续值特征, 比如搜索广告的历史点击query 序列。如何支持大规模离散DNN一直是工业界面临的难题。
2012年 ICML Online Advertising Workshop上google 的researcher Greg Corrado 分享了Talk 《Deep Networks for Predicting Ad Click Through Rates》[5]。针对DNN CTR Prediction, Google 提出的方案如下:
Embedding的思路应该说历史悠久了, 可以追溯了Hinton 1986的论文《Learning distributed representations of concepts》, 伴随这NNLM的兴起而火起来, 更多的人应该是从Mikolov的Word2vec[6]开始认识它的。从离散到连续, embedding确实是非常合适的方案, embedding可以把离散特征嵌入到高纬连续空间, 而且embedding 可以通过BP训练求解。
Embedding解决了离散到连续的transform并不代表解决了所有的问题。CTR Prediction已经步入了千亿样本、千亿特征的时代[7],Google Play App 推荐都已经是5000亿样本了[8]。 如果每个离散特征都对应一个representation vector,假设dimension 为50, 那么就是50 * 千亿 级别的参数。毫无疑问, 训练如此庞大参数规模的模型是非常困难的,甚至不可为。解决这个问题可以有很多思路, 比如砍掉低频特征、降低representation vector dimension、特征选择、设计连续值特征等等。试着回想一下离散特征体系, 很容易可以发现离散特征总量是千亿级别, 但是category field (feature set或则叫feature slot)总数一般也就几十到几百, 那么一种很显而易见的思路就是把离散特征的representation vector 都归一到每个category field上, 如此一来dnn的输入规模瞬间回到了 num_category_field * dimension 的复杂度。
再看看google的这个模型, 脱去所有隐层, 明显就是FM(factorization machines)了[10]。
FM的前半部分可以看成是Logistic Regression, 后半部分是Feature Interaction。看到这里,有经验的人肯定会想到,train 一个FM模型就可以得到embedding, 然后再把FM 学到的模型输入给DNN。Dr. Zhang 在此思路设计的DNN 模型如下:
这里Dr.Zhang 有一个假设:每个category field 有且只有唯一 positive value。
如上图所示, FM可以得到每个离散特征的feature vector, 基于上面的假设,所有的离散特征都可以归一到所属category field下, 每个category field 可以用w 以及一个feature vector 表示。下一步就是产生输入层, Dr.zhang的设计非常有意思, 如下图:
他通过使用每个category field的feature vector 做inner product 或则 outer product 来产生dnn 输入层(也就是上图里面的Product Layer)。这种做法有助于特征的交叉,同时也会导致另外一个问题: 输入层的膨胀。假设有100个category field, inner product 就会产生接近5000个输入节点, outer product 那就更多了。 为解决这个问题作者又引入了一个矩阵分解的方法来优化, 也算是比较常见的优化方法吧。除此之外,文章还提到了一些包括激活函数选择、 隐层数选择、dropout 概率选择等等trick, 这些都不是我今天想要讲的重点, 有兴趣的同学可以参看对应的paper。
回过头,我们来看看Dr.Zhang模型的一些问题, 第一个问题是category 有且仅有一个positive value这个假设大部分时间是不成立的。比如用户的兴趣特征, 很可能有多个兴趣标签, 也可能缺失。当然这个问题也很好解决, 多个的话可以选择average(类似于Word2vec的隐层处理), 缺失的话可以选择均值默认填充。第二个问题,dropout的真的好么?直观上广告特征输入的稀疏性很强, 大量的category field 缺失, dropout 很可能会极大稀疏性, 引起效果损失。但是用不用dropout没有绝对性, 和特征覆盖以及样本数量强相关, 比如你和百度凤巢或则Google一样拥有数千亿样本, 就没有必要使用dropout。第三个问题, 输入层是否真的需要做inner product或则outer product?这应该是学术界的方法, Dr.zhang引用的那篇文章还没公开发表, 所以暂时没有对比数据。但是只要展开w 以及feature vector, 隐层潜在就会完成outer product,通过隐层数以及隐层节点数可以控制交叉程度。 输入层复杂度增加会影响整个系统的吞吐,如果样本数据量足够大, 尽可能设计简单一些的模型, 提高吞吐量, 大数据本身就可以解决很多问题。
Google Brain的同学曾经带来了一次关于Tensorflow的讲座, 其中就讲到了Google的App 推荐系统的DNN模型设计。之后没多久Google 公布了实现细节的paper[8]并且在Tensorflow r0.9 提供了对应的高级API[11]。Wide and Deep Learning模型设计:
这个模型的特点是结合了离散LR 以及 Deep Neural Network,category feature 通过embedding的方式输入到DNN学习, 其他一些特征通过LR 方式学习。LR部分通过Feature Cross 精细刻画场景, DNN部分则强调Generalization, Combine 二者尝试得到更优的效果。这种设计虽然好玩, 但是相对于纯Dense Feature的模型设计优势也没有多大, 毕竟有一些问题可以通过特征和数据解决。不过可以换一个角度看这个问题, DNN的每一个隐层都可以有新的输入, 那么这个模型其实就是在最后一个隐层增加输入而已, 这也是很常见的设计方案。相反但是这种模型设计在一些特定的地方是非常有帮助的, 比如需要增加position bias 特征的时候, 把position bias 特征放在最后一个隐层就很有意义(有一些特征真的不适合乱交叉)。
最后我们来回顾DNN CTR Prediction模型的设计, 综合学术界以及工业界的经验, 整个模型的设计思路大致如下:
通过embedding的方式把离散特征转化为Dense Feature, 输入层同时可以增加其他Dense 特征, 比如CTR统计特征、similarity 特征、pv、click等等。每一个隐层都可以增加新的特征输入, 尤其是最后一个隐层。
工业上很多时候都会选择基于FM来产生representation,包括比较有名的百度凤巢、今日头条、阿里。【注:其实不是基于FM产生representation的方法最优秀, 只是国内大部分公司都没有复杂模型自主研发能力, 如果TF、MxNet之类开源DNN Lib没有现成支持离散特征Embedding版本的话就只好如此了。还有一种原因是线上迁移成本以及实际应用场景缘故导致的, 比如线上也想用FM\LR的预估。】输入层可以使用 FM产生的所有数据,包括feature vector、w,同时可以引入其他统计值特征以及新设计的连续值特征。学术界以及一些比赛当中会有一些CNN预估模型, 设计方案也特别令人印象深刻, 这里就不多展开了。
DNN 虽然已经是非常常见的模型了, 而且工业界应用非常广泛了, 但是杀鸡焉用牛刀, 离散LR依然是二分类问题场景的首选方案。不可小看大离散LR, 设计精良的离散LR效果杠杠的, 足够解决大部分实际问题。
到此本文结束, 本文旨在介绍模型设计, DNN的设计细节有兴趣可以未来再探讨。水平有限, 仓促写作, 如有错误或理解错误, 随时沟通!
参考文献
- http://techshow.ctrip.com/archives/1149.html
- Deep Learning over Multi-field Categorical Data – A Case Study on User Response Prediction. Weinan Zhang
- http://svdfeature.apexlab.org/wiki/Main_Page
- http://www.kddcup2012.org/
- https://sites.google.com/site/admlworkshop/schedule
- https://code.google.com/p/word2vec/
- Large-scale Deep Learning at Baidu - CIKM 2013. Kai Yu.
- Wide & Deep Learning for Recommender Systems. Heng-Tze Cheng,Levent Koc
- http://mp.weixin.qq.com/s?__biz=MzAwNDI4ODcxNA==&mid=2652243946&idx=2&sn=de8bb9a36fe9f2f0c97f30aaec87063f&scene=2&srcid=0727O4JXBdr5NU7sFOD48J69&from=timeline&isappin
- Factorization Machines. Steffen Rendle.
- https://www.tensorflow.org/versions/r0.10/tutorials/wide_and_deep/index.html
闲聊DNN CTR预估模型的更多相关文章
- 主流CTR预估模型的演化及对比
https://zhuanlan.zhihu.com/p/35465875 学习和预测用户的反馈对于个性化推荐.信息检索和在线广告等领域都有着极其重要的作用.在这些领域,用户的反馈行为包括点击.收藏. ...
- CTR预估模型演变及学习笔记
[说在前面]本人博客新手一枚,象牙塔的老白,职业场的小白.以下内容仅为个人见解,欢迎批评指正,不喜勿喷![握手][握手] [再啰嗦一下]如果你对智能推荐感兴趣,欢迎先浏览我的另一篇随笔:智能推荐算法演 ...
- 【转】- 从FM推演各深度CTR预估模型(附代码)
从FM推演各深度CTR预估模型(附代码) 2018年07月13日 15:04:34 阅读数:584 作者: 龙心尘 && 寒小阳 时间:2018年7月 出处: 龙心尘 寒小阳
- 深度CTR预估模型中的特征自动组合机制演化简史 zz
众所周知,深度学习在计算机视觉.语音识别.自然语言处理等领域最先取得突破并成为主流方法.但是,深度学习为什么是在这些领域而不是其他领域最先成功呢?我想一个原因就是图像.语音.文本数据在空间和时间上具有 ...
- PaddlePaddle分布式训练及CTR预估模型应用
前言:我在github上创建了一个新的repo:PaddleAI, 准备用Paddle做的一系列有趣又实用的案例,所有的案例都会上传数据代码和预训练模型,下载后可以在30s内上手,跑demo出结果,让 ...
- ctr预估模型
http://wenku.baidu.com/course/view/1488bfd5b9f3f90f76c61b8d
- 几句话总结一个算法之CTR预估模型
背景 假设现在有个商品点击预测的任务,有用户端特征性别.年龄.消费力等,商品侧特征价格.销量等,样本为0或者1,现在对特征进行one hot encode,如性别特征用二维表示,男为[1,0],女为[ ...
- CTR预估经典模型总结
计算广告领域中数据特点: 1 正负样本不平衡 2 大量id类特征,高维,多领域(一个类别型特征就是一个field,比如上面的Weekday.Gender.City这是三个field),稀疏 ...
- 计算广告CTR预估系列(七)--Facebook经典模型LR+GBDT理论与实践
计算广告CTR预估系列(七)--Facebook经典模型LR+GBDT理论与实践 2018年06月13日 16:38:11 轻春 阅读数 6004更多 分类专栏: 机器学习 机器学习荐货情报局 版 ...
随机推荐
- 关于Android中传递数据的一些讨论
在Android中编写过程序的开发人员都知道.在Activity.Service等组件之间传递数据(尤其是复杂类型的数据)很不方便.一般可以使用Intent来传递可序列化或简单类型的数据.看下面的代码 ...
- android 的几个黄色警告解决办法(转)
转自:http://my.eoe.cn/864234/archive/5162.html 1:Handler 1 2 3 4 5 6 7 8 // This Handler class should ...
- 详细分析Memcached缓存与Mongodb数据库的优点与作用
http://www.mini188.com/showtopic-1604.aspx 本文详细讲下Memcached和Mongodb一些看法,以及结合应用有什么好处,希望看到大家的意见和补充. Mem ...
- delphi CreateAnonymousThread 匿名线程
引用 http://www.cnblogs.com/del/archive/2011/05/18/2049913.html 先看一个非多线程的例子, 代码执行时不能进行其它操作(譬如拖动窗体): { ...
- Android 模拟器设置
这几个图标你应该是没有见过的,我来简单为你介绍下.最左边的图标其实你已经比较熟悉了,就是你睡觉前使用过的Android SDK管理器,点击它和点击SDK Manager效果是一样的.中间的图标是用来开 ...
- iOS中使用RegexKitLite来试用正则表达式
转:http://blog.csdn.net/nullcn/article/details/6338592 准备工作,下载RegexKitLite 软件包,解压后有2个文件,需要加载到project中 ...
- 异步图片下载引擎(升级版——ExecutorService+handler)
[Android分享] 异步图片下载引擎(升级版——ExecutorService+handler) [复制链接] 皮诺 13 主题 5 好友 844 积分 No.4 中级开发者 升级 2 ...
- Java并发编程的艺术(六)——线程间的通信
多条线程之间有时需要数据交互,下面介绍五种线程间数据交互的方式,他们的使用场景各有不同. 1. volatile.synchronized关键字 PS:关于volatile的详细介绍请移步至:Java ...
- android BitmapDrawable的使用
<span style="font-size:18px;"> //功能:显示缩略图,大小为40*40 //通过openRawResource获取一个inputStrea ...
- android获取屏幕长宽的方法
package com.kale.imageview02; import android.annotation.SuppressLint; import android.app.Activity; i ...