巨经典论文!推荐系统经典模型Wide & Deep

今天咱们剖析的也是推荐领域的经典论文,叫作Wide & Deep Learning for Recommender Systems。它发表于2016年,做者是Google App Store的推荐团队。这年恰好是深度学习兴起的时间。这篇文章讨论的就是如何利用深度学习模型来进行推荐系统的CTR预测,能够说是在推荐系统领域一次深度学习的成功尝试。node

著名的推荐模型Wide & deep就是出自这篇论文,这个模型由于实现简单,效果不俗而在各大公司普遍应用。所以它一样也能够认为是推荐领域的必读文章之一。web

摘要

在大规模特征的场景当中,咱们一般(2016年以前)是使用将非线性特征应用在线性模型上的作法来实现的,使用这种方式,咱们的输入会是一个很是稀疏的向量。虽然咱们要实现这样的非线性特征,经过一些特征转化以及特征交叉的方法是能够实现的,可是这会须要消耗大量的人力物力。数组

这个问题其实咱们以前在介绍FM模型的时候也曾经提到过,对于FM模型来讲,其实解决的也是一样的问题。只是解决的方法不一样,FM模型的方法是引入一个n x k的参数矩阵V来计算全部特征两两交叉的权重,来下降参数的数量以及提高预测和训练的效率。而在本篇paper当中,讨论的是使用神经网络来解决这个问题。服务器

解决问题的核心在于embedding,embedding直译过来是嵌入,可是这样并不容易理解。通常来讲咱们能够理解成某些特征的向量表示。好比Word2Vec当中,咱们作的就是把一个单词用一个向量来表示。这些向量就称为word embedding。embedding有一个特色就是长度是固定的,可是值通常是经过神经网络来学习获得的。网络

咱们能够利用一样训练embedding的方式来在神经网络当中训练一些特征的embedding,这样咱们须要的特征工程的工做量就大大地减小。可是仅仅使用embedding也是不行的,在一些场景当中可能会引发过拟合,因此咱们须要把线性特征以及稀疏特征结合起来,这样就可让模型既不会陷入过拟合,又能够有足够的能力能够学到更好的效果。多线程

简介

正如咱们以前文章所分享的同样,推荐系统也能够当作是搜索的排序系统。它的输入是一个用户信息以及用户浏览的上下文信息,返回的结果是一个排好序的序列。架构

正由于如此,对于推荐系统来讲,也会面临一个和搜索排序系统一个相似的挑战——记忆性和泛化性的权衡。记忆性能够简单地理解成对商品或者是特征之间成对出现的一种学习,因为用户的历史行为特征是很是强的特征,记忆性所以能够带来更好的效果。可是与之同时也会有问题产生,最典型的问题就是模型的泛化能力不够。并发

对于泛化能力来讲,它的主要来源是特征之间的相关性以及传递性。有可能特征A和B直接和label相关,也可能特征A与特征B相关,特征B与label相关,这种就称为传递性。利用特征之间的传递性, 咱们就能够探索一些历史数据当中不多出现的特征组合,从而得到很强的泛化能力。app

在大规模的在线推荐以及排序系统当中,好比像是LR这样的线性模型被普遍应用,由于这些模型很是简单、拓展性好、性能很强,而且可解释性也很好。这些模型常常用one-hot这样的二进制数据来训练,举个例子,好比若是用户安装了netflix,那么user_installed_app=netflix这个特征就是1,不然就是0。所以呢,一些二阶特征的可解释性就很强。机器学习

好比用户若是还浏览过了Pandora,那么user_installed_app=netflix,impression_app=pandora这个联合特征就是1,联合特征的权重其实就是这二者的相关性。可是这样的特征须要大量的人工操做,而且因为样本的稀疏性,对于一些没有在训练数据当中出现过的组合,模型就没法学习到它们的权重了。

可是这个问题能够被基于embedding的模型解决,好比以前介绍过的FM模型,或者是深度神经网络。它能够经过训练出低维度下的embedding,用embedding向量去计算获得交叉特征的权重。然而若是特征很是稀疏的话,咱们也很难保证生成的embedding的效果。好比用户的偏比如较明显,或者是商品比较小众,在这样的状况下会使得大部分的query-item的pair对没有行为,然而由embedding算出来的权重可能大于0,所以而致使过拟合,使得推荐结果不许。对于这种特殊的状况,线性模型的拟合、泛化能力反而更好。

在这篇paper当中,咱们将会介绍Wide & Deep模型,它在一个模型当中兼容了记忆性以及泛化性。它能够同时训练线性模型以及神经网络两个部分,从而达到更好的效果。

