作者/ 韩虹莹
编辑/ Ein

从人和信息的博弈谈举荐零碎缘起

首先谈谈我了解的举荐零碎。

如果说举荐零碎的定义是什么,每本书每篇文章说的都不太一样,协同过滤1992年就曾经有了,三十年里有数大佬剖析了个性化举荐的缘起和意义,世界曾经不须要多一个人的见解。然而,当所有人都说一件事件是正确的时候,咱们也要想分明它为什么是正确的

如果你问我举荐零碎是什么,我会通知你,是信息到人的精准散发。那么为什么在这个时代举荐零碎才应运而生?今人不会须要信息精准散发,车马信息都很慢,今人学富五车不过当初一个书包的信息量;唯有当初人才须要信息精准散发,信息太多工夫太少,乱花渐欲迷人眼,所以咱们须要一个智能的零碎,帮忙你过去过滤信息,所以举荐零碎是人和信息的桥梁。

当然,正如罗马不是一天建成的一样,在互联网上搭个桥也是要演进的,最开始是个小木桥——门户网站,用分类导航散发了信息;起初演变到了石板桥——搜索引擎,人能够更精准的找信息;逐渐的信息太多了,要变成信息找人,在这个过程中,无论是信息的消费者,还是信息的生产者,都遇到了未曾预感的艰难,信息消费者找不到信息了,信息生产者无奈让本人的信息展示在消费者眼前,有痛点就有需要,有需要就有产品,于是举荐零碎作为一个产品,恰到好处又必然的到来。凯文凯利在《必然》里,把这个趋势称为“过滤”:

进行过滤是必然的,因为咱们在不停地制作新货色。而在咱们将要制作的新货色中,首要的一点就是发明新的形式来过滤信息和个性化定制,以突显咱们之间的差别。

人如何和信息相处,举荐零碎既不是终点,恐怕也不会是终局,但它曾经是以后人们对于解决信息所能做的最好的实际了。

举荐零碎要如何满足需要

举荐零碎应该独自作为一个产品来看,他是一个什么产品呢?作为一个加工信息的产品,它肯定要满足信息供需两端的需要,才有价值。

所以作为一个举荐零碎,要把本人定义在一个中间方的地位,能够说 C 端用户和产品经理都是你的用户,两端的需要都须要被满足,所以既须要你想技术计划,还须要你去想,你怎么更好的满足两端的需要,用户只须要你精准的帮他找到信息。而对于产品方,须要开掘想通过举荐零碎取得什么。

对于用户端(信息需要端),最迫切的需要是如何帮我精准的找到我须要的信息。

对于公司端(信息供给端),是为了满足一些商业化的需要,比方吸引用户,加强用户黏性,进步用户转化率,比方资讯平台,短视频平台,信息流平台心愿晋升用户活跃度,缩短用户停留时间,电商平台心愿进步用户购买转化率。

举荐零碎惯例架构

从上图来看,一个残缺的举荐零碎包含数据局部和模型局部,数据局部次要依赖大数据离线或在线解决平台,次要实现的工作包含数据的收集和 ETL 解决,生成举荐模型所须要的特色数据。

举荐零碎模型局部是主体,这部分要在提供举荐模型服务之前,实现模型的训练,而后对输出数据进行解决,通过不同的召回或排序策略,生成最初的输入后果。一个惯例的工业级举荐零碎,在模型局部次要包含召回层,过滤层,排序层,也可依据业务须要判断是否须要补充策略与算法层。

1. "召回层"
个别利用高效的召回规定、算法或简略的模型,疾速从海量的候选集中召回用户可能感兴趣的物品。

2. "过滤层"
个别依据特定场景业务需要,对召回的数据进行过滤。

3. "排序层"
利用排序模型对初筛的候选集进行精排序。

4. "补充策略与算法层"
也被称为"再排序层",能够在将举荐列表返回用户之前,为兼顾后果的"多样性" "风行度" "新鲜度"等指标,联合一些补充的策 略和算法对举荐列表进行肯定的调整,最终造成用户可见的举荐列表。

