经典机器学习系列(十一)【个性化推荐之协同过滤】


  对推荐系统还没有直观理解的同学可以参考之前所写的文章: 推荐系统与人工智能概述

  协同过滤(Collaborative Filtering)是当前推荐系统最为流行的一种方法,就是说我们不只是基于内容进行推荐,我们还基于一些用户之间的协同行为去给用户做推荐,或者称之为个性化推荐。

  推荐系统本身和信息检索( information retrieval)具有很强的相关性,甚至被认为是一种能力更强的信息检索,与信息检索不同的地方在于它没有信息检索里面所需要的关键词,更多的是使用用户之前的使用信息等等,所以你需要去猜用户到底喜欢什么东西。本质可以理解为信息检索问题,但是没有关键词。

  在实际生活中也有很多例子,比如淘宝的推荐系统下面经常会有购买这些东西的人也购买了某某商品,还有头条推荐系统给你推送文章,这两者其实是有差异的。淘宝的客户端用户具有搜索功能,一旦搜索了说明是用户肯定感兴趣的东西;而头条就不太一定,头条只是接收用户一个单纯的反馈(点击或者不点击),但是这种反馈可能不是很精准,比如你可能不是被文章所写的内容感兴趣,而是对图片、标题、作者等等这些信息感兴趣。

Personalized Recommendation

  还有一个叫个性化推荐(Personalized Recommendation),这个行业的标杆:人物美国工程院院士、前雅虎副总裁Andrei Broder,同时首次提出了计算广告(Computational Advertising)的概念。我们做个性化推荐的时候往往会有两种方法(Methodologies):

  • Method 1:用户喜欢什么item(项目、物品,指所有可能被推荐到的资源,比如电影、书),我去给他推荐相似的这些item,比如喜欢漫威,我就给你推荐漫威的其他电影。

  • Method 2:推荐给你与你行为相似的用户喜欢的东西。这种方法所推荐的item更广泛。比如搜Andrei Broder这个关键词的用户喜欢吃什么菜,从而发现大部分人喜欢吃印度菜,而总结出印度人搜他的文章比较多,进而推断出印度做计算广告的人应该蛮多。

  第一种方法更简单一些,第二种方法对用户行为数据要求更多,但在工业级的应用场景里面更加work一些,我们接下来主要说第二种方法,也就是Collaborative filtering,第一种方法Content-based filtering就比较老,几十年的算法,网上资料也多。

Collaborative filtering

  举个例子,如下图所示:

在这里插入图片描述

  知道了部分user对于部分item的打分行为,如何来预测一个用户对于一个未知的item的打分行为呢?思考一下,如果是你对上述数据进行学习,你会对下图所示的这个问号框框预判几颗星呢?

在这里插入图片描述

  简单看一下是会是高分还是低分呢?从user来看的话,DaveGeorgeBoris很像,因此给的会是低分;从item来看的话,这步电影的评分就比较偏低,就会给低分。所以不管是根据item还是user来看都是低分。

K Nearest Neighbor Algorithm (KNN)

  KNN算法是一个non-parametric的方法,它没有参数需要学习,每一个数据点对于它来说就是一个参数,它有一个hyperparameter k k k

  对于每个输入的样本 x x x,在训练样本集合 N k ( x ) N_{k}(x) Nk(x)中寻找 k k k个特征空间最近的样本。预测的话就是拿 k k k个样本标签的平均作为预测结果:

y ^ ( x ) = 1 k ∑ x i ∈ N k ( x ) y i \hat{y}(x) = \frac{1}{k}\sum_{x_{i} \in N_{k}(x)} y_{i} y^(x)=k1xiNk(x)yi

  如果是一个分类问题的话,那拿这个label做一个voting就可以了。

  更加generalize的版本的KNN,我们是可以用每个样本的预测做平均做投票,但是每个样本都有权重。比如说离你这个输入样本 x x x 越近,那权重就可能比较高一点,由此我们可以定义一个相似度函数(similarity function) s ( x , x i ) s(x,x_{i}) s(x,xi) ,这个相似度函数一方面可以把这 k k k个样本选出来,另一方面基于相似度函数,可以做带有权重的label预测,如下公式所示:

