Wide & Deep论文阅读笔记

Overview

推荐系统可以类比为搜索排序系统,输入为query:用户和上下文信息,输出为排序好的物品集合。给定一个query,推荐系统所要做的任务就是返回在数据库中存在的若干相关物品,然后根据点击率或者购买情况等因素进行打分排序。其实,这就是推荐系统的两个核心任务:召回和排序。这篇文章我的理解主要是在排序任务。

Motivation

现有的一些线性模型为了增加非线性因素,往往会在做特征工程的的时候,会做cross-product,也就是特征组合,比如逻辑回归,最明显的应用是FM模型,将所有特征进行组合生成新的特征。但是这样会产生两个问题:会出现较为明显的过拟合问题,因为在特征组合时只是将出现过的特征(也即是类别特征为1)进行组合,而那些没有出现过的特征而不能够进行学习,因此这类模型只能根据自己记忆的历史数据的一些共现情况去对新的数据进行预测,模型的的泛化性能就会大大降低(可以简单理解为它的缺点是过拟合)。

一些深度模型,常见的比如一些Embedding方法或者一些深度神经网络,其优点是可以通过低维嵌入来生成以前没有出现过的的特征交互的特征表示,泛化性能比较好。但是缺点是面临一些冷门的物品的时候或者有特殊偏好的用户时,往往确束手无策,因为这类模型模型只会根据学习到的特征去进行推荐,而推荐结果也往往不能给这类极端用户推荐出他所喜爱的极端物品(可以简单理解它的特征为欠拟合)。比较好的做法是针对这类有特殊偏好的用户根据他的历史数据给他推荐和历史数据相关的一些物品。

上面描述的两类模型,前者是wide模型,后者就是deep模型,自然地,就可以将这两类模型进行结合,于是,wide & deep模型就应运而生了。

模型结构

模型的整体结构如下图所示:

wide测

可以理解为性性模型,其表达式如下所示:

y=\boldsymbol{w}^{T}[\boldsymbol{x}, \phi(\boldsymbol{x})]+b

其中 x 表示原始特征, \phi(\boldsymbol{x}) 表示特征组合生成的特征, b 表示偏置项。

deep测

深度模型对原始的高维稀疏类别型特征,先进行嵌入学习,转换为稠密、低维的实值型向量,转换后的向量维度通常在 10-100 这个范围,其表达式如下所示:

a^{l+1}=f\left(W^{l} a^{l}+b^{l}\right)

其中 l 表示层数, a^l 表示第 l 层的特征表达, f 表示激活函数。

将上面的两个模型进行融合,可以得到如下表达式:

P(Y=1 | \mathbf{x})=\sigma\left(\mathbf{w}_{\text {wide}}^{T}[\mathbf{x}, \phi(\mathbf{x})]+\mathbf{w}_{\text {deep}}^{T} a^{\left(l_{f}\right)}+b\right)

其中,Y 是我们要预估的行为,二值变量,如购买,或点击,Google 的应用场景为“是否安装 APP”。 σ 是 sigmoid 函数, W^{T} _{wide} 宽模型的权重, \phi(\boldsymbol{x}) 是宽模型的组合特征, W_{d​eep}^{T} 应用在深模型输出上的权重, a^(l_f​) 是深模型的最后一层输出,b 是线性模型的偏置。

这个深宽模型已经在 TensorFlow 中有开源实现,具体落地时整个数据流如下图所示。

整个流程分为三大块:数据生成,模型训练,模型应用。

数据生成

数据生成有几个要点:

  • 每一条曝光日志就生成一条样本,标签就是 1/0,安装了 App 就是 1,否则就是 0。
  • 将字符串形式的特征映射为 ID,需要用一个阈值过滤掉那些出现样本较少的特征。
  • 对连续值做归一化,归一化的方法是:对累积分布函数 P(X<=x) 划分 nq 个分位,落入第 i 个分位的特征都归一化为下式:

\frac{i-1}{n_{q}-1}

模型训练

整个模型的示意如图所示。其要点,在深度模型侧:

  1. 每个类别特征 embedding 成一个 32 维向量;
  2. 将所有类别特征的 embedding 变量连成一个 1200 维度左右的大向量;
  3. 1200 维度向量就送进三层以 ReLU 作为激活函数的隐藏层;
  4. 最终从 Logistic Regreesion 输出。
  5. 宽模型侧就是传统的做法:特征交叉组合。

当新的样本集合到来时,先是用上一次的模型来初始化模型参数,然后在此基础上进行训练。新模型上线前,会先跑一遍,看看会不会出事,算是一个冒烟测试。

模型应用

模型验证后,就发布到模型服务器。模型服务,每次网络请求输入的是来自召回模块的 App 候选列表以及用户特征,再对输入的每个 App 进行评分。评分就是用我们的“深宽模型”计算,再按照计算的 CTR 从高到低排序。为了让每次请求响应时间在 10ms 量级,每次并不是串行地对每个候选 App 计算,而是多线程并行,将候选 App 分成若干并行批量计算。正因为有这些小的优化点,GooglePlay 的 App 推荐服务,就是在峰值时每秒计算千万级的 App。

模型效果

总结

这个模型主要的贡献感觉是提出了一个框架,就是将wide模型和deep模型进行融合,具体在wide侧使用什么模型,使用什么特征,在deep测使用什么模型,使用什么特征这个根据效果来。基于这个思想产生了很多模型,比如知名的deepfm模型,所以,这篇文章为CTR的一些模型打开了一扇门,值得要好好看看!

发布于 2020-06-02 23:28