举荐零碎常见模型概述与比拟

先来一个举荐算法倒退的工夫线

能够从图中看出,2016年是举荐零碎从传统机器学习模型到深度学习模型的转折点,这一年微软的 Deep Crossing ,谷歌的 Wide&Deep ,以及 FNN 、 PNN 等一大批 优良的深度学习举荐模型相继推出,继而逐步成为举荐零碎的支流。但传统举荐模型依然要被器重,第一它们是深度学习的根底,很多货色都是一脉相承的,矩阵合成的隐向量思维在Embedding中持续倒退,FM中的核心思想——特色穿插也在深度学习中持续应用,逻辑回归能够看做神经元的另一种表现形式。第二这些算法的硬件要求低,后果可解释性强,训练容易,仍是大量场景所实用的。

机器学习举荐模型演化过程

能够从图中看出,2016年是举荐零碎从传统机器学习模型到深度学习模型的转折点,这一年微软的 Deep Crossing ,谷歌的 Wide&Deep ,以及 FNN 、 PNN 等一大批 优良的深度学习举荐模型相继推出,继而逐步成为举荐零碎的支流。但传统举荐模型依然要被器重,第一它们是深度学习的根底,很多货色都是一脉相承的,矩阵合成的隐向量思维在Embedding中持续倒退,FM中的核心思想——特色穿插也在深度学习中持续应用,逻辑回归能够看做神经元的另一种表现形式。第二这些算法的硬件要求低,后果可解释性强,训练容易,仍是大量场景所实用的。

协同过滤

协同过滤是举荐零碎畛域利用最宽泛的模型了,而且大家一说到举荐零碎,就会间接关联到协同过滤,而且是基于用户的协同过滤 or 基于物品的协同过滤,其实从某种程度上了解,矩阵合成也是协同过滤的一种,基于用户,商品的协同过滤属于基于近邻的协同过滤,从更大一点的范畴来说,大多数机器学习和分类算法能够了解为协同过滤的一个分支,协同过滤能够看做是分类问题的泛化,正是因为这个起因,实用于分类的许多模型也能够通过泛化利用于协同过滤。

本节次要针对的,还是宽泛意义上了解的,基于近邻的协同过滤,这类协同过滤,其实就是基于用户-用户,物品-物品的类似度计算

基于用户协同过滤

