本文概览:
1. 推荐系统是什么?
- 推荐系统是帮助用户发现内容,克服信息过载的重要工具;
- 它通过分析用户行为,对用户兴趣建模。从而预测用户的兴趣并给用户做推荐;
信息过载: 信息过载是信息时代信息过于丰富的负面影响之一。指社会信息超过了个人或系统所能接受、处理或有效利用的范围,并导致故障的状况。人们接受了太多信息,却无法有效整合、组织及内化成自己需要的信息,以致影响到人们的工作、生活以及人际关系等。信息过载主要表现为:(1)受传者对信息反映的速度远远低于信息传播的速度;(2)大众媒介中的信息量大大高于受众所能消费、承受或需要的信息量;(3)大量无关的没用的冗余的数据信息严重干扰了受众对相关有用信息的准确性的选择。
兴趣建模: 根据用户过去的喜好来推测未来可能喜欢什么物料的过程。
2. 早期的推荐系统
早期的花椒推荐系统是基于热度推荐的。对当前直播间的观看人数、送礼人数、互动人数等做一定的加权求和,得到这个直播间的热度分数,根据这个分数对直播间进行排序做推荐。这不是一种模型推荐,更像是一种策略和规则推荐。
好处:
- 热度高的直播质量有保证。热度高大概率符合大众的喜好或者符合当前的潮流趋势等等,是有脱颖而出的地方。
坏处:
- 流量全部集中在头部主播,小主播难以得到有效的曝光。 如果这一情况长期存在,小主播直播热情没了,可能就不直播了。这样会对平台的整体利益造成损害。
- 难以做到“千人千面”的个性化推荐效果。 有可能所有用户看到的都是头部主播,这样就无法做到个性化推荐,也会造成用户看腻的情况。
3. 现代推荐系统架构简介
现代化推荐系统可以分为以下阶段:首先,从百万量级的全样本数据中通过粗排序模型(召回模型) 生成百千级别的候选集;然后,通过精排序模型生成百十级别的候选集展现给用户。可以看到,粗排一般用到的是比较简单的如协同过滤模型等,并且一般只用到用户的历史行为数据作为特征。精排一般用一些基于特征的推荐系统模型,如深度类型的模型wide&deep,除了用到用户的历史行为数据,还用到各种各样的旁路信息。
4. 召回 VS 排序
- 召回阶段: 用些成本低、易实现、速度快的模型(如协同过滤)进行初步筛选;
- 排序阶段: 用更全面的数据、更精细的特征、更复杂的模型进行精挑细选;
当然,除了召回阶段、排序阶段,在实际业务中可能还有重排序和人工规则阶段,这里是个策略出没之地,就是集中了各种业务和技术策略。比如为了更好的推荐体验,这里会加入去除重复、结果打散增加推荐结果的多样性、强插某种类型的推荐结果等等不同类型的策略。按理说,这一阶段没什么可讲的。但是,从技术发展趋势角度看,重排阶段上运用模型,来代替各种花样的业务策略,是个总体的大趋势。重排阶段一般用List Wise排序,关于List Wise排序,可以从两个角度来说:一个是优化目标或损失函数;一个是推荐模块的模型结构。关于重排具体内容可以看这篇文章:推荐系统技术演进趋势:从召回到排序再到重排 - 张俊林的文章 - 知乎 https://zhuanlan.zhihu.com/p/100019681
5. 召回(Recall)
5.1 基于邻域的协同过滤
5.1.1 邻域建模的目的
邻域建模的目的为:
- 把用户对电影的原始评分日志转换成评分矩阵的形式,并且矩阵中会存在大量的空白项;
- 建模的过程就是填充空白项的过程,这样就得到了所有用户对所有电影的评分(喜好程度),然后就可据此进行个性化推荐了;
那么,如何求解这些空白项呢?求解的过程可以分为两步:
- 计算用户/物品之间的余弦相似度:
- 基于相似度和现有评分矩阵填充缺失值:
5.1.2 基于物品的协同过滤
看上面的公式可能不太好理解,我们举一个简单的基于物品的协同过滤例子:
- 第一步:在评分矩阵中,1表示用户交互过的评分,0表示算法需要填充的评分。用余弦相似度公式计算物品之间的相似度。然后,得到一个物品相似度矩阵。
- 第二步:根据公式,算出用户对缺失物品的评分。把所有的评分算好后,可以填充评分矩阵中缺失的值。
通过上面的计算,假如我们要对用户3进行推荐,得到用户3未操作的物品B的评分为0.58,未操作的物品C的评分为0.82,按照评分大小进行排序,生成有序的推荐集,那么用户3的推荐集为(物品C>物品B)。
5.1.3 花椒直播如何用?
花椒直播用的是item(主播)based model,即基于主播的协同过滤算法。
主要基于以下原因:
- 主播数量远小于用户数量,相似度矩阵维度小,计算少、易存储( );
- 根据用户的历史行为推荐,可以让用户比较信服(可解释性强);
- 新用户只要看过一个主播,就可以很快得到其他相似主播的推荐;
5.1.4 基于邻域方法的小结
- 这是一种基于统计的方法,不是优化学习的方法。(没有学习过程和设立指标进行优化得到最优模型的过程)
- 只用了局部数据计算相似度、进行推荐,更像是一种策略。没有用到全局数据。
- 当用户或物品维度很大时,会占用很大的内存。
基于这些原因,后面出现了基于隐向量的协同过滤方法进行推荐。
5.2 基于隐向量的协同过滤
5.2.1 传统的矩阵分解
(1) 传统矩阵分解建模的目的
和基于邻域的方法一样,基于矩阵分解方法建模的目的也是补全缺失值,只是补全的方法和基于邻域的方法不太一样。
(2) 显示反馈VS隐式反馈
(3) 显示反馈常用方法
显示反馈常用方法就是把高维稀疏评分矩阵 分解成两个小矩阵 , 乘积的形式,用两个小矩阵乘积来拟合原始的大评分矩阵。目标函数就是均方误差,公式形式很像LR,小矩阵拟合的越好, 差值越小,最后损失函数也就越小。 是一个正则化项。
(4) 隐示反馈常用方法
对于花椒直播推荐系统来说,隐式反馈是更常见的。因为我们不会让用户每看一个主播就打一个分数,一般采用用户和主播的交互程度来作为用户对主播的偏好,交互程度一般选择为观看时长、点击次数和观看次数等。所以,隐式反馈做法和显示反馈做法不太一样。
隐式反馈首先根据交互程度 来得到一个 。比如,我们定义观看时长大于10秒时 ,观看时长小于10秒时 。 代表用户的评分矩阵,取值范围为 。 表示用两个小矩阵来拟合全是0和1的大矩阵 。这里比显示反馈多了一项 ,表示用户对物品的置信度,它正比于反馈次数 ,反馈越强烈,这一项值越大。可以把 理解为加权训练,交互程度越高,样本的权重也就越高,占的损失也就越大,这样训练出来的模型效果会更好一点。
相关论文: 【1】Hu Y, Koren Y, Volinsky C. Collaborative filtering for implicit feedback datasets[C]//2008 Eighth IEEE International Conference on Data Mining. Ieee, 2008: 263-272.
(5) 如何求解X,Y矩阵?
不管是显示反馈还是隐式反馈,只要定义好损失函数或者目标函数,就可以通过最小二乘法(ALS)交替求解、矩阵。
(6) 线上怎么用?
中每行为一个用户的隐向量,中每列为一个物品的隐向量。离线训练好后将、两个矩阵存起来,线上用时用户来了取出用户的隐向量,然后取出在线的主播的隐向量,算一下用户向量和主播向量的内积,内积也就是得分,最后根据得分的高低进行排序。
(7) 传统矩阵分解方法小结
优点:
- 模型简单易实现;
- 线上速度快(可以离线训练,线上只需要做点积);
- 存储少(高维稀疏的评分矩阵变为两个低维稠密的隐向量矩阵);
缺点:
- 推荐结果可解释性较差;
- 未用到其他特征,不够综合、全面(和ranking系列模型比);
(8) 基于矩阵分解和基于邻域协同过滤方法的比较
5.2.2 基于深度学习的矩阵分解
(1) 深度学习 矩阵分解
有些示例表明,学到用户/物品的隐向量后,直接用内积描述用户-物品交互关系(matching function) 有一定的局限性,即内积函数(inner product function)限制了MF的表现力 。
随着深度学习的兴起,有学者提出了新的模型:即借鉴深度学习中的方法,使用深度神经网络 (DNN) 从数据中自动学习用户/物品隐向量的交互函数(即内积函数),在增强表现力的同时也可以引入一定的泛化能力。示例:NCF框架。(Neural Collaborative Filtering)
(2) Neural Collaborative Filtering(NCF)
下图中,左边是用户的隐向量,右边是物品的隐向量,如果直接做内积的话,就是传统的矩阵分解。NCF直接把内积计算换成了DNN,并且变成了传统机器学习的模式,用神经网络训练的方式学习交互关系。
NCF论文: 【1】He X, Liao L, Zhang H, et al. Neural collaborative filtering[C]//Proceedings of the 26th international conference on world wide web. 2017: 173-182.
(3) NeuMF
集大成者的一个模型就是NeuMF(神经矩阵分解)。如下图所示,它提出了一个GMF Layer(广义矩阵分解层)和一个DNN层。可以看到拿到用户和物品的隐向量之后,一方面在GMF层做元素级别的乘积,其实内积就是对应位置相乘再相加,NeuMF稍微改进了一下,对应位置相乘完之后,不是直接相加,而是再学一次权重,这就是在接一个Dense层来学习一下权重,相当于传统的矩阵分解权重不在都为1,而是用网络学习。另一方面,加入了一个DNN层。把用户隐向量和物品隐向量直接Concatenate起来以后,直接接入一个DNN层。最后将两方面的结果Concatenate起来接到输出层。
这样做的好处是,GMF Layer保留了内积的方式NeuMF又引入了DNN的方式,结论表明这样做既可以增强传统矩阵分解的表现力又可以引入DNN自己的一些高阶特征交叉的特点进而引入了一定的泛化性。
NeuMF论文: 【1】He X, Liao L, Zhang H, et al. Neural collaborative filtering[C]//Proceedings of the 26th international conference on world wide web. 2017: 173-182.
最后,关于深度协同过滤的内容到这里就结束了,大家感兴趣的话,可以参考“花椒技术公众号”里文章:深度学习在花椒直播中的应用—神经网络与协同过滤篇,地址:https://mp.weixin.qq.com/s/ERfIcCJ7ne4OjfRStdR_vw 。这篇文章专门讲一些神经网络和协同过滤的内容,也含有一些代码和实例,也是曾经在花椒直播平台用作召回的模型。
5.3 其它模型
随着时代发展,基于邻域的协同过滤和基于隐向量的协同过滤是比较常见的,现在也有其他模型的出现,比如说Youtube的召回模型。
5.3.1 Youtube召回模型
Youtube的召回模型是比较复杂的,上面提到的召回模型都是用到了用户和物品的id类特征,而Youtube模型用到了性别、地理信息、样本的时间和一些embedded特征等。这个模型的特点就是:模型最后一层的输出当作用户的隐向量,是在线上实时计算的,就是每次用户来经过嵌入层变成向量再到ReLU这样的网络得到一个输出作为用户的隐向量;最后一层的权重当作物品的隐向量,这一部分是离线训练好后直接存储起来,线上不用直接更新,直接拿出来用就行;这些线上拿到用户的隐向量以及存储的物品隐向量以后,做一个基于类似最近邻查找的方法基于内积进行最近邻查找,其实就是把用户隐向量和所有物品隐向量做内积,然后根据内积进行排序。
Youtube的召回模型总的来说就是提出了下图所示的框架,物品隐向量离线训练完存好,用户线上实时拿,并且可以用到很多个特征,而不是局限于上面提到的模型只用到用户和物品的id类特征。这个模型还是挺火的,但是复杂度、延时要高一些。
Youtube召回模型论文: 【1】Covington P, Adams J, Sargin E. Deep neural networks for youtube recommendations[C]//Proceedings of the 10th ACM conference on recommender systems. 2016: 191-198.
5.3.2 其他召回模型
其他比较火的召回模型,比如说双塔模型,基于DNN或FM的双塔模型,这种模型的特点就是用户和物品各一个塔,从这两个塔中得到用户和物品的隐向量,在线上也是用两个隐向量进行内积得到用户对物品的得分,然后对得分进行排序。除此之外,其他召回模型还有基于用户多兴趣的模型、知识图谱模型和图神经网络等。这些模型都是比较新、比较潮流的,感兴趣的话可以根据自己的场景进行试验。
6. 精排(Ranking)
把特征输入到模型中,用模型来做二分类,大于等于0.5是喜欢,小于0.5是不喜欢。如果是喜欢的话,怎么分喜欢和更喜欢呢?对物品做排序,分高的是更喜欢,其次是喜欢。
比如上图中的例子,我们希望模型学到这样的效果:北京35岁的年轻男性用户王先生喜欢看“正在跳舞互动多的年轻女主播”,不喜欢“男性游戏主播”。这里面“北京”、“35岁”、“男性”、“王先生”(id类特征)是用户特征,“正在跳舞”、“互动多”、“年轻”、“女主播”是主播特征。我们希望通过许多样本,让模型学出不同用户的喜好。
6.1 特征工程
6.1.1 特征工程
6.1.2 训练集的生成
根据用户和主播前N天的数据来组成用户画像。
比如说,标签的产生:以今天为例,看某个主播30秒,我们就认为是正样本。看某个主播2秒,我们就认为是负样本。训练数据的产生:今天前N天的数据提取成用户和主播的特征。比如,提取出用户前N天看过哪些主播的行为序列数据或者用户前N天累计送礼是多少的数据。由这些天的数据组成用户和主播的画像。最后,把用户画像、主播画像和标签对应起来就会形成一条样本。我们就可以把今天的数据提取出来,组成训练样本。
当然,只用一天的数据作为训练样本肯定不够。因为用户不能保证每天都来,主播也不能保证每天都在。所以,我们要以上述的方式选出M天数据,把M天训练数据组成整体训练集。这样一方面可以保证数据量的要求,另一方面也能保证用户和主播覆盖度的要求。
特别需要注意,不能有数据穿透! 就是说,今天的数据我们当做标签的话,生产画像的时候,就一定不能包含今天的数据,而是用不包含今天的前N天数据来生产画像。
6.2 排序模型
6.2.1 早期的排序模型
- LR
- FM/FFM
- GBDT LR
(1) 逻辑回归(LR)
可解释性比较强:LR一个特征对应一个权重,很容易知道哪个特征比较重要,很容易解释出什么样的用户喜欢什么样的主播。
缺点:LR是一个线性模型,如果要引入非线性,就需要人工进行特征交叉,这样成本就会很高。因为要保证特征交叉有效果,就要有相关业务的经验,要熟悉具体的业务场景。比如说做直播,工程师要熟悉直播的场景,才能知道什么样的特征交叉在一起才是有效果。只有训练集中出现过的特征组合才能学习到,没有出现过的特征组合就学习不到,因此LR是偏重记忆泛化性差。
基于LR的上述缺点,有人就会想能不能进行自动的特征交叉?
(2) 因式分解机(FM)
FM缺点:FM只能进行二阶特征交叉,如果想学高阶特征交叉,FM公式后边又要加入很多项,这样组合起来的维度是爆炸的,所以就引入了GBDT LR模型。
(3) GBDT LR
树模型是基于特征进行结点分裂的,树模型从根结点到叶子结点这条路径本身就是一种特征组合。比如说,根结点根据年龄大于等于20为左子树、小于20为右子树,下一层根据性别为男是左叶子结点、性别女为右叶子结点,那么从根节点依次下来就是年龄大于等于20且性别为男。有了特征交叉以后,把树叶子结点进行编号。把编号作为LR模型的输入进行训练。
GBDT LR的优点是提出了一种用模型自动学习特征交叉的思想,这个是很重要的改进。因为人工特征交叉成本太高,用模型自动学习特征交叉的思想很重要。后来深度学习兴起以后,各种Embedding特征交叉也算是这种思想的延伸。GBDT LR模型还提出分步更新的级联结构,因为模型分为两部分,不是联合训练的,是分步训练的,先训练树模型,然后叶子节点编好号,再训练LR模型。
树模型的缺点是不能并行且速度慢,尤其是GBDT树,它的下一棵树的输入是前一棵树的残差,只能串行训练,速度很慢。工业界的解决办法就是分两步,树模型可以以天级别或周级别进行更新,LR模型可以在线上进行实时更新,就类似于利用FTRL这种实时框架来进行实时更新。树模型容易过拟合高维稀疏数据。LR模型记忆性好,但是泛化性差。
GBDT LR论文: 【1】He X, Pan J, Jin O, et al. Practical lessons from predicting clicks on ads at facebook[C]//Proceedings of the Eighth International Workshop on Data Mining for Online Advertising. 2014: 1-9.
6.2.2 深度排序模型
以上讲的三个模型是早期的排序模型,随着深度学习的兴起,又出现了一大堆深度排序类的模型,为了方便我们把模型分为两大类:
- Wide&Deep类模型,如(x)DeepFM、DCN、DIN;
- 以多任务学习为基础的联合训练模型,如ESMM、MMOE;
6.2.2.1 Wide&Deep类模型
(1) 深度神经网络(DNN)
DNN的优点是学习特征间潜在关系,因为DNN是全连接层,所有元素级特征连接在一起,这样尽管训练集中没有出现过的特征组合,DNN也可以学习到,有一定的泛化能力。
(2) Wide&Deep
有LR模型还有DNN模型,自然有研究者就把这两者结合在一起。因为LR的好处就是记忆性,缺点就是人工特征交叉、特征工程复杂;DNN的好处就是泛化能力强、可以自动学习特征之间潜在关系、是一种端到端的模型。所以把它们两个结合在一起后,即兼顾了记忆性、泛化性,还能端到端的训练,serving起来也是比较简单的。
从上图的Wide&Deep模型中可以看出,左边是一个LR,右边是一个DNN。这种深浅双塔结构的提出极大的促进了后续模型的发展,后续很多模型都是基于这个模型的改动。
Wide & Deep论文: 【1】Cheng H T, Koc L, Harmsen J, et al. Wide & deep learning for recommender systems[C]//Proceedings of the 1st workshop on deep learning for recommender systems. 2016: 7-10.
(3) FM DNN = DeepFM
既然LR能和DNN结合,自然又有研究者想到FM也能和DNN结合,这就是DeepFM模型。与Wide&Deep模型的区别在于把左边的LR换成了FM,这样即能保证有LR部分的特点,还能多一个二阶自动交叉的FM特点。
DeepFM论文: 【1】Guo H, Tang R, Ye Y, et al. DeepFM: a factorization-machine based neural network for CTR prediction[J]. arXiv preprint arXiv:1703.04247, 2017.
(4) DIN
还有一个比较有代表性的工作是阿里的DIN模型(深度兴趣网络)。这个模型的特点就是,把NLP领域中的Attention Network引入进模型中。把当前要预测的物品与用户交互过的物品放到一个Attention层里,经过Attention层会对用户交互过的每一个物品学到不同的权重,然后进行加权平均拿到一个总的Embedding。Attention有效是基于这样一种现象:观察到用户兴趣的“多峰分布”以及“部分激活”的数据特点,举个例子,假如当前我们要预测的物品是一件衣服,用户的历史行为里面有各种各样的物品(衣服、吃的、玩的),我们预测衣服的时候,用户过去吃的和玩的物品对当前的衣服预测是没有参考价值的,只有过去交互过的衣服对于当前预测衣服是有价值的,Attention的作用就是对过去交互过的衣服赋予较大的权重,对吃的玩的物品赋予较小的权重,这样就可以减少其它类物品的干扰。DIN模型也反映了模型是服务于场景的这一理念。
DIN论文: 【1】Zhou G, Zhu X, Song C, et al. Deep interest network for click-through rate prediction[C]//Proceedings of the 24th ACM SIGKDD International Conference on Knowledge Discovery & Data Mining. 2018: 1059-1068.
(5) Wide&Deep类模型总结
我们对Wide&Deep类模型进行总结,近年来的许多深度模型都可以归类为Wide&Deep类模型,这些模型有以下特点:
首先输入离散特征转化为Embedding,所有的Embedding经过stacking layer级联在一起。stacking layer有很多级联方式,比如说最简单的concatenate,像前面讲的DNN那样,把所有embedding横向拼接在一起,然后接全连接层。还可以加权平均,比如某用户浏览过十个物品,十个物品对应十个embedding,我们可以直接加起来求平均值,当成一个特征。还有也可以做内积或者外积,这里也有对应的网络。还有复杂点的,可以做Attention,像DIN一样,把当前物品和用户交互过的物品一起放到Attention网络里面。根据这一层的不同可以划分出好多网络模型。
还有一个特点在特征交互层。特征交互层的wide部分可以用LR,也可以用FM,还可以用Deep & Cross Network中的交叉网络。特征交互层的Deep部分,根据交互方法可以分为隐式/显示、元素级/向量级、二阶/高阶。隐式的比如DNN这种,直接是全连接。显示的比如说FM这种,每个特征都带一个Embedding,可以把不同特征的Embedding以向量级的形式显示的两两交叉。全连接就是元素级,FM就是向量级,向量级不会把特征的Embedding每一位拆开,向量级是直接把两个特征的Embedding以向量的形式做内积。二阶交叉就像FM这种的,典型的只有二阶交叉。高阶交叉就像XDeepFM,它可以调节CIN网络的个数来达到你想要的任意阶的交叉。
所以,Wide&Deep类模型区别就在两部分:一是特征交叉的方式是隐式/显示、元素级/向量级、二阶/高阶中的哪一个;二是所有Embedding的级联方式是concatenate/weighted sum/product/attention中的哪一种。
相关文章: 【1】深度学习在花椒直播中的应用——排序算法篇,地址:https://mp.weixin.qq.com/s/e6Spp7smIEUUExJxHzUOFA 。这篇文章主要是分析Wide&Deep类模型,这里面只简单的介绍了五种排序模型,但是还有好多模型都可以归为Wide&Deep类,都是在Wide部分或者Deep部分有一些改动,总体框架都是差不多的。
6.2.2.2 多任务类模型
推荐系统的多目标优化,是目前业界的主流之一,也是很多公司的研发现状。以花椒直播为例,可以优化的目标有点击、观看、送礼、评论、关注、转发等等。
多任务模型旨在平衡不同目标的相互影响,尽量能够做到所有指标同步上涨,即使不能,也要尽量做到在某个优化目标上涨的情况下,不拉低或者将尽量少拉低其它指标,力求达到全局最优的效果。
(1) ESMM模型
ESMM模型首次把样本空间分成了三大部分,从曝光到点击再到转化的三步行为链,并引入了浏览转化率(pCTCVR)的概念。我们正常做CVR任务的时候,默认只在点击的空间上来做,认为曝光、点击并转化了就是正样本,认为曝光、点击并未转化为负样本。如果这样想的话,样本全空间只有点击的样本,而没有考虑没有点击的样本。ESMM论文就提出曝光点击、曝光不点击以及点击之后是否转化所有的这些样本都考虑进来,因此提出三步的行为链,提出如下公式:
因此提出了浏览转化率公式,进而提出了上图所示的网络模型,一个双塔模型,它们是共享底层Embedding层的,只是上面的不一样,一个用来预测CTR,这个可以在全样本空间上进行训练。另一个是用来预测CVR,CVR是一个辅助任务。最后的CTCVR可以在全样本空间中训练。ESMM模型是一个双塔、双任务的模式在全样本空间上进行训练。这样训练的好处可以解决两个问题:一是,样本选择的问题,CVR是在点击的基础上进行训练,训练集只有点击的,实际数据可能有曝光点击和曝光未点击的数据,我们往往把曝光未点击的数据给忽略了,这样就造成了样本选择偏差,训练集和实际数据分布不一致的情况。二是,解决数据稀疏的问题。因为我们现在在全样本空间上进行训练,不是只在点击的样本上进行训练,所以样本就多了很多,所有样本可以进行辅助更新CVR网络中的Embedding,这样Embedding向量就会训练的更加充分。ESMM还提出子网络MLP可以替换,为我们提供了一种可扩展的多任务模型架构。
ESMM模型有一个缺点:共享底层。共享底层在多任务上可能有问题,所有就有了MMOE的文章。
ESMM论文: 【1】Ma X, Zhao L, Huang G, et al. Entire space multi-task model: An effective approach for estimating post-click conversion rate[C]//The 41st International ACM SIGIR Conference on Research & Development in Information Retrieval. 2018: 1137-1140.
(2) MMOE模型
很多多任务模型是上图(a)这种模式,共享一个底层的Embedding之后,然后两个塔得到两个任务。但是它的使用表明如果多任务的相关性比较低的话,模型的效果就比较差。基于这种现象就提出了上图所示的(b)(c)专家网络,希望不同的任务可以从输入得到不同的东西,这就有点类似于Attention的部分了。用门来决定塔可以从输入拿到什么东西,这样的好处就是每一个Tower可以拿到不同的输入,这样就可以减少任务之间相互拖后腿的情况。这种架构也是目前比较常见的。
上面分享了花椒直播推荐系统从0到1的搭建过程,包括召回和排序过程,但可以发现这些其实是很通用的,完全可以应用于商品推荐、小视频推荐等其他场景。下面会分享些直播场景和其他场景不一样的地方。
MMOE论文: 【1】Ma J, Zhao Z, Yi X, et al. Modeling task relationships in multi-task learning with multi-gate mixture-of-experts[C]//Proceedings of the 24th ACM SIGKDD International Conference on Knowledge Discovery & Data Mining. 2018: 1930-1939.
7. 智能推荐遇上花椒直播
7.1 直播内容的理解和识别
直播中的推荐和商品推荐等场景有所不同,是“活的”而不是“死的”,因为直播是长时间连续性的,并且内容是实时在变的,比如用户喜欢看跳舞直播,那么当主播不跳的时候用户可能也不想看了。因此我们需要把直播最核心、最精彩的部分挖掘出来推荐给用户。这就需要对多模态内容进行理解、融合,包括但不限于:
- 文本(如直播间标题、弹幕等);
- 图片(如主播头像、封面等);
- 视频(如可以识别主播是否在跳舞、游戏、挂机等);
- 音频(如可以识别主播是否在唱歌,在唱什么类型的歌等);
7.2 直播实时性特征
除了上面所说需要对直播的多模态内容进行理解, 一些实时的数据也是非常重要的,它们一定程度上可以反映当前直播的火热程度和受欢迎程度,放到模型中作为特征可以加强推荐系统的准确性和实时性。包括但不限于:
7.3 花椒直播推荐中的排序模型结构
- 原始输入层:用户特征、上下文特征、过去交互过的物品特征和当前要预测的物品的特征。
- 特征交互层:特征交互层就像上文总结的Wide&Deep类模型一样,可以有很多部分。比如,FM可以来提取特征之间的二阶交叉,举例,拿用户性别的Embedding和候选主播的Embedding来做二阶交叉,FM可能会学到男用户喜欢看女主播。CIN是多阶交叉,可以拿多个特征放到CIN中进行高阶特征组合。Attention就像DIN那种方式,可以把过去交互过的主播和当前要预测的主播放到Attention中。这样当前预测主播是跳舞,可以把用户过去看过的游戏主播权值训练的小一些,过去看过的跳舞主播权值大一些,这样就达到了筛选优化的作用。还有简单的方式,就是把这些Embedding全都连接起来,接一个全连接层。
- 特征拼接层:特征拼接层就是把特征交互层得到的Embedding向量拼接在一起,然后接个全连接。这个全连接可以起到降维的作用,把Embedding的维度降小一点。因为,多目标输出层中还有多个tower。
- 多目标输出层:类似MMOE的结构,可以设计一个专家网络,这样每个任务从特征拼接层的输出中学到不同的东西,避免造成各任务之间相互干扰的情况。常见的任务有:点击,用户是否点击了这个主播。观看,可以定义观看多少秒以下是无意义的观看,多少秒以上是有意义的观看,并且可以把观看时长作为一个权重进行加权训练。送礼,送的是正样本,没送的是负样本,送了多少可以当成权重进行加权训练。多任务训练的好处就是可以用全样本数据,且原始输入层中的Embedding也会训练的更加充分。
7.4 模型训练和更新的逻辑
训练原始数据有用户数据、物品数据、实时数据和上下文数据。用这些数据解析成用户/主播画像作为训练数据,用户主播交互标签作为训练数据的label。离线训练的部分,就是上文所讲的训练集生成的过程。每天生成一天的训练样本,把多天的训练样本组合起来形成全量样本,满足覆盖度和数据量的要求。全量样本直接存储在HDFS上,以天或周的级别进行更新,这样可以保证模型的准确性。另一部分是增量样本,比如flink流,可以线上对模型进行流式更新,这样可以满足模型实时性的要求。模型验证模块,验证模型指标有没有达到我们期望的阈值,防止一些不好的特征把模型训练坏了,还推上线的情况。模型验证好之后,需要上线服务就可以用Tensorflow Serving这种框架来进行线上服务。推荐引擎用的是golang来处理用户的请求,以及将请求转化为特征,并把特征喂给Tensorflow Serving的一个流程。golang的性能比较高。
8. 总结
本文分享总结了花椒直播沿着业内的发展路线从0到1搭建个性化推荐系统的过程,先后尝试了许多模型,每个模型除了其典型的结构外,还有许多非常珍贵的细节,比如公式推导、参数的选择、工程上的trick等等,这些大家可以查阅相关模型论文。
要注意的是,没有“最好的模型”,只有“最适合的模型”,并不是说模型越fancy越复杂,线上效果就会越好。比如阿里提出了DIN模型,是因为工程师们首先发现了数据中“多峰分布”、“部分激活”的现象,而在直播场景中这个特点就不是很明显,因此上线了DIN模型后的提升也不是很大。
但直播场景也有其自身的特点,如多模态、实时性和热点效应等。只有深入理解了场景,并基于用户行为和数据提取出能表现这个场景的特征,再对应的开发适用于这个场景的模型,才能取得最佳的效果。
9. Reference
本文是Microstrong在观看花椒直播推荐系统高级算法工程师王洋在B站上讲解的《智能推荐算法在直播场景中的应用》视频的笔记。
【1】花椒直播推荐系统高级算法工程师王洋:智能推荐系统在直播场景中的应用,视频,地址:https://www.bilibili.com/video/av90507035?t=1453 【2】回顾 | 花椒直播推荐系统高级算法架构师王洋:智能推荐算法在直播场景中的应用,地址:https://mp.weixin.qq.com/s/1Hrl25TjDKiEvPa35RDyNQ 【3】深度学习在花椒直播中的应用——排序算法篇,地址:https://mp.weixin.qq.com/s/e6Spp7smIEUUExJxHzUOFA 【4】深度学习在花椒直播中的应用—神经网络与协同过滤篇,地址:https://mp.weixin.qq.com/s/ERfIcCJ7ne4OjfRStdR_vw 【5】深度学习在花椒直播的应用——Tensorflow 原理篇,地址:深度学习在花椒直播的应用——Tensorflow 原理篇