y ^ ( x ) = ∑ x i ∈ N k ( x ) s ( x , x i ) y i ∑ x i ∈ N k ( x ) s ( x , x i ) \hat{y}(x)=\frac{\sum_{x_{i} \in N_{k}(x)} s\left(x, x_{i}\right) y_{i}}{\sum_{x_{i} \in N_{k}(x)} s\left(x, x_{i}\right)} y^(x)=xiNk(x)s(x,xi)xiNk(x)s(x,xi)yi

  这里最大的问题就是如何来选择hyperparameter k k k,如果你只在training set上面去选择能使得sum-of-squared error最小的 k k k话,泛化能力就会不够,因此经常需要依据validation set上面的效果去选择 k k k

基于User的KNN解决办法

  对于之前的那个问题,我们使用User-based kNN来尝试解决一下:

在这里插入图片描述

  首先是寻找相似的用户,发现与 Boris 相似的用户有DaveGeorge;之后我们做Rating Prediction,平均DaveGeorgeLove Actually电影的评分:1.5星。

  • Basic user-based kNN algorithm
    • For each target user for recommendation
    1. Find similar users
    2. Based on similar users, recommend new items
Similarity between Users

  我们可以把上述图表关系表达为下图所示曲线图:

在这里插入图片描述

  横轴表示items,纵轴表示rating,图中的曲线表示user。因此可以比较直观看出哪些用户之间比较像。从上图中选择三个user出来组成下图:

在这里插入图片描述

  可以看出这三个user比较像,但是黄色曲线的用户打分普遍偏低,紫色用户打分普遍偏高。对于这种问题我们普遍使用Pearson Correlation的方法来做把meanvariancenormalization

  那我们数学上怎么来做用户之间的Similarity呢?其实也就是度量数据之间的相关性了,我们之前也有说过类似的知识点,在这里主要是采用如下两种方式:

  • Cosine (angle)

s u cos ⁡ ( u a , u b ) = u a ⊤ u b ∥ u a ∥ ∥ u b ∥ = ∑ m x a , m x b , m ∑ m x a , m 2 ∑ m x b , m 2 s_{u}^{\cos }\left(u_{a}, u_{b}\right)=\frac{u_{a}^{\top} u_{b}}{\left\|u_{a}\right\|\left\|u_{b}\right\|}=\frac{\sum_{m} x_{a, m} x_{b, m}}{\sqrt{\sum_{m} x_{a, m}^{2} \sum_{m} x_{b, m}^{2}}} sucos(ua,ub)=uaubuaub=mxa,m2mxb,m2 mxa,mxb,m

  • Pearson Correlation

s u corr ⁡ ( u a , u b ) = ∑ m ( x a , m − x ˉ a ) ( x b , m − x ˉ b ) ∑ m ( x a , m − x ˉ a ) 2 ∑ m ( x b , m − x ˉ b ) 2 s_{u}^{\operatorname{corr}}\left(u_{a}, u_{b}\right)=\frac{\sum_{m}\left(x_{a, m}-\bar{x}_{a}\right)\left(x_{b, m}-\bar{x}_{b}\right)}{\sqrt{\sum_{m}\left(x_{a, m}-\bar{x}_{a}\right)^{2} \sum_{m}\left(x_{b, m}-\bar{x}_{b}\right)^{2}}} sucorr(ua,ub)=m(xa,mxˉa)2m(xb,mxˉb)2 m(xa,mxˉa)(xb,mxˉb)

  其中下标 m m m表示电影, u a u_{a} ua u b u_{b} ub表示用户 a a a和用户 b b b

  在预测的时候我们通常采用如下形式:

在这里插入图片描述