论文的主要内容有如下几点:

  1. Wide & Deep模型,包含前馈神经网络embedding部分以及以及线性模型特征转换,在广义推荐系统当中的应用
  2. Wide & Deep模型在Google Play场景下的实现与评估,Google Play是一个拥有超过10亿日活和100w App的移动App商店

推荐系统概述

这是一张经典的推荐系统的架构图:

当用户访问app store的时候会生成一个请求,这个请求当中会包含用户以及上下文的特征。推荐系统会返回一系列的app,这些app都是模型筛选出来用户可能会点击或者是购买的app。当用户看到这些信息以后,会产生一些行为,好比浏览(没有行为)、点击、购买,产生行为以后,这些数据会被记录在Logs当中,成为训练数据。

咱们看下上面部分,也就是从DataBase到Retrieval的部分。因为Database当中的数据量过大,足足有上百万。因此咱们想要在规定时间内(10毫秒)给全部的app都调用模型打一个分,而后进行排序是不可能的。因此咱们须要对请求进行Retrieval,也就是召回。Retrieval系统会对用户的请求进行召回,召回的方法有不少,能够利用机器学习模型,也能够进行规则。通常来讲都是先基于规则快速筛选,再进行机器学习模型过滤。

进行筛选和检索结束以后,最后再调用Wide & Deep模型进行CTR预估,根据预测出来的CTR对这些APP进行排序。在这篇paper当中咱们一样忽略其余技术细节,只关注与Wide & Deep模型的实现。

Wide & Deep原理

首先咱们来看下业内的经常使用的模型的结构图:

这张图源于论文,从左到右分别展现了Wide模型,Wide & Deep模型以及Deep模型。从图上咱们也看得出来所谓的Wide模型呢其实就是线性模型,Deep模型是深度神经网络模型。下面结合这张图对这两个部分作一个详细一点的介绍。

Wide部分

Wide部分其实就是一个泛化的形如 的线性模型,就如上图左边部分所展现的同样。y是咱们要预测的结果,x是特征,它是一个d维的向量 。这里的d是特征的数量。一样w也是一个d维的权重向量 ,b呢则是偏移量。这些咱们在以前线性回归的模型当中曾经都介绍过,你们应该也都不陌生。

特征包含两个部分,一种是原始数据直接拿过来的数据,另一种是咱们通过特征转化以后获得的特征。最重要的一种特征转化方式就是交叉组合,交叉组合能够定义成以下形式:

这里的 是一个bool型的变量,表示的是第i个特征的第k种转化函数 的结果。因为使用的是乘积的形式,只有全部项都为真,最终的结果才是1,不然是0。好比"AND(gender=female,language=en)"这就是一个交叉特征,只有当用户的性别为女,而且使用的语言为英文同时成立,这个特征的结果才会是1。经过这种方式咱们能够捕捉到特征之间的交互,以及为线性模型加入非线性的特征。

Deep部分

Deep部分是一个前馈神经网络,也就是上图当中的右侧部分。

咱们观察一下这张图会发现不少细节,好比它的输入是一个sparse的feature,能够简单理解成multihot的数组。这个输入会在神经网络的第一层转化成一个低维度的embedding,而后神经网络训练的是这个embedding。这个模块主要是被设计用来处理一些类别特征,好比说item的类目,用户的性别等等。

和传统意义上的one-hot方法相比,embedding的方式用一个向量来表示一个离散型的变量,它的表达能力更强,而且这个向量的值是让模型本身学习的,所以泛化能力也大大提高。这也是深度神经网络当中常见的作法。

Wide & Deep合并

Wide部分和Deep部分都有了以后,经过加权的方式合并在一块儿。这也就是上图当中的中间部分。

最上层输出以前实际上是一个sigmoid层或者是一个linear层,就是一个简单的线性累加。英文叫作joint,paper当中还列举了joint和ensemble的区别,对于ensemble模型来讲,它的每个部分是独立训练的。而joint模型当中的不一样部分是联合训练的。ensemble模型当中的每个部分的参数是互不影响的,可是对于joint模型而言,它当中的参数是同时训练的。

这样带来的结果是,因为训练对于每一个部分是分开的,因此每个子模型的参数空间都很大,这样才能得到比较好的效果。而joint训练的方式则没有这个问题,咱们把线性部分和深度学习的部分分开,能够互补它们之间的缺陷,从而达到更好的效果,而且也不用人为地扩大训练参数的数量。

系统实现

app推荐的数据流包含了三个部分:数据生产、模型训练以及模型服务。用一张图来展现大概是这样的:

