作者: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