推荐算法之ALS

Posted KPMG大数据挖掘

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了推荐算法之ALS相关的知识,希望对你有一定的参考价值。


前言:本文将简单介绍推荐算法的原理,并通过实际案例,介绍推荐算法ALS的实现方式。




 1  推荐算法概述

需求:

只知用户评分矩阵(User-Item Matrix),试向用户(User)推荐产品(Item)。

输入:

 

上图所示为用户评分矩阵,其中用户评分为1-5,?所示为需要估算的用户评分。如果能够快速估算出用户的评分那么就可以对用户进行推荐了,实现的方法非常多,但并不是本次讨论的重点,一笔飞过——以下为常用的推荐算法概括。

实现:

推荐算法之ALS


一般来说,推荐系统通常往往是多个推荐算法的叠加或集合,其中协同过滤算法和基于内容推荐、流行度推荐使用最广。而基于内容推荐需要较多的用户维度信息及与产品的相关程度,有比较大的工作量;流行度推荐对于新的产品及用户个性化满足不够。协同过滤分析用户以及用户相关的产品的相关性,用以识别新的用户-产品相关性。协同过滤系统需要的唯一信息是用户过去的行为信息,比如对产品的评价信息。相较而言,协同过滤算法能够比较快速同时能够个性化地实现推荐。

使用协同过滤的算法,同时结合分布式大数据系统能够构建出高效且可应用于大规模人群的推荐系统,在电商及视频等行业应用较广,银行业也有着相似的需求和应用,特别是在理财推荐方面。

基于邻域的协同过滤要计算大量的相似性距离,因而选择基于用户还是基于物品有较大的性能差异;两者目前还没能实现分布式的算法,在用户量大于千万级或数亿级规模时,与下面要说的基于Spark的协同过滤算法(ALS算法)有较大的性能差距。


 2  什么是ALS

 

ALS是交替最小二乘(Alternating Least Squares)的简称。在机器学习中,ALS特指使用交替最小二乘求解的一个协同推荐算法。它通过观察到的所有用户给商品的评分,通过提取主要因素来对上图中”?”进行评分,进而推断每个用户的喜好并向用户推荐适合的商品。

2.1低秩假设

ALS的核心就是这样一个假设:评分矩阵是近似低秩的。换句话说,就是一个m*n的评分矩阵可以由分解的两个小矩阵U(m*k)和V(k*n)的乘积来近似,即A=UV^T,k≤m,n。这就是ALS的矩阵分解方法。这样我们把系统的自由度从O(mn)降到了O((m+n)k)。

那么ALS的低秩假设合理吗?这个问题正是利用了人类的概括能力,通常我们描述一个人的喜好,我们并不需要一一列出他喜好的事物,而是概括他喜欢哪些类型。例如,我喜好看侦探类型,可能代表我喜欢《神探夏洛特》、《柯南》等。这些影片都符合我对自己喜好的描述,也就是说他们在这个抽象的低维空间的投影和我的喜好相似。

再抽象一些来描述这个问题,我们把某个人的喜好映射到了低维向量ui上,同时将某个影片的特征映射到了维度相同的向量vj上,那么这个人和这个影片的相似度就可以表述成这两个向量之间的内积([u_i]^T)* vj。我们把评分理解成相似度,那么评分矩阵A就可以由用户喜好矩阵和产品特征矩阵的乘积UV^T来近似了。

2.2ALS最优求解

基于以上假设我们把评分矩阵A通过UV^T来近似,那么究竟合理不合理,怎么量化?一个最直接的可量化的目标就是通过U,V重构A所产生的误差。在ALS里,我们使用Frobenius范数,推荐算法之ALS来量化重构误差,即每个元素的重构误差的平方和。这里存在一个问题,我们只观察到一部分评分,A中的大量未知评分正是我们想推断的,所以这个重构误差是包含未知数的。解决方案:只看对已知评分的重构误差,因为没评分的不可衡量。所以ALS的优化函数是:f=min(推荐算法之ALS)。这里R指观察到的(用户,产品)集。

这样协同推荐的问题通过低秩假设成功转变成了一个优化问题。

下面要讨论的内容很显然:这个优化问题怎么解?其实答案已经在ALS的名字已经给出——交替最小二乘。ALS的目标函数不是凸的,而且变量互相耦合在一起,很难求解。但如果我们把用户特征矩阵U和产品特征矩阵V固定一个,这个问题立刻变成了一个凸的且可拆分的问题。比如我们固定U,那么目标函数就可以写成推荐算法之ALS。其中关于每个产品特征v_j的部分是独立的,也就是说固定U求vj,我们只需要最小化推荐算法之ALS就好了,这个问题就是经典的最小二乘问题。所谓“交替”,就是指我们先随机生成U(0),然后固定它求解V(0),再固定V(0)求解U(1),这样交替进行下去。因为每步迭代都会降低重构误差,并且误差是有下界的,所以ALS一定会收敛。但由于问题是非凸的,ALS并不保证会收敛到全局最优解。但在实际应用中,ALS对初始点不是很敏感,是不是全局最优解造成的影响并不大。

 3  Spark中ALS的实现原理

Spark利用交换最小二乘解决矩阵分解问题分两种情况:数据集是显式反馈和数据集是隐式反馈。隐式反馈算法的原理是在显示反馈算法原理的基础上作一定的修改,所以在此我们只会具体讲解数据集为隐式反馈的算法。


推荐系统依赖不同类型的输入数据,最方便的是高质量的显式反馈数据,它们包含用户对感兴趣商品明确的评价。例如,大众点评中对餐厅的评价数据,但是显式反馈数据不一定总是找得到。好在推荐系统还可以从更丰富的隐式反馈信息中推测用户的偏好。隐式反馈类型包括购买历史、浏览历史、搜索模式甚至鼠标动作。例如,反复浏览某一个类型理财产品的用户可能喜欢这类理财产品。

