前言
最近读了下Google的两篇文章《Wide&Deep Learning》和《Deep&Cross Network》,趁着热乎比较下,顺道写个demo,免得后面用的时候瞎搞。
前者是用来给用户推荐潜在喜欢的APP;后者是用来预测用户可能点击的广告排序。基于用户基本信息和行为日志来做个性化的推荐,是商业化的重要一步,做得好,用户使用起来甚是满意,广告商支付更多费用;做得差,大家只能喝喝西风,吃点咸菜。
Why Deep-Network ?
关于推荐,前面博文FTRL系列讲过,那是种基于基本特征和二维组合特征的线性推荐模型。其优点:模型简单明白,工程实现快捷,badcase调整方便。缺点也很明显:对更高维抽象特征无法表示,高维组合特征不全。而Deep-Network能够表达高维抽象特征,刚好可以弥补了线性模型这方面的缺点。
Why Cross-Network ?
组合特征,为什么止步于两维组合?多维组合,不单说手挑组合特征费时费力,假设特征都组合起来,特征的数量非得彪上天不可。但是Cross-Network(参考5)则可以很好地解决组合特征的数量飙升的问题。所以说,并不是问题真难以解决,只不过牛人还没有解它而已。
结构比较
啥都不如图明白,直接上图,左侧 Wide and Deep Network 右侧 Deep and Cross Network
上面两个图清晰地表示了两种方法的框架结构。
特征输入
1)W&D的特征包括三方面:
User-Feature:contry, language, demographics.
Contextual-Feature:device, hour of the day, day of the week.
Impression-Feature:app age, historical statistics of an app.
1.1)Wide部分的输入特征:
raw input features and transformed features [手挑的交叉特征].
notice: W&D这里的cross-product transformation:
只在离散特征之间做组合,不管是文本策略型的,还是离散值的;没有连续值特征的啥事,至少在W&D的paper里面是这样使用的。
1.2)Deep部分的输入特征: raw input+embeding处理
对非连续值之外的特征做embedding处理,这里都是策略特征,就是乘以个embedding-matrix。在TensorFlow里面的接口是:tf.feature_column.embedding_column,默认trainable=True.
对连续值特征的处理是:将其按照累积分布函数P(X≤x),压缩至[0,1]内。
notice: Wide部分用FTRL+L1来训练;Deep部分用AdaGrad来训练。
Wide&Deep在TensorFlow里面的API接口为:tf.estimator.DNNLinearCombinedClassifier
2)D&C的输入特征及处理:
所有输入统一处理,不再区分是给Deep部分还是Cross部分。
对高维的输入(一个特征有非常多的可能性),加embeding matrix,降低维度表示,dense维度估算: 6∗(category−cardinality)1/4 6 ∗ ( c a t e g o r y − c a r d i n a l i t y ) 1 / 4 。
notice:W&D和D&C里的embedding不是语言模型中常说的Word2Vec(根据上下文学习词的低维表示),而是仅仅通过矩阵W,将离散化且非常稀疏的one-hot形式词,降低维度而已。参数矩阵的学习方法是正常的梯度下降。
对连续值的,则用log做压缩转换。
stack上述特征,分别做deep-network和Cross-network的输入。
cross解释
cross-network在引用5中有详细介绍,但是在D&C里面是修改之后的cross-network。