做者/ 韩虹莹
编辑/ Ein
首先谈谈我理解的推荐系统。算法
若是说推荐系统的定义是什么,每本书每篇文章说的都不太同样,协同过滤1992年就已经有了,三十年里无数大佬分析了个性化推荐的缘起和意义,世界已经不须要多一我的的看法。可是,当全部人都说一件事情是正确的时候,咱们也要想清楚它为何是正确的。架构
若是你问我推荐系统是什么,我会告诉你,是信息到人的精准分发。那么为何在这个时代推荐系统才应运而生?古人不会须要信息精准分发,车马信息都很慢,古人学富五车不过如今一个书包的信息量;惟有如今人才须要信息精准分发,信息太多时间太少,乱花渐欲迷人眼,因此咱们须要一个智能的系统,帮助你过来过滤信息,因此推荐系统是人和信息的桥梁。机器学习
固然,正如罗马不是一天建成的同样,在互联网上搭个桥也是要演进的,最开始是个小木桥——门户网站,用分类导航分发了信息;后来演化到了石板桥——搜索引擎,人能够更精准的找信息;逐步的信息太多了,要变成信息找人,在这个过程当中,不管是信息的消费者,仍是信息的生产者,都遇到了未曾预见的困难,信息消费者找不到信息了,信息生产者没法让本身的信息展示在消费者眼前,有痛点就有需求,有需求就有产品,因而推荐系统做为一个产品,恰到好处又必然的到来。凯文凯利在《必然》里,把这个趋势称为“过滤”:ide
进行过滤是必然的,由于咱们在不停地制造新东西。而在咱们将要制造的新东西中,首要的一点就是创造新的方式来过滤信息和个性化定制,以突显咱们之间的差别。
人如何和信息相处,推荐系统既不是起点,恐怕也不会是终局,但它已是当前人们对于处理信息所能作的最好的实践了。函数
推荐系统应该单独做为一个产品来看,他是一个什么产品呢?做为一个加工信息的产品,它必定要知足信息供需两端的需求,才有价值。学习
因此做为一个推荐系统,要把本身定义在一个中间方的位置,能够说 C 端用户和产品经理都是你的用户,两端的需求都须要被知足,因此既须要你想技术方案,还须要你去想,你怎么更好的知足两端的需求,用户只须要你精准的帮他找到信息。而对于产品方,须要挖掘想经过推荐系统得到什么。大数据
对于用户端(信息需求端),最迫切的需求是如何帮我精准的找到我须要的信息。优化
对于公司端(信息供应端),是为了知足一些商业化的需求,好比吸引用户,加强用户黏性,提升用户转化率,好比资讯平台,短视频平台,信息流平台但愿提高用户活跃度,延长用户停留时间,电商平台但愿提升用户购买转化率。网站
从上图来看,一个完整的推荐系统包括数据部分和模型部分,数据部分主要依赖大数据离线或在线处理平台,主要完成的工做包括数据的收集和 ETL 处理,生成推荐模型所须要的特征数据。ui
推荐系统模型部分是主体,这部分要在提供推荐模型服务以前,完成模型的训练,而后对输入数据进行处理,经过不一样的召回或排序策略,生成最后的输出结果。一个常规的工业级推荐系统,在模型部分主要包括召回层,过滤层,排序层,也可根据业务须要判断是否须要补充策略与算法层。
1. "召回层"
通常利用高效的召回规则、算法或简单的模型,快速从海量的候选集中召回用户可能感兴趣的物品。
2. "过滤层"
通常根据特定场景业务需求,对召回的数据进行过滤。
3. "排序层"
利用排序模型对初筛的候选集进行精排序。
4. "补充策略与算法层"
也被称为"再排序层",能够在将推荐列表返回用户以前,为兼顾结果的"多样性" "流行度" "新鲜度"等指标,结合一些补充的策 略和算法对推荐列表进行必定的调整,最终造成用户可见的推荐列表。
先来一个推荐算法发展的时间线
能够从图中看出,2016年是推荐系统从传统机器学习模型到深度学习模型的转折点,这一年微软的 Deep Crossing ,谷歌的 Wide&Deep ,以及 FNN 、 PNN 等一大批 优秀的深度学习推荐模型相继推出,继而逐渐成为推荐系统的主流。但传统推荐模型仍然要被重视,第一它们是深度学习的基础,不少东西都是一脉相承的,矩阵分解的隐向量思想在Embedding中继续发展,FM中的核心思想——特征交叉也在深度学习中继续使用,逻辑回归能够看作神经元的另外一种表现形式。第二这些算法的硬件要求低,结果可解释性强,训练容易,还是大量场景所适用的。
能够从图中看出,2016年是推荐系统从传统机器学习模型到深度学习模型的转折点,这一年微软的 Deep Crossing ,谷歌的 Wide&Deep ,以及 FNN 、 PNN 等一大批 优秀的深度学习推荐模型相继推出,继而逐渐成为推荐系统的主流。但传统推荐模型仍然要被重视,第一它们是深度学习的基础,不少东西都是一脉相承的,矩阵分解的隐向量思想在Embedding中继续发展,FM中的核心思想——特征交叉也在深度学习中继续使用,逻辑回归能够看作神经元的另外一种表现形式。第二这些算法的硬件要求低,结果可解释性强,训练容易,还是大量场景所适用的。
协同过滤是推荐系统领域应用最普遍的模型了,并且你们一说到推荐系统,就会直接关联到协同过滤,并且是基于用户的协同过滤 or 基于物品的协同过滤,其实从某种程度上理解,矩阵分解也是协同过滤的一种,基于用户,商品的协同过滤属于基于近邻的协同过滤,从更大一点的范围来讲,大多数机器学习和分类算法能够理解为协同过滤的一个分支,协同过滤能够看作是分类问题的泛化,正是由于这个缘由,适用于分类的许多模型也能够经过泛化应用于协同过滤。
本节主要针对的,仍是普遍意义上理解的,基于近邻的协同过滤,这类协同过滤,其实就是基于用户-用户,物品-物品的类似度计算。
当用户须要个性化推荐时,能够先找到与他类似其余用户(经过兴趣、爱好或行为习惯等,而后把那些用户喜欢的而且本身不知道的物品推荐给用户。
步骤:
基于物品的协同过滤算法简称,其简单应用情景是:当一个用户须要个性化推荐时,例如因为他以前购买过金庸的《射雕英雄传》这本书,因此会给他推荐《神雕侠侶》,由于其余用户不少都同时购买了这两本书。
步骤:
计算类似度的方式有以下几种:
①余弦类似度,余弦类似度( 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:
首先逻辑回归的想法很巧妙,把推荐系统的推荐问题看作了一个分类问题,为何能够这样说呢?
逻辑回归能够经过sigmoid 函数,将输入特征向量x=(x1,x2......xn)x=(x1,x2......xn),映射到(0,1)区间,以下图所示:
逻辑回归有着不少优点:
但也有一些缺点:
正是因为这个缘由,后面出现了POLY2模型,FM模型,FFM模型,接下来我一块儿说明:
该模型对全部特征进行了两两交叉(特征 Xj1 和 Xjz),并对全部的 特征组合赋予权重 Wh(j1,j2),本质上仍是一个线性模型:
FM与POLY2的主要区别是用两个向量的内积(Wj1,Wj2) 取代了单一的权重系数Wh(j1,j2)。
FM这样作的优点在于,隐向量的引人使 FM 能更好地解决数据稀疏性的问题,泛化能力大大提升。在工程方面, FM 一样能够用梯度降低法进行学习,使其不失实时性和灵活性 。
FFM 与 FM 的区别在于隐向量由原来的 Wj1 变成了 Wj1,f2,这意味着每一个特征对应的不是惟一一个隐向量,而是一组隐向量,当特征 xj1 与特征 xj2 进行交叉时,xj1 会从 xj1 这一组隐向量中挑出与特征xj2的域f2对应的隐向量 Wj1,f2 进行交叉,同理, xj2 也会用与 xj1的域f1对应的隐向量进行交叉。
这里选取了几个比较典型的推荐系统实现,他们分别属于几种推荐系统的典型场景
针对几个大厂部分采用了一些深度学习的模型,这里也调研对比了深度学习模型的特色和优劣势
主要选用了用户行为数据,用户行为数据在推荐系统中有显性反馈行为和隐性反馈行为两种,在云课堂场景下,用户的评分属于显性行为,用户的购课,学习,作笔记等都属于隐性行为。对于这些行为,咱们根据业务重要程度,都给出了初始分数,生成了用户-课程的初始评分矩阵
评分矩阵简单表示以下:
在个性化推荐系统搭建初期,因为咱们是从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-