基于Item的KNN解决办法

  user可以这么做,那么item当然也可以这么做。一般的做法是寻找到相似的item,然后基于这个相似的item来对item做预测:

在这里插入图片描述

  衡量item aitem b之间的相关性可采用以下三种方式:

  • Cosine (angle)

s i cos ⁡ ( i a , i b ) = i a ⊤ i b ∥ i a ∥ ∥ i b ∥ = ∑ u x u , a x u , b ∑ u x u , a 2 ∑ u x u , b 2 s_{i}^{\cos }\left(i_{a}, i_{b}\right)=\frac{i_{a}^{\top} i_{b}}{\left\|i_{a}\right\|\left\|i_{b}\right\|}=\frac{\sum_{u} x_{u, a} x_{u, b}}{\sqrt{\sum_{u} x_{u, a}^{2} \sum_{u} x_{u, b}^{2}}} sicos(ia,ib)=iaibiaib=uxu,a2uxu,b2 uxu,axu,b

  • Adjusted Cosine

s i a d c o s ( i a , i b ) = ∑ u ( x u , a − x ˉ u ) ( x u , b − x ˉ u ) ∑ u ( x u , a − x ˉ u ) 2 ∑ u ( x u , b − x ˉ u ) 2 s_{i}^{\mathrm{adcos}}\left(i_{a}, i_{b}\right)=\frac{\sum_{u}\left(x_{u, a}-\bar{x}_{u}\right)\left(x_{u, b}-\bar{x}_{u}\right)}{\sqrt{\sum_{u}\left(x_{u, a}-\bar{x}_{u}\right)^{2} \sum_{u}\left(x_{u, b}-\bar{x}_{u}\right)^{2}}} siadcos(ia,ib)=u(xu,axˉu)2u(xu,bxˉu)2 u(xu,axˉu)(xu,bxˉu)

  这里是减去用户对各个电影打分的平均值,而不是item的平均值。

  • Pearson Correlation

s i corr ⁡ ( i a , i b ) = ∑ u ( x u , a − x ˉ a ) ( x u , b − x ˉ b ) ∑ u ( x u , a − x ˉ a ) 2 ∑ u ( x u , b − x ˉ b ) 2 s_{i}^{\operatorname{corr}}\left(i_{a}, i_{b}\right)=\frac{\sum_{u}\left(x_{u, a}-\bar{x}_{a}\right)\left(x_{u, b}-\bar{x}_{b}\right)}{\sqrt{\sum_{u}\left(x_{u, a}-\bar{x}_{a}\right)^{2} \sum_{u}\left(x_{u, b}-\bar{x}_{b}\right)^{2}}} sicorr(ia,ib)=u(xu,axˉa)2u(xu,bxˉb)2 u(xu,axˉa)(xu,bxˉb)

  那能计算相关性了之后,我们需要做预测了。首先我们要做一个相关性的序列排序,选择排序分数最高的k个相似的item出来:

N i ( u t , i a ) = { i b ∣ r i ( i a , i b ) < K ∗ , x t , b ≠ 0 } N_{i}\left(u_{t}, i_{a}\right)=\left\{i_{b} | r_{i}\left(i_{a}, i_{b}\right)<K^{*}, x_{t, b} \neq 0\right\} Ni(ut,ia)={ibri(ia,ib)<K,xt,b=0}

  之后的话我们就可以去做预测了:

x ^ t , a = ∑ i b ∈ N i ( u t , i a ) s i ( i a , i b ) x t , b ∑ i b ∈ N i ( u t , i a ) s i ( i a , i b ) \hat{x}_{t, a}=\frac{\sum_{i_{b} \in N_{i}\left(u_{t}, i_{a}\right)} s_{i}\left(i_{a}, i_{b}\right) x_{t, b}}{\sum_{i_{b} \in N_{i}\left(u_{t}, i_{a}\right)} s_{i}\left(i_{a}, i_{b}\right)} x^t,a=ibNi(ut,ia)si(ia,ib)ibNi(ut,ia)si(ia,ib)xt,b

  这里的 x t , b x_{t, b} xt,b不需要去做平均,因为这就是用户的打分习惯(这是用户本身的打分行为,偏高偏低都在里面)。

