《Wide & Deep Learning for Recommender System》是Google发表在 DLRS 2016 上的文章。Wide&Deep模型的核心思想是结合线性模型的记忆能力(Memorization)和 DNN 模型的泛化能力(Generalization),从而提升整体模型性能。
一个推荐系统的整体架构由两部分组成,检索系统(或者说候选生成系统)和排序系统(排序网络)。
当user发出一个 query 的时候,首先用检索(retrieval) 的方法对大数据集进行初步筛选,返回最匹配 query 的一部分物品列表,这里的检索通常会结合采用机器学习模型(machine-learned models)和人工定义规则(human-defined rules)两种方法。从大规模样本中召回最佳候选集之后,再使用排序系统对每个物品进行算分、排序,分数记为,是用户采取的行动(点击或购买),是特征,包括用户特征(国家、语言、年龄等)、上下文特征(今天周几、时段早晚、设备信息等)、影响力特征(物品本身的评价、上线时间等)。
推荐系统的主要挑战之一,是同时解决Memorization和Generalization。
- Memorization
面对拥有大规模离散sparse特征的CTR预估问题时,将特征进行非线性转换,然后再使用线性模型是在业界非常普遍的做法,最流行的即「LR+特征叉乘」。Memorization 通过一系列人工的特征叉乘(cross-product)来构造这些非线性特征,捕捉sparse特征之间的高阶相关性,即记忆历史数据中曾共同出现过的特征对。
特征叉乘其实本质上就是一种特征组合,组合的原因是组合特征拥有比单个特征更好的性质(或者说对目标帮助更大)。下面是一个例子:
容易看出,上图的两类样本点是线性不可分的,那么我们常规的方法是对特征进行非线性映射,然后再利用线性模型进行拟合。一种可行的方法是将特征(记为)划分成(记为和)从而得到一个代表象限的特征。以为特征建模,上述分类问题就迎刃而解了。
论文中的例子如下:AND(user_installed_app=netflix, impression_app=pandora)是特征叉乘得到的二阶特征,当且仅当一个用户下载了Netflix后又点击了Pandora的时候此特征才为1。这个特征揭示了Netflix和Pandora之间的关联。
Memorization的一个典型模型就是使用大量的原始sparse特征和叉乘特征作为输入的LR模型,很多原始的dense特征通常也会被分桶离散化构造为sparse特征。这种做法的优点是:模型可解释高,实现快速高效,特征重要度易于分析,在工业界已被证明是很有效的。这种做法的缺点是:1、需要大量人工进行的特征工程;2、容易过拟合。当我们进行细粒度的特征叉乘时,我们的模型实际上可以视作将训练集记忆下来,过拟合非常严重,较粗粒度的特征叉乘可以一定程度上缓解这个问题;3、无法捕捉训练数据中未曾出现过的特征对,即泛化能力较差。
- Generalization
Generalization(泛化)可以理解为相关性的传递(transitivity),会学习新的特征组合,来提高推荐物品的多样性。泛化往往通过学习 low-dimensional dense embeddings 来探索过去从未或很少出现的新的特征组合来实现,通常的 embedding-based model 有 Factorization Machines(FM) 和 Deep Neural Networks(DNN)。特殊兴趣或者小众爱好的用户,query-item matrix 非常稀疏,很难学习,然而 dense embedding 的方法可以得到对所有 query-item pair 非零的预测,这就会导致 over-generalize,最终推荐不怎么相关的物品。这点和 LR 正好互补,因为 LR 只能记住很少的特征组合。
综上所述,Memorization根据历史行为数据,产生的推荐通常和用户已有行为直接相关的物品。而Generalization会学习新的特征组合,提高推荐物品的多样性。 论文结合两者的优点,提出了一个新的学习算法 Wide & Deep Learning,其中Wide & Deep分别对应Memorization & Generalization。
Wide & Deep 模型的架构如下:
对一个 Logistic Regression 问题来说,模型给出的预测如下:
其中是二分类的样本标签,是 sigmoid function ,是原始特征叉乘得到的新特征,是偏差项,是 wide model 中的参数权重,是 deep model 中作用在最后一个隐藏层输出上的参数权重。
具体到论文中的 Google Play 上的具体实验模型,其结构如下:
需要注意的是,我们的模型是联合训练(Joint Training)的,和集成(Ensemble)不同。集成是每个模型单独训练,再将模型的结果聚合。相比联合训练,集成的每个独立模型都得学得足够好才有利于随后的聚合,因此每个模型的model size也相对更大。而联合训练是同时训练一个模型中的wide model部分和deep model部分,wide部分只需要做少部分的特征叉乘来弥补deep部分的不足,不需要一个full-size的wide模型。
论文中,作者通过梯度的反向传播,使用 mini-batch stochastic optimization 训练模型参数,并对 wide 部分使用带 L1 正则的 Follow- the-regularized-leader (FTRL) 算法,对deep部分使用 AdaGrad 算法。
模型的落地分为三步:
- Data Generation
Label: 标准是 app acquisition,用户下载为 1,否则为 0 。
Vocabularies: 将类别特征(categorical features)映射为整型的 id,连续的实值先用累计分布函数CDF归一化到[0,1],再划档离散化。
- Model Training
训练数据有 500 billion, Input layer 会同时产生稀疏(sparse)的和稠密(dense)的特征,具体的 Model 上面已经讨论过了。需要注意的是,当新的训练数据来临的时候,我们用的是热启动(warm-starting)方式,也就是从之前的模型中读取 embeddings 以及 linear model weights 来初始化一个新模型,而不是全部推倒重新训练。
- Model Serving
当模型训练并且优化好之后,我们将它载入服务器,对每一个 request,排序系统从检索系统接收候选列表以及用户特征,来为每一个 app 算分排序,分数就是前向传播的值(forward inference)。
Reference: