推荐系统系列教程之十六:深度和宽度兼具的融合模型

   编者按:之前推出了《推荐系统系列教程》,反响不错,前面已经推出了十五期,今天按约推出第十六期:深度和宽度兼具的融合模型。希望粉丝朋友们多点“在看”,多多转发,我会在“在看”数超过20后推出下一篇教程。

    推荐系统在技术实现上一般划分为三个阶段:挖掘、召回、排序。

    我在前面已经提到过一个事实,就是推荐系统的框架大都是多种召回策略外挂一个融合排序。召回策略的姿势繁多,前面的专栏文章已经涉及了一部分内容。今天我们继续说融合排序。

要深还是要宽 

    融合排序,最常见的就是 CTR 预估,你一定不要把自己真的只局限在 C 上, 这里说的 CTR 预估的 C,可以是产品中的任何行为,视频是不是会看完,看完后是不是会收藏,是不是会分享到第三方平台,查看的商品是不是会购买等 等,都可以看成那个可以被预估发生概率的 CTR。 

    CTR 预估的常见做法就是广义线性模型,如 Logistic Regression,然后再采 特征海洋战术,就是把几乎所有的精力都放在搞特征上:挖掘新特征、挖掘特征组合、寻找新的特征离散方法等等。 

    这种简单模型加特征工程的做法好处多多:

    1、线性模型简单,其训练和预测计算复杂度都相对低; 

    2、工程师的精力可以集中在发掘新的有效特征上,俗称特征工程; 

    3、工程师们可以并行化工作,各自挖掘特征; 

    4、线性模型的可解释性相对非线性模型要好。

    特征海洋战术让线性模型表现为一个很宽 (Wide)的模型,可以想象逻辑回归中那个特征向量在特征工程的加持下,越来越宽的样子。 

    最近十年,是深度学习独步天下的十年,犹如异军突起,一路摧城拔寨,战火自然也烧到了推荐系统领域,用深度神经网络来革“线性模型 + 特征工程”的 命,也再自然不过。 

    用这种“深模型”升级以前的“宽模型”,尤其是深度学习“端到端”的诱惑,可以 让每天沉迷搞特征无法自拔的工程师们主动投怀送抱。 

    深度学习在推荐领域的应用,其最大好处就是“洞悉本质般的精深”,优秀的泛化性能,可以给推荐很多惊喜。 

    硬币总有正反面,深度模型的泛化强于线性模型,也会导致推荐有时候看上去像是“找不着北”,就是大家常常自问的那句话:“ 知道这是怎么推出来的?”用行话说,就是可解释性不好。 

    以前全面搞特征时,你叫人家“宽模型”小甜甜,现在新模型换旧模型,“深模 型”一出,就叫“宽模型”牛夫人,这样不好,还是要两者合作,才能最大限度地发挥效果。 

    因此,Google 在 2016年就发表了他们在 Google Play 应用商店上实践检验过的 CTR 预估方法:Wide & Deep 模型,让两者一起为用户们服务,这样就取得了良好效果。 

    下面,我们就详细了解一 这个深宽模型。

    Wide & Deep 模型 

    一个典型的推荐系统架构,其实很类似一个搜索引擎,搜索由检索和排序构成。推荐系统也有召回和排序两步构成,不过,推荐系统的检索过程并不一定有显式的检索语句,通常是拿着用户特征和场景特征去检索召回,其中用户特征也就是在前面的专栏中提到的用户画像。

    示意图如下. 

    简单描述一下这个示意图。

    先使用户特征和上下文场景特征从物品库中召回候选推荐结果,比如得到 100 个物品,然后用融合模型对这 100 个物品做最终排序,输出给用户展示。 

    同时开始记录展示日志和用户行为日志,再把收集到的日志和用户特征、上下文场景特征、物品特征拉平成为模型的训练数据,训练新的模型,再用于后 面的推荐,如此周而复始。

    今天要说的深宽模型就是专门用于融合排序的,分成两部分来看。一部分是线性模型,一部分是深度非线性模型。整个示意图如下:

    我来解释一下这个示意图,这个示意图有三部分。最左边是宽模型,中间是深宽模型,最右边是纯的深度模型。

    首先,线性模型部分,也就是“宽模型”,形式如下: 

   再次强调一下,这是线性模型的标准形式,逻辑回归只是在这基础上用sigmoid 函数变换一下。 

    模型中的 X 是特征,W 是权重,b 是模型的偏置,也是线性模型的截距。线 性模型中常用的特征构造手段就是特征交叉。 

    如:“性别 = 女 and 语言 = 英语。”就是由两个特征组合交叉而成,只有当“性别 =女 取值为 1,并且“语言 = 英语”也取值为 1 时,这个交叉特征才会取值为 1。线性模型的输出这里采用的 Logistic Regression。 

    好,现在把头转到右边,看看深度模型。深度模型其实就是一个前馈神经 络。

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

    这里的嵌入学习,就是先随机初始化嵌入向量,再直接扔到整个前馈网络中,用目标函数来优化学习。

    由于本专栏并不会专门讲深度学习的原理,后面还会继续讲到深度学习和推荐系统的结合使用,所以有必要在这里简单普及一下深度学习的基本概念,不然我自顾自地开车,你可能会觉得辣眼睛。

    就以这里的“深”模型,也就是示意图中最右边的图为例,一个深度神经网络由输入层,隐藏层,输出层构成。 

    那这个和逻辑回归的区别在哪呢?你可以认为逻辑回归是个残缺的神经网络,只有输入层和输出层,没有隐藏层。

    逻辑回归的输入层就是特征向量,原来我们熟悉的特征权重,就是神经网络的参数,就存在于这个残缺的神经网络输入层和输出层的连线上,后面都可以这么理解,深度神经网络参数都在那些连线上。

    这个残缺神经网络的输出层做了两件事,这时特征值在经过连线送到输出层时已经乘以了连线上的参数,第一件事就是把这些值加起来,第二件事就是用sigmoid 函数变换一下。 

    把逻辑回归当成一个残缺的神经网络理解后,再回头看真正的神经网络,这 里多了一个隐藏层,这个多出来的隐藏层干的事就是刚才提到的输出层的两板斧。

    只不过一个隐藏层可以有多个神经元在干这两件事,隐藏层的这多个神经元就相当于输出层的输入层。

    这个增加的隐藏层有什么意义呢?意义就是给模型提供了非线性转换。

    所谓深度学习,就是深度神经网络,就是有不止一层的隐藏层存在。层数越多,非线性越强,模型越复杂。还有两点需要说明:

    1、隐藏层的激活函数不一定是 sigmoid 函数,甚至往往不用 sigmoid 函数;        2、输出层的函数也不一定是 sigmoid 函数,这个根据预测目标而定,回归任务就是 i 直接输出求和部分,二分类是 sigmoid 函数,多分类则是 softmax 。   

    好,插播深度学习概念结束,回到主题来。深模型中,每 个隐藏层激活方式表示如下:

    其中 l 表示第 l 个隐藏层,f 是激活函数,通常选 ReLU,也叫整流线性单 元,为什么选 ReLU 是 sigmoid 函数,原因主要是 sigmoid 函数在误差反向传播时梯度容易饱和。 

    如果你不明白这句话可以不用管,不影响你上车。这里我用示意图说明了一下常用激活函数的形状。

    1、紫色是 sigmoid 函数,就是逻辑回归用的那个,输入值是任意范围, 输出是 0 到 1 之间;

    2、草绿色是反正切函数,和 sigmoid 函数样子很像,输入值是任意范围, 输出是 -1 到 1 之间; 

    3、红色就是 ReLU 函数,当输入小于 0 时,输出为 0,当输入大于 0 时,输出等于输入;

    4、蓝色是 softplus 函数,是一条渐近线,输入趋向于负无穷时,输出趋于 0,输入趋于正无穷时,输出趋向于等于输入。 

    最后,看看两者的融合,即深宽模型。深模型和宽模型,由逻辑回归作为最终输出单元,深模型最后一个隐藏层作为特征接入逻辑回归,宽模型的原始特征与之一起接入逻辑回归,然后训练参数。

    参数学习就是通常说的端到端,把深模型和宽模型以及最终融合的权重放在 一个训练流程中,直接对目标函数负责,不存在分阶段训练。它与机器学习中的集成学习方法有所区别,集成学习的子模型是独立训练的,只在融合阶段才会学习权重,这里是整体。

    把深宽模型的最后输出过程表示成公式就是:

    其中,Y 是我们要预估的行为,二值变量,如购买,或点击,Google 的应用场景为“是否安装 APP”。σ是 sigmoid 函数,WwideTWwideT 宽模型的权重, Φ(X) 是宽模型的组合特征,WdeepTWdeepT 应用在深模型输出上的权重, a(lf)a(lf) 是深模型的最后一层输出,b 是线性模型的偏置。 

