CTR预估中的WideAndDeep模型
目录
以Google APP store为例,预测用户点击或者下载或者购买其中一个APP的概率。
CTR预估系统的工作流程为:
大致分为两步:
- Query--查询
- 得到Items
也就是所说的Retrieval(召回)+Ranking(排序).
而WindAndDeep模型所做的工作就是Ranking部分。
以Google APP store为例,预测用户点击或者下载或者购买其中一个APP的概率。
Query:当打开APP store的时候,就产生了一个Query,它包含两部分的特征:User features,contextual features。User features 包括性别、年龄等人口统计特征,Contextual features包括设备、时间等上下文特征,这些特征通常一起给定到训练集和测试集中。
Items:App store 根据我们的Query给出的推荐列表,也称为impression(物品画像?)
User Action:根据系统的推荐列表,用户所产生的行为。
Logs:Query+Impression+UserAction 这些操作都被记录下来,作为数据提供给Learner学习。
Retrival:
利用机器学习模型和一些人为定义的规则,来返回最匹配的Query的一个小的items集合,这个集合就是最终的推荐列表的候选集。
Ranking:
Retrival(召回)之后,就是Ranking(排序)阶段。Retrival减小了候选items池,Ranking system要做的就是对比当前的Query,对候选集中的所有item进行打分。
WideAndDeep模型:
架构图:
Wide部分(线性模型,常用LR):
主要处理类别型特征,学习一个低纬度的特征,用以提高泛化能力,具有记忆功能。
- 组合特征(Cross Product Transformations)
- 离散特征
参数:
- linear_feature_columns 线性模型的输入特征
- linear_optimizer 线性模型的优化函数,定义权重的梯度更新算法,默认采用FTRL。所有默认支持的linear_optimizer和dnn_optimier可以在optimizer.py的OPTIMIZER_CLS_NAMES变量中找到相关定义。
- join_linear_weights 按照代码中的注释,如果join_linear_weights=true,线性模型的权重会存放在一个tf.Variable中,可以加快训练,但是linear_feature_columns中的特征列必须都是sparse feature column并且每个feature column 的combiner必须是“sum”。经过自己线下的对比试验,对模型的预测能力似乎没有太大影响,对训练速度有所提升,最终训练模型时我们保持了默认值
Deep部分(DNN):
- 连续特征
- Embedding后的离散特征
参数:
- dnn_feature_columns DNN模型的输入特征
- dnn_optimizer DNN模型的优化函数,定义各层权重的梯度更新算法,默认采用Adagrad。
- dnn_hidden_units 每个隐层的神经元数目
- dnn_activation_units 隐层的**函数,默认采用ReLu
- dnn_dropout 模型训练中隐层单元的drop_out比例
- gradient_clip_norm 定义gradient clipping,对梯度的变化范围作出限制,防止gradient vanishing或gradient explosion.wind and deep模型中默认采用tf.clip_by_global_norm
- embedding_lr_multipliers embedding_feature_column到float的一个mapping。对指定的embedding feature column在计算梯度时乘以一个常数因子,调整梯度的变化速率。
模型训练部分:
使用范围:
WideAndDeep模型适用于非常稀疏的大规模分类或回归问题。比如推荐系统、search、ranking问题。
输入稀疏通常由离散特征有非常非常多个可能的取值造成的,one-hot之后维度非常大。
缺点:
Wide部分需要人为的特征工程。