kNN based Methods Summary

  knn的方法非常直接并且可解释,并且是一个无参数的学习算法只有一个超参数 k k k。但是算法的效率会成为一个问题,因为useritem数量特别多。

Matrix Factorization Techniques

  既然useritem的关系构成了一个矩阵,因此我们可以通过矩阵分解的方式将这个矩阵分解为两个低秩但是稠密的矩阵。

在这里插入图片描述

  • Koren, Yehuda, Robert Bell, and Chris Volinsky. "Matrix factorization techniques for recommender systems."Computer42.8 (2009).

  因此每个user对应一个低维空间的稠密向量,每个item也同样对应一个低维空间的稠密向量。每个user和对应的item的那个rating就是由对位的user向量点乘对位的item向量。于是这个时候就变成了一个学习的算法:

在这里插入图片描述

  user u u u在item i i i下的预测是一个user的向量 p u p_{u} puitem的向量 q i q_{i} qi相乘得到:

r ^ u , i = p u ⊤ q i \hat{r}_{u, i}=p_{u}^{\top} q_{i} r^u,i=puqi

  由此我们可以通过梯度下降的方式进行学习,学习 p u p_{u} pu q i q_{i} qi该如何更新,其损失函数(Loss function)可定义为:

L ( u , i , r u , i ) = 1 2 ( r u , i − p u ⊤ q i ) 2 \mathcal{L}\left(u, i, r_{u, i}\right)=\frac{1}{2}\left(r_{u, i}-p_{u}^{\top} q_{i}\right)^{2} L(u,i,ru,i)=21(ru,ipuqi)2

  训练过程的目标函数(Training objective)引入L2正则化可得到如下公式:

min ⁡ P , Q ∑ r u , i ∈ D 1 2 ( r u , i − p u ⊤ q i ) 2 + λ 2 ( ∥ p u ∥ 2 + ∥ q i ∥ 2 ) \min _{P, Q} \sum_{r_{u, i} \in D} \frac{1}{2}\left(r_{u, i}-p_{u}^{\top} q_{i}\right)^{2}+\frac{\lambda}{2}\left(\left\|p_{u}\right\|^{2}+\left\|q_{i}\right\|^{2}\right) P,Qminru,iD21(ru,ipuqi)2+2λ(pu2+qi2)

  对其求梯度可得

∂ L ( u , i , r u , i ) ∂ p u = ( p u ⊤ q i − r u , i ) q i + λ p u ∂ L ( u , i , r u , i ) ∂ q i = ( p u ⊤ q i − r u , i ) p u + λ q i \begin{aligned} &\frac{\partial \mathcal{L}\left(u, i, r_{u, i}\right)}{\partial p_{u}}=\left(p_{u}^{\top} q_{i}-r_{u, i}\right) q_{i}+\lambda p_{u}\\ &\frac{\partial \mathcal{L}\left(u, i, r_{u, i}\right)}{\partial q_{i}}=\left(p_{u}^{\top} q_{i}-r_{u, i}\right) p_{u}+\lambda q_{i} \end{aligned} puL(u,i,ru,i)=(puqiru,i)qi+λpuqiL(u,i,ru,i)=(puqiru,i)pu+λqi

MF with Biases

  矩阵分解技术有一种变体,引入偏置项,user u u u在item i i i下的预测是一个user的向量 p u p_{u} puitem的向量 q i q_{i} qi相乘再加上一些偏置项得到 (这个为什么会有一些偏置在上文KNN算法有提及):