几点技巧 

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

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

1 数据生成 

    数据生成有几个要点: 

    每一条曝光日志就生成一条样本,标签就是 1/0,安装 App 就是 1,否则就 是 0。 

    将字符串形式的特征映射为 ID,需要一个阈值过滤掉那些出现样本较少的特 征。 

    对连续值做归一化,归一化的方法是:对累积分布函数 P(X<=x) 划分 nq 个 分位,落入第 i 个分位的特征都归一化为下图所示。 

2 模型训练 

    整个模型的要点,在深度模型侧:

    1、每个类别特征 embedding 成一个 32 维向量; 

    2、将所有类别特征的 embedding 变量连成一个 1200 维度左右的大向量; 

    3、1200 维度向量就送进三层以 ReLU 作为激活函数的隐藏层; 

    4、最终从 Logistic Regreesion 输出。

    宽模型侧就是传统的做法:特征交叉组合。

    当新的样本集合到来时,先是用上一次的模型来初始化模型参数,然后在此基础上进行训练。

    新模型上线前,会先跑一遍,看看会不会出事,算是一个冒烟测试。

3 模型应用

    模型验证后,就发布到模型服务器。模型服务,每次网络请求输入的是来自召回模块的 App 候选列表以及用户特征,再对输入的每个 App 进行评分。评分就是用我们的“深宽模型”计算,再按照计算的 CTR 从高到低排序。 

    为了让每次请求响应时间在 10ms 量级,每次并不串行地对每个候选 App 计算,而是多线程并行,将候选 App 分成若干并行批量计算。 

    正因为有这些小的优化点,GooglePlay 的 App 推荐服务,就是在峰值时每秒 计算千万级的 App。 