数据生产

在数据生产的阶段,咱们使用app在用户面前曝光一段时间做为一个样本,若是这个app被用户点击安装,那么这个样本被标记为1,不然标记为0。这也是绝大多数推荐场景下的作法。

在这个阶段,系统会去查表,把一些字符串类别的特征转化成int型的id。好比娱乐类的对应1,摄影类的对应2,好比收费的对应0,免费的对应1等等。同时会把数字类型的特征作标准化处理,缩放到[0, 1]的范围内。

模型训练

paper当中提供了一张模型的结构图:

从上图当中咱们能够看到,左边是一些连续性的特征,好比年龄,安装的app数量等等,右边是一些离散型的特征,好比设备信息,安装过的app等等。这些离散型的特征都会被转化成embedding,以后和右边的连续性特征一块儿进入神经网络进行学习。paper当中使用的是32维的embedding。

模型每次训练会使用超过500 billion的样本数量进行训练,每次搜集到了新的训练数据都会训练模型。可是若是每一次训练咱们都从头开始的话,显然会很是缓慢,而且会浪费大量的计算资源。所以paper当中选择了一种增量更新的模式,也就是说在模型更新的时候,会加载旧模型的参数,再使用最新的数据进行更新训练。在新模型更新上线以前,会先验证模型的效果,确认效果没有问题以后再进行更新。

模型服务

当模型被训练好被加载进来以后,对于每个请求,服务器都会从recall系统当中获取一系列候选的app,以及用户的特征。接着调用模型对每个app进行打分,获取了分数以后,服务器会对候选的app按照分数从高到低进行排序。

为了保证服务器的响应能力,可以在10ms时间内返回结果,paper采起了多线程并发执行的方法。老实讲,我以为这份数据有点虚。由于如今的模型没有不使用并发执行的,但即便是并发执行,使用深度学习进行预测也很难保证效率可以到达这种程度。也许是还采用了其余的一些优化,可是paper里没有全写出来。

模型结果

为了验证Wide & Deep模型的效果,paper在真实的场景当中从两个角度进行了大量的测试。包括app的获取量以及服务的表现。

App 获取量

在线上环境进行了为期3周的A/B测试,1个桶做为对照桶,使用以前版本的线性模型。1个桶使用Wide & Deep模型,另一个桶只使用Deep模型,去除了linear的部分。这三个桶各自占据了1%的流量,最后获得的结果以下:

Wide & Deep模型不只AUC更高,而且线上APP的获取量也提高了3.9%。

服务性能

对于推荐系统来讲,服务端的性能一直是一个很大的问题,由于既须要承载大量的流量,也须要保证延迟很是短。而使用机器学习或者是深度学习模型来进行CTR的预测,自己的复杂度是很是高的。根据paper当中的说法,高峰时期,他们的服务器会承载1千万的qps。

若是使用单线程来处理一个batch的数据须要31毫秒,为了提高速度,他们开发了多线程打分的机制,而且将一个batch拆分红了几个部分进行并发计算。经过这样的方式,将客户端的延迟下降到了14毫秒。

代码实现

光说不练假把式,Wide & Deep在推荐领域一度表现不俗,而且模型的实现也不复杂。我曾经使用Pytorch实现过一个简易版本,贴出来抛砖引玉给你们作一个参考。

import torch 
from torch import nn

class WideAndDeep(nn.Module):
    def __init__(self, dense_dim=13, site_category_dim=24, app_category_dim=32):
        super(WideAndDeep, self).__init__()
        # 线性部分
        self.logistic = nn.Linear(191, bias=True)
        # embedding部分
        self.site_emb = nn.Embedding(site_category_dim, 6)
        self.app_emb = nn.Embedding(app_category_dim, 6)
        # 融合部分
        self.fusion_layer = nn.Linear(126)
    
    def forward(self, x):
        site = self.site_emb(x[:, -2].long())
        app = self.app_emb(x[:, -1].long())
        emb = self.fusion_layer(torch.cat((site, app), dim=1))
        return torch.sigmoid(self.logistic(torch.cat((emb, x[:, :-2]), dim=1)))

因为我当时的应用场景比较简单,因此网络结构只有三层,可是原理是同样的,若是要应用在复杂的场景当中,只须要增长特征以及网络层次便可。

今天的文章就到这里,衷心祝愿你们天天都有所收获。若是还喜欢今天的内容的话,请来一个三连支持吧~(点赞、关注、转发

原文连接,求个关注

{{uploading-image-891321.png(uploading...)}}

相关文章
相关标签/搜索