r ^ u , r = μ + b u + b i + p u T q i \hat{r}_{u,r}=\mu+b_{u}+b_{i}+p_{u}^{T}q_{i} r^u,r=μ+bu+bi+puTqi

  其中 μ \mu μGlobal bias b u b_{u} buuser bias b i b_{i} biitem bias p u T q i p_{u}^{T}q_{i} puTqiuser-item interaction。此时的训练目标函数表示为:

min ⁡ P , Q ∑ r u , i ∈ D 1 2 ( r u , i − ( μ + b u + b i + p u ⊤ q i ) ) 2 + λ 2 ( ∥ p u ∥ 2 + ∥ q i ∥ 2 + b u 2 + b i 2 ) \min _{P, Q} \sum_{r_{u, i} \in D} \frac{1}{2}\left(r_{u, i}-\left(\mu+b_{u}+b_{i}+p_{u}^{\top} q_{i}\right)\right)^{2}+\frac{\lambda}{2}\left(\left\|p_{u}\right\|^{2}+\left\|q_{i}\right\|^{2}+b_{u}^{2}+b_{i}^{2}\right) P,Qminru,iD21(ru,i(μ+bu+bi+puqi))2+2λ(pu2+qi2+bu2+bi2)

  其梯度更新可表示为:

δ = r u , i − ( μ + b u + b i + p u ⊤ q i ) μ ← μ + η δ b u ← ( 1 − η λ ) b u + η δ b i ← ( 1 − η λ ) b i + η δ p u ← ( 1 − η λ ) p u + η δ q i q i ← ( 1 − η λ ) q i + η δ p u \begin{aligned} \delta &=r_{u, i}-\left(\mu+b_{u}+b_{i}+p_{u}^{\top} q_{i}\right) \\ \mu & \leftarrow \mu+\eta \delta \\ b_{u} & \leftarrow(1-\eta \lambda) b_{u}+\eta \delta \\ b_{i} & \leftarrow(1-\eta \lambda) b_{i}+\eta \delta \\ p_{u} & \leftarrow(1-\eta \lambda) p_{u}+\eta \delta q_{i} \\ q_{i} & \leftarrow(1-\eta \lambda) q_{i}+\eta \delta p_{u} \end{aligned} δμbubipuqi=ru,i(μ+bu+bi+puqi)μ+ηδ(1ηλ)bu+ηδ(1ηλ)bi+ηδ(1ηλ)pu+ηδqi(1ηλ)qi+ηδpu

  从梯度更新公式可以看出,上述的模型 p u p_{u} pu更新其实是拿 q i q_{i} qi的方向去更新 p u p_{u} pu,这个时候如果 q i q_{i} qi学习地不好的话, p u p_{u} pu更新的方向也不对, q i q_{i} qi同理也是一样。导致它的更新会处在一个非常动荡的阶段,导致它很容易掉入到局部最优。

进一步的扩展

  根据时间的不同,比如晚上做rating效果好一点这样,还有比如一个电影越老的话,看他的人可能是在回忆经典,打分也会越来越高。

  • Koren, Yehuda. "Collaborative filtering with temporal dynamics.“ KDD 2009.

  如果引入用户之前的一些item打分行为的话,我们把这个叫做Neighborhood (Similarity)-based MF

在这里插入图片描述

  • Koren, Yehuda. "Factorization meets the neighborhood: a multifaceted collaborative filtering model."KDD, 2008.

在这里插入图片描述

  从机器学习这个角度来想,最需要记住的模型就是KNN模型,它是一个无参数模型,不需要去learn,另外一个就是基于Matrix Factorization这个一种linear的模型,由两个都是参数的向量相乘等于他的prediction,每个参数更新都依据于另外一半参数,这种方式很容易掉到局部最优点,现在这种方法通过SGD的方法可以达到非常好的效果。

  • 本文来自伯禹公开课的学习笔记。

我的微信公众号名称:深度学习先进智能决策
微信公众号ID:MultiAgent1024
公众号介绍:主要研究深度学习、强化学习、机器博弈等相关内容!期待您的关注,欢迎一起学习交流进步!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值