了解隐式反馈的特点非常重要,因为这些特质使我们避免了直接调用基于显式反馈的算法。最主要的特点有如下几种:

(1)没有负反馈。通过观察用户行为,我们可以推测那个商品他可能喜欢,然后购买,但是我们很难推测哪个商品用户不喜欢。这在显式反馈算法中并不存在,因为用户明确告诉了我们他喜欢什么他不喜欢什么。

(2)隐式反馈是内在的噪音。虽然我们拼命的追踪用户行为,但是我们仅仅只是猜测他们的偏好和真实动机。例如,我们可能知道一个人的购买行为,但是这并不能完全说明偏好和动机,因为这个商品可能作为礼物被购买而用户并不喜欢它。

(3)显示反馈的数值表示偏好(preference),隐式回馈的数值表示信任(confidence)。基于显示反馈的系统用星星等级让用户表达他们的喜好程度,例如一颗星表示很不喜欢,五颗星表示非常喜欢。基于隐式反馈的数值描述的是动作的频率,例如用户购买特定商品的次数。一个较大的值并不能表明更多的偏爱。但是这个值是有用的,它描述了在一个特定观察中的信任度。一个发生一次的事件可能对用户偏爱没有用,但是一个周期性事件更可能反映一个用户的选择。

(4)评价隐式反馈推荐系统需要合适的手段。


3.1显式反馈模型

潜在因素模型由一个针对协同过滤的交替方法组成,它以一个更加全面的方式发现潜在特征来解释观察的ratings数据。我们关注的模型由奇异值分解(SVD)推演而来。一个典型的模型将每个用户u(包含一个用户-因素向量u_i)和每个商品v(包含一个用户-因素向量v_j)联系起来。预测通过内积r_ij=(u_i^T )v_j来实现。另一个需要关注的地方是参数估计。许多当前的工作都应用到了显式反馈数据集中,这些模型仅仅基于观察到的rating数据直接建模,同时通过一个适当的正则化来避免过拟合。公式如下:

 

推荐算法之ALS

在上述公式中,lambda是正则化的参数。正规化是为了防止过拟合的情况发生。这样,我们用最小化重构误差来解决协同推荐问题。我们也成功将推荐问题转换为了最优化问题。



3.2隐式反馈模型

在显式反馈的基础上,我们需要做一些改动得到我们的隐式反馈模型。首先,我们需要形式化由r_ij变量衡量的信任度的概念。我们引入了一组二元变量p_ij,它表示用户u对商品v的偏好。p_ij的公式如下:

推荐算法之ALS

 

换句话说,如果用户购买了商品,我们认为用户喜欢该商品,否则我们认为用户不喜欢该商品。然而我们的信念(beliefs)与变化的信任(confidence)等级息息相关。首先,很自然的,p_ij的值为0和低信任有关。用户对一个商品没有得到一个正的偏好可能源于多方面的原因,并不一定是不喜欢该商品。例如,用户可能并不知道该商品的存在。

另外,用户购买一个商品也并不一定是用户喜欢它。因此我们需要一个新的信任等级来显示用户偏爱某个商品。一般情况下,r_ij越大,越能暗示用户喜欢某个商品。因此,我们引入了一组变量C_ij,它衡量了我们观察到p_ij的信任度。C_ij一个合理的选择如下所示:

推荐算法之ALS

 

按照这种方式,我们存在最小限度的信任度,并且随着我们观察到的正偏向的证据越来越多,信任度也会越来越大。

我们的目的是找到用户向量以及商品向量v_j来表明用户偏好。这些向量分别是用户因素(特征)向量和商品因素(特征)向量。本质上,这些向量将用户和商品映射到一个公用的隐式因素空间,从而使它们可以直接比较。这和用于显式数据集的矩阵分解技术类似,但是包含两点不一样的地方:(1)我们需要考虑不同的信任度。

(2)最优化需要考虑所有可能的u,v对,而不仅仅是和观察数据相关的u,v对。

因此,通过最小化下面的损失函数来计算相关因素(factors)。

 

推荐算法之ALS

3.3求解最小化损失函数

考虑到损失函数包含m*n个元素,m是用户的数量,n是商品的数量。一般情况下,m*n可以到达几百亿。这么多的元素应该避免使用随机梯度下降法来求解,Spark选择使用交替最优化方式求解。

交替最小二乘的计算过程是:交替的重新计算用户-特征向量和商品-特征向量,每一步都保证降低损失函数的值,直到找到极小值。交替最小二乘法的处理过程如下所示:

初始化U^1 和V^1

迭代直到损失函数不在变化或变化极小

 

推荐算法之ALS

 

在Spark的源代码中,ALS算法实现于org.apache.Spark.ml.recommendation.ALS.scala文件中。有兴趣的同学可以直接查看相关Scala代码。

基于Spark ALS我们结合Spark Streaming构建了一个实时的推荐系统(基于Netflix电影评分的Demo),有兴趣的同学可以回复”ALS”查看数据与源码链接。





长按二维码即可关注!也请随手推荐我们给你的小伙伴 ↓↓↓↓ 


以上是关于推荐算法之ALS的主要内容,如果未能解决你的问题,请参考以下文章

推荐算法ALS算法原理和在音乐推荐上的应用

推荐算法协同过滤算法代码(pyspark | ALS)

ALS推荐算法在Spark上的优化

ALS推荐算法—训练并保存—加载并测试

推荐系统中矩阵分解算法-funkSVD和ALS

Spark推荐系列之Word2vec算法介绍实现和应用说明