总结 

    将传统的“宽模型”和新的“深模型”结合,虽然更多的是一种工程上的创新,但是非常有实用性,模型也很容易理解。 

    简单画一下全文重点。 

    1、深宽模型是一个结合了传统线性模型和深度模型的工程创新。

    2、这个模型适合高维稀疏特征的推荐场景,稀疏特征的可解释性加上深度模型的泛化性能,双剑合璧。

    3、这个模型已经开源在 TensorFlow 中,大大减小了落地成本,感兴趣可自行取用。

    4、为了提高模型的训练效率,每一次并不从头开始训练,而是用上一次模型参数来初始化当前模型的参数。 

    5、将类别型特征先做嵌入学习,再将嵌入稠密向量送入深度模型中。

    6、为了提高服务的响应效率,对每次请求要计算的多个候选 App 采用并行评分计算的方式,大大降低响应时间。

    嗯,这真的是 个既博学 精深的模型啊。

    最后一点后话,这个模型在线上效果还是不错的,以 GooglePlay 的 App 推 荐效果为例,用户安装表现良好,对照实验结果如图所示。

 

    可以看到,线上效果直接相对于对照组(纯线性模型 + 人工特征)有 3.9% 的提升,但是线下的 AUC 值提高并不明显,这其实也给你提了个问题,AUC 值是 不是最佳的线下评估方式?

附:最后再唠叨两句,本系列教程全部免费,但希望大家每期都不要落下,这样可成体系,也希望各位粉丝朋友多多转发,并在看完后点个“在看”,以示鼓励。我会在文章“在看”数超过20后推送出下一篇的教程。希望大家都有所收获。

另外,我们孵化的小程序:省时查报告已经上线,也希望大家多多支持,多多扩散。

「 更多干货,更多收获 」

推荐系统教程之十五:一网打尽协同过滤、矩阵分解和线性模型

推荐系统教程之十四:经典模型融合方法之线性模型和树模型的组合拳

推荐系统教程之十三:如果关注排序效果,那么这个模型可以帮到你

推荐系统教程之十二:Facebook是怎么为十亿人互相推荐好友的?

推荐系统教程之十一:那些在Netflix Prize中大放异彩的推荐算法

推荐系统教程之十:协同过滤中的相似度计算方法有哪些?

推荐系统教程之九:解密“看了又看”和“买了又买”(Item-based)

推荐系统教程之八:人以群分,你是什么人就看到什么世界

推荐系统教程之七:超越标签的内容推荐系统

推荐系统教程之六:从文本到用户画像有多远

推荐系统教程之五:画鬼容易画人难,用户画像的“能”与“不能”

推荐系统教程之四:这些你必须具备的思维模式

推荐系统教程之三:个性化推荐系统那些绕不开的经典话题

推荐系统教程之二:你真的需要搭建个性化推荐系统吗?

推荐系统教程之一:用知识去对抗技术不平等

关注我们

智能推荐

个性化推荐技术与产品社区

长按并识别关注

你的「在看」,我的动力!????

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值