当用户须要个性化举荐时,能够先找到与他类似其余用户(通过趣味、喜好或行为习惯等,而后把那些用户喜爱的并且本人不晓得的物品举荐给用户。

步骤:

  • 筹备用户向量,在该矩阵中,实践上每个用户失去一个向量
  • 向量维度是物品个数,向量是稠密的,向量取值能够是简略的0或1
  • 用每个用户向量,两两计算用户之间类似度,设定一个类似度阈值,为每个用户保留与其最类似的用户
  • 为每个用户产生举荐后果

基于物品协同过滤

基于物品的协同过滤算法简称,其简略利用情景是:当一个用户须要个性化举荐时,例如因为他之前购买过金庸的《射雕英雄传》这本书,所以会给他举荐《神雕侠侶》,因为其余用户很多都同时购买了这两本书。

步骤:

  • 构建用户物品的关系矩阵,能够是购买行为,或购买后的评估,购买次数等
  • 两两计算物品类似度,失去物品类似度矩阵
  • 产生举荐后果,典型的两种模式:①为某个物品举荐相干物品;②集体首页的“猜你喜爱”

计算类似度的形式有如下几种:

①余弦类似度,余弦类似度( Cosine Similarity )掂量了用户向量t和用户向量j之间的向量夹角大小。 显然,夹角越小,证实余弦类似 度越大,两个用户越类似。

②皮尔逊相关系数,相比余弦类似度,皮尔逊相关系数通过应用用户平均分对各独立评分进行修改,减小了用户评分偏置的影响 。

矩阵合成

对于矩阵合成,一种讲法把它划归为协同过滤,认为他是基于模型的协同过滤,另一种则认为他是协同过滤的进化,其实这个到影响不大,矩阵合成是在协同过滤的根底上,减少了隐向量的概念。

矩阵合成能够解决一些邻域模型无奈解决的问题:①物品之间存在关联性,信息量不随向量维度线性减少;②矩阵元素稠密,计算结果不稳固,增减一个向量,后果差别很大。

矩阵合成把User矩阵和Item矩阵作为未知量,用它们示意出每个用户对每个item的预测评分,而后通过最小化预测评分跟理论评分的差别,学习出User矩阵和Item矩阵。也就是说,图2中只有等号右边的矩阵是已知的,等号左边的User矩阵和Item矩阵都是未知量,由矩阵合成通过最小化预测评分跟理论评分的差别学进去的。

矩阵合成用到的用户行为数据分为显式数据和隐式数据两种。显式数据是指用户对item的显式打分,比方用户对电影、商品的评分,通常有5分制和10分制。隐式数据是指用户对item的浏览、点击、购买、珍藏、点赞、评论、分享等数据,其特点是用户没有显式地给item打分,用户对item的感兴趣水平都体现在他对item的浏览、点击、购买、珍藏、点赞、评论、分享等行为的强度上。咱们以后次要是隐式数据。

指标函数通过最小化预测评分和理论评分ruirui 之间的残差平方和,来学习所有用户向量和物品向量

显示矩阵指标函数

隐式矩阵指标函数

求解办法:矩阵合成的办法也不止一种,有奇怪值合成,梯度降落,交替最小二乘,这里简略列举一个交替最小二乘的例子。

ALS(交替最小二乘法):先固定X 优化Y ,而后固定Y 优化X ,这个过程一直反复,直到X 和Y 收敛为止。

这里举一个,显式矩阵中固定Y优化X的例子,另外固定X优化Y:

  • 指标函数被拆解为多个独立指标函数,每个用户对应一个指标函数,用户u的指标函数为:
  • 该指标函数转换为矩阵模式。
  • 对指标函数J对于Xu求梯度,并令梯度为零。

逻辑回归→POLY2→FM→FFM

首先逻辑回归的想法很奇妙,把举荐零碎的举荐问题看做了一个分类问题,为什么能够这样说呢?

逻辑回归能够通过sigmoid 函数,将输出特征向量x=(x1,x2......xn)x=(x1,x2......xn),映射到(0,1)区间,如下图所示:

逻辑回归有着很多劣势:

  • 数学含意上的撑持,逻辑回归的假如是因变量y遵从Bernoulli散布,十分合乎咱们对于CTR模型的意识,相比之下线性回归模型假如y遵从高斯分布,这与咱们所了解的CTR预估模型(二分类问题)并不统一。
  • 可解释性强,逻辑回归的简略数学模式也十分合乎人类对 预估过程的直觉认知
  • 工程化简略,具备易于并行化,训练简略,训练开销小的特点

但也有一些毛病:

  • 表达能力不强,无奈进行特色穿插、特色筛选等操作,所以会造成一些信息的损失

正是因为这个起因,前面呈现了POLY2模型,FM模型,FFM模型,接下来我一起阐明:

POLY2模型——特色的“暴力”组合

该模型对所有特色进行了两两穿插(特色 Xj1 和 Xjz),并对所有的 特色组合赋予权重 Wh(j1,j2),实质上还是一个线性模型:

FM——隐向量的特色穿插

FM与POLY2的次要区别是用两个向量的内积(Wj1,Wj2) 取代了繁多的权重系数Wh(j1,j2)。

  • FM为每个特色学习了一个隐权重向量,特色穿插时,应用两个特色隐向量的内积作为穿插特色的权重。
  • 引入隐向量的做法,与矩阵合成的思维殊途同归,是从单纯用户-物品扩大到了所有特色上。
  • 把POLY2模型 n^2的权重参数缩小到了nk。

FM这样做的劣势在于,隐向量的引人使 FM 能更好地解决数据稠密性的问题,泛化能力大大提高。在工程方面, FM 同样能够用梯度降落法进行学习,使其不失实时性和灵活性 。

FFM——特色域

FFM 与 FM 的区别在于隐向量由原来的 Wj1 变成了 Wj1,f2,这意味着每个特色对应的不是惟一一个隐向量,而是一组隐向量,当特色 xj1 与特色 xj2 进行穿插时,xj1 会从 xj1 这一组隐向量中挑出与特色xj2的域f2对应的隐向量 Wj1,f2 进行穿插,同理, xj2 也会用与 xj1的域f1对应的隐向量进行穿插。

模型演变的形象化示意

POLY2模型

FM模型

FFM模型

传统机器学习算法比拟

大厂如何玩转举荐零碎

大厂实际比拟

这里选取了几个比拟典型的举荐零碎实现,他们别离属于几种举荐零碎的典型场景

深度学习算法比拟

针对几个大厂局部采纳了一些深度学习的模型,这里也调研比照了深度学习模型的特点和优劣势

云课堂的个性化举荐

特色工程

次要选用了用户行为数据,用户行为数据在举荐零碎中有显性反馈行为和隐性反馈行为两种,在云课堂场景下,用户的评分属于显性行为,用户的购课,学习,做笔记等都属于隐性行为。对于这些行为,咱们依据业务重要水平,都给出了初始分数,生成了用户-课程的初始评分矩阵

评分矩阵简略示意如下:

算法选型

在个性化举荐零碎搭建初期,因为咱们是从0到1开始构建,所以并没有抉择在初期抉择简单的深度学习算法,以及构建丰盛的用户画像,心愿在初期疾速构建一个MVP版本上线,后续逐渐反思优化迭代

所以在算法选型上,咱们从上面三种计划中进行评估抉择

  • 基于标签匹配
  • 基于用户/行为的协同过滤
  • 基于矩阵合成的协同过滤

那么咱们是如何进行取舍的?

对于计划一,如果心愿计划一获得较好的成果,关键点在于依赖标签体系的建设,只有标签体系足够欠缺,也就是说,举荐后果的好坏,是可预计的,强依赖于标签体系的建设的。

对于计划二,它的毛病在于解决稠密矩阵的能力较弱,而云课堂中用户的学习行为并不能算是高频行为,同时头部效应显著,而咱们心愿的是通过个性化举荐零碎,开掘更多隐含的可能性,保留更多平台上更多平时没机会裸露的课程,显然基于近邻形式的协同过滤,不是一个很适合的抉择。而基于矩阵合成的办法能够肯定水平上加强稠密矩阵的解决能力,同时引入隐向量,能够从用户行为中开掘更多的可能性。

咱们选用了基于ALS(交替最小二乘法)的矩阵合成模型作为第一个实际的算法,采纳的是Spark MLlib提供的API。

在ALS模型的构建过程中,须要调整如下几个参数以获得最好的成果

对于下面几个参数,别离调整了几次参数,以MSE 和 RMSE 作为评估指标

均方误差( Mean Square Error , MSE)和均方根误差( Root Mean Square Error , RMSE) 常常被用来掂量回归模型的好坏。个别状况下, RMSE 可能很好地反映回归模型预测值与实在值的偏离水平 。 但在理论利用时,如果存在个别偏离水平十分大的离群点 , 那么即便离群点数量 非常少 , 也会让这两个指标变得很差 。

工程落地

一个能够落地的举荐零碎,数据收集模块,ETL模块,特色工程模块,举荐算法模块,Web服务模块模块是必不可少的,首先来一个整体架构图:

接下来简略对几个模块的实现进行阐明:

参考文献

1.《深度学习举荐零碎》王喆

2.《举荐零碎 原理与实际》 Charu C. Aggarwal

-END-