深度学习在花椒直播中的应用——排序算法篇

排序算法概述
现代推荐系统一般分为召回和排序两个阶段 。召回阶段一般会用一些成本低、速度快的模型从十万、百万量级的候选集中初步筛选,留下千、百个;然后在排序阶段用更加精细的特征和复杂的模型来进行精排,最终留下topK个 。
近十年间,业界排序模型的发展可以说是一日千里,从千篇一律的LR,到2010年FM的提出,再到2014年提出的树模型GBDT,这几年可以看成是现代推荐系统的上半场;
而2015年至今可以看成是飞速发展的下半场,几年之间,以DNN等模型为代表的深度学习网络,如雨后春笋般的出现,各种模型架构、特征交叉方式层出不穷,各种新的idea、trick令人眼花缭乱,而深度学习也逐渐成为了CTR、推荐领域的主流方法 。
本文将沿着这一路线,对这些排序模型进行简单的介绍、梳理和总结 。
一、传统模型 1. LR
在深度学习崛起之前,LR以其简单、速度快、可解释性强的优势,几乎垄断了早期的CTR、推荐领域 。
既然手工很难,能不能自动寻找特征交叉组合或者借助模型进行呢?后几年中出现了以FM、GBDT为代表的两种自动特征交叉方法 。
2. FM/FFM
针对LR中特征交叉的问题,有人提出了下面的多项式模型:
从公式可以看出,模型对所有特征进行了两两交叉,并对所有的特征组合赋予了权重 。
但这种暴力的方法存在着下面两个问题:
针对上面两个问题,2010年德国康斯坦茨大学的 提出了FM( )
类似于矩阵分解(MF)的思路,FM为每个特征学习了一个隐权重向量( ),在特征交叉时,使用两个特征隐向量的内积作为交叉特征的权重,而不是单一的权重 。
3. GBDT + LR
FM虽然综合效果很好,但是也只能够做二阶的特征交叉,如果要继续提高特征交叉的维度,不可避免的会发生组合爆炸和计算复杂度过高的情况 。那么有没有其他的方法可以有效的处理高维特征组合和筛选的问题?
2014年在论文中提出了一种级联结构的树模型,用于解决这个问题 。

深度学习在花椒直播中的应用——排序算法篇

