DNN CTR预估介绍

如何支持大规模离散DNN一直是工业界面临的难题

2012年 ICML  的《Deep Networks for Predicting Ad Click Through Rates》

embedding

Embedding的思路追溯了Hinton 1986的论文《Learning distributed representations of concepts》,从Mikolov的Word2vec开始认识它。从离散到连续, embedding确实是非常合适的方案, embedding可以把离散特征嵌入到高纬连续空间, 而且embedding 可以通过BP训练求解。

Embedding解决了离散到连续的transform并不代表解决了所有的问题。特征量大要解决,一种很显而易见的思路就是把离散特征的representation vector 都归一到每个category field上, 如此一来dnn的输入规模瞬间回到了 num_category_field * dimension 的复杂度。

fm

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 表示。下一步就是产生输入层,通过使用每个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,通过隐层数以及隐层节点数可以控制交叉程度。 输入层复杂度增加会影响整个系统的吞吐,如果样本数据量足够大, 尽可能设计简单一些的模型, 提高吞吐量, 大数据本身就可以解决很多问题。

Wide and Deep Learning

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效果杠杠的, 足够解决大部分实际问题。

发布了105 篇原创文章 · 获赞 27 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/serenysdfg/article/details/103745886
DNN