文章插图
思想很简单:
先训练一个GBDT模型,每棵树自上而下,每个节点的分裂是一个自然的特征选择的过程,而多层下来自然进行了有效的特征组合,这样每个叶子节点就对应了树的一条路径,也代表不同的特征交叉组合,这样后面就可以将所有叶子节点进行编号作为新的特征,再结合原始特征,输入LR训练最终的模型 。
树模型的特征组合可以不像FM那样局限于2阶交叉:例如,每棵树的深度为5,那么通过4次节点分裂,最终的叶节点实际上是进行了4阶特征组合后的结果 。但也不能因此就说GBDT比FM的效果好,因为树模型也有自身的缺点,比如容易过拟合高维稀疏数据,比如不能并行速度慢、比如泛化性差等 。
但GBDT+LR的重要的意义在于,
小结
从最早的人工规则排序,发展到人工进行特征组合的LR模型,再发展到自动进行二阶特征组合的FM模型,到后面高阶特征自动组合的LR+GBDT,这基本就是早期推荐系统排序模型的主脉络 。
再往后,DNN模型的引入,标志着以深度学习为主的排序模型的崛起 。纯粹的简单DNN模型本质上其实是在FM模型的特征化基础上,添加MLP隐层来进行隐式、特征非线性自动组合 。
下面我们将重点介绍近年来独领风骚的深度学习模型 。
二、深度模型
2015年之后,以DNN为代表的一系列深度学习模型逐渐出现,个人认为他们可以归结为两类:
1. Wide&Deep类模型
这类模型的特点是双塔结构,即一边是以LR为代表的浅层模型(wide部分)用以学习低阶特征的表达,强调的是“记忆性”;另一边是以MLP为代表深层模型(deep部分),强调的是“泛化性”,deep部分的结构也大多可以分为下面几个模块:
大多数模型在deep部分的区别只在于这一块,不同的模型在交叉方式(隐式/显式,元素级/向量级),或者特征之间的连接方式(/ sum//BI-/ 等)或显示特征交叉的阶数(二阶/高阶)之间会有所不同,以Wide&Deep、(x)、DCN、DIN为例,下面会简要介绍这几种模型 。
这里先简单介绍下特征交互的方式:
一种是类似于MLP的方式,因其特殊的结构天然就具有学习高阶特征组合的能力,并且引入了一定的非线性;但至于怎么发生交互组合的,发生了多少阶的交叉,我们并不清楚,而且这种建模是元素级的(bit-wise),也就是说同一个域对应的向量中的元素也会相互影响 。因此我们说这种特征交叉方式是“隐式的、元素级的” 。
另一种与之对应的是类似于, 的方式,在模型结构中,明确设计一些子网络或者子结构,可以对任意高阶的特征组合进行表征 。以FM为例,就是向量级的方式明确对特征二阶组合进行建模,这种我们称之为“显式的、向量级的” 。
Wide&Deep
深度学习在花椒直播中的应用——排序算法篇

文章插图

深度学习在花椒直播中的应用——排序算法篇

文章插图
DCN
想要得到任意高阶的特征交叉组合,而不仅仅是二阶,但是又要避免产生组合爆炸的维数灾难,导致网络参数过于庞大而无法学习,同时也会产生很多的无效交叉特征,需要设计一种有“压缩”能力的,并且足够高效的网络结构 。DCN就是其中的一种:
深度学习在花椒直播中的应用——排序算法篇

文章插图
向量交叉方式如下:
深度学习在花椒直播中的应用——排序算法篇

文章插图
模型是自动构建交叉特征且能够端到端学习的集大成者,它有效的解决了DCN中提到的问题,实现自动学习显式的高阶特征交互,同时使得交互发生在向量级上 。
深度学习在花椒直播中的应用——排序算法篇

文章插图
模型设计了一种独特的CIN结构,经过外积、卷积等操作来提取特征的交叉 。
深度学习在花椒直播中的应用——排序算法篇

文章插图
并且可以通过控制CIN的层数来显式控制特征交叉的阶数,并且计算的时空复杂度是线性增长的,而不会出现组合爆炸导致参数爆炸而无法训练的情况 。
DIN
【深度学习在花椒直播中的应用——排序算法篇】
深度学习在花椒直播中的应用——排序算法篇

文章插图
小结
2. 多任务类模型
推荐系统的多目标优化,是目前业界的主流之一,也是很多公司的研发现状 。以我们花椒直播为例,可以优化的目标有点击、观看、送礼、评论、关注、转发等等 。
多任务模型旨在平衡不同目标的相互影响,尽量能够做到所有指标同步上涨,即使不能,也要尽量做到在某个优化目标上涨的情况下,不拉低或者将尽量少拉低其它指标,力求达到全局最优的效果 。
这里主要介绍ESMM和MMOE两个模型 。
ESMM
论文指出,完整的日志流程应该包括:
样本空间如下图所示:
深度学习在花椒直播中的应用——排序算法篇

文章插图
传统的CVR任务,只考虑从浏览到转化的过程,即
而本模型还考虑了点击的过程,并引入了浏览转化率()的概念,即为在浏览的条件下既点击又转化的概率,即
也就是下面的公式:
根据这个公式设计的模型如下图:
深度学习在花椒直播中的应用——排序算法篇

文章插图
样本的构建为:
任务正样本负样本
pCTR
点击
未点击
点击且转化
未转化
模型特点:
MMOE
深度学习在花椒直播中的应用——排序算法篇

文章插图
论文指出:一般的多任务模型结构如上图(a)所示,即对于不同的任务,底层的参数和网络结构是共享的,然后上层经过不同的神经网络得到对应任务的输出,缺点是模型的效果取决于任务的相关性,如果多任务之间关联较小,采用这种结构甚至会出现互相拖后腿的情况 。
因此本论文提出了基于图(b)的OMOE和图(c)的MMOE两种结构,主要思路是每个任务有一个独立的中间网络,类似于“开关”的功能,通过模型学习,不同的任务可以从相同的底层中提取到侧重点不同的特征,而不是完全共享底层,即达到了“各取所需”的效果,有点类似于上面提到的网络 。
之后每个任务接各自的tower模型,得到logit,再和label一起计算loss,然后多目标的loss直接可以用类似 sum的方式结合起来组成总的loss 。
小结
推荐系统的多任务模型,虽然是排序模型的一大发展趋势,但多目标学习的难处在于,每个目标的样本比例是不同的,训练时如何融合loss、何时停止训练以及线上各目标的分数如何组合、A/B test如何衡量总体效果等方面,都要经过比较复杂的衡量和考虑,这些都还有很大的发展空间,需要我们来尝试 。
排序模型在花椒直播中的实践
近两年来,花椒直播紧跟业界潮流,在排序阶段进行了多种多样的尝试,如(GBDT+)LR,Wide&Deep,(x),DIN,ESMM,MMOE等 。下面以Wide&Deep模型为例,简单介绍下我们的整个排序系统 。
深度学习在花椒直播中的应用——排序算法篇

文章插图
首先是离线部分,我们主要用spark/hdfs来处理、存储数据 。主要包括用户数据、主播数据、实时数据、行为序列等等 。下面是我们用到的部分特征:
类别特征
用户画像
性别、年龄、机型、地域、看播/打赏/弹幕/转发/关注的统计、行为序列……
主播画像
性别、年龄、地域、等级、类别、标签、频道、达人、时长、收礼、粉丝以及各种统计类排行……
实时特征
实时看播、打赏、弹幕、热度、是否唱歌、是否跳舞、游戏精彩瞬间……
生产好用户、主播画像后,还要生产一个基于用户主播交互数据的标签集,可以是多标签以便于多任务模型使用,比如用户浏览过哪些主播,是否发生了观看、打赏、评论、关注等行为,如果发生了,还可以把如看播时长等程度数据作为权重,以便后面进行加权训练时使用 。
之后将标签集和画像join起来,就形成了一天的数据集,可以用多天的训练集共同组成最终的整体数据集来满足数据量和覆盖度的要求,这里要小心不要发生数据穿透 。最终的数据集是T级别的,存储在HDFS上 。在训练阶段,单机多卡的配置也满足不了速度上的要求,因此我们采用了360私有云的hbox分布式训练平台,来完成日常深度模型的训练 。
下面是我们的模型结构图:
深度学习在花椒直播中的应用——排序算法篇

文章插图
下面是我们部分模型的效果:
离线:
模型AUC*100
FM
78.9
Wide&Deep
84.5
84.7
线上:热门频道接入个性化推荐后人均观看时长涨幅>80%
后记
本文只是对业内近年来常用的模型进行的简单的介绍和总结,实际上每个模型除了其典型的结构外,还有许多非常珍贵的细节,比如公式推导,参数的选择,工程上的trick等等,这些建议大家还是要精读下相关模型论文 。
并且要注意的是,没有“最好的模型”,只有“最适合的模型”,并不是说模型越fancy越复杂,线上效果就会越好 。比如阿里提出了DIN模型,是因为工程师们首先发现了数据中的现象:
用户在浏览电商网站的过程中显示出的兴趣是十分多样性的,并且只有部分历史数据会影响到当次推荐的物品是否被点击,而不是所有的历史记录,即“多峰分布”、“部分激活” 。
正是这种特定场景的需要,才使得阿里研发了DIN模型,来捕获用户兴趣的进化,取得了突破的效果 。
所以做推荐正确的顺序应该是先有特定的“场景”,然后再基于用户行为和数据的特点,对应的开发适用于这个场景的模型;而不是先拍板一个模型,再去数据中进行试验,就本末倒置了 。
深度学习在花椒直播中的应用——排序算法篇

文章插图