推荐系统
推荐系统的定义
推荐系统是利用用户产生的行为数据,对用户的兴趣进行建模,从而给用户推荐可能感兴趣的物品。
推荐系统的应用
- 电商网站
- 新闻网站
- 流媒体平台
协同过滤
协同过滤是一种基于用户行为的推荐算法,它的基本思想是利用用户的历史行为数据,计算用户之间的相似度,然后根据相似度为用户生成推荐列表。
以电影网站预测为例,有以下数据:
电影名称 | 用户1 | 用户2 | 用户3 | 用户4 | \(x_1\)(爱情) | \(x_2\)(动作) |
---|---|---|---|---|---|---|
电影1 | 5 | 5 | 0 | 0 | 0.9 | 0 |
电影2 | 5 | ? | ? | 0 | 1 | 0 |
电影3 | ? | 4 | 0 | ? | 0.99 | 0 |
电影4 | 0 | 0 | 5 | 4 | 0 | 1 |
电影5 | 0 | 0 | 5 | ? | 0 | 0.9 |
对于每一个电影可能的类型,我们可以定义一个特征,比如\(x_1\)表示爱情,\(x_2\)表示动作。记为\(x^{(i)}\),其中\(i\)表示电影的编号。
以电影1为例,\(x^{(1)}=(0.9,0)\),表示电影1的类型为爱情。
参数\(W\)和\(b\)的学习
预测用户对电影评分的公式为:
\[\hat{y}^{(i,j)}=W^{(j)}x^{(i)}+b^{(j)} \]其中,\(W^{(j)}\)表示用户\(j\)的参数,\(b^{(j)}\)表示用户\(j\)的偏置。
评分预测的损失函数为:
\[J(W^{(1)},...,W^{(n_u)},b^{(1)},...,b^{(n_u)})=\frac{1}{2}\sum_{j=1}^{n_u}\sum_{i:r(i,j)=1}((W^{(j)}x^{(i)}+b^{(j)})-y^{(i,j)})^2+\frac{\lambda}{2}\sum_{j=1}^{n_u}\sum_{k=1}^{n}((W_k^{(j)})^2) \]其中,\(n_u\)表示用户的数量,\(n\)表示特征的数量,\(r(i,j)\)表示用户\(j\)是否对电影\(i\)评分。
参数\(X\)的学习
电影类型预测是的损失函数为:
\[J(X^{(1)},...,X^{(n_m)})=\frac{1}{2}\sum_{i=1}^{n_m}\sum_{j:r(i,j)=1}((W^{(j)}x^{(i)}+b^{(j)})-y^{(i,j)})^2+\frac{\lambda}{2}\sum_{i=1}^{n_m}\sum_{k=1}^{n}((X_k^{(i)})^2) \]其中,\(n_m\)表示电影的数量,\(n\)表示特征的数量,\(r(i,j)\)表示用户\(j\)是否对电影\(i\)评分。
协同过滤算法
协同过滤的损失函数
将上面两个损失函数合并,得到协同过滤的损失函数:
\[J(X,W,b)=\frac{1}{2}\sum_{(i,j):r(i,j)=1}((W^{(j)}x^{(i)}+b^{(j)})-y^{(i,j)})^2+\frac{\lambda}{2}\sum_{i=1}^{n_m}\sum_{k=1}^{n}((X_k^{(i)})^2)+\frac{\lambda}{2}\sum_{j=1}^{n_u}\sum_{k=1}^{n}((W_k^{(j)})^2) \]协同过滤的梯度下降
对于参数\(X\),\(W\),\(b\),它们的梯度分别为:
\[\frac{\partial J}{\partial X_k^{(i)}}=\sum_{j:r(i,j)=1}((W^{(j)}x^{(i)}+b^{(j)})-y^{(i,j)})W_k^{(j)}+\lambda X_k^{(i)}\\ \frac{\partial J}{\partial W_k^{(j)}}=\sum_{i:r(i,j)=1}((W^{(j)}x^{(i)}+b^{(j)})-y^{(i,j)})X_k^{(i)}+\lambda W_k^{(j)}\\ \frac{\partial J}{\partial b_k^{(j)}}=\sum_{i:r(i,j)=1}((W^{(j)}x^{(i)}+b^{(j)})-y^{(i,j)}) \]梯度下降的更新公式为:
\[X_k^{(i)}:=X_k^{(i)}-\alpha\frac{\partial J}{\partial X_k^{(i)}}\\ W_k^{(j)}:=W_k^{(j)}-\alpha\frac{\partial J}{\partial W_k^{(j)}}\\ b_k^{(j)}:=b_k^{(j)}-\alpha\frac{\partial J}{\partial b_k^{(j)}} \]二元标签分类
二元标签分类中,用户对电影的评价只有两种情况,例如:是否点赞、是否收藏等。
分类公式
预测用户二元评价的公式为:
\[\hat{y}^{(i,j)}=\sigma(W^{(j)}x^{(i)}+b^{(j)}) \]其中,\(\sigma\)表示Sigmoid函数。
损失函数
损失函数为:
\[J(W^{(1)},...,W^{(n_u)},b^{(1)},...,b^{(n_u)})=-\frac{1}{m}\sum_{j=1}^{n_u}\sum_{i=1}^{m}(y^{(i,j)}log(\hat{y}^{(i,j)})+(1-y^{(i,j)})log(1-\hat{y}^{(i,j)}))+\frac{\lambda}{2}\sum_{j=1}^{n_u}\sum_{k=1}^{n}((W_k^{(j)})^2) \]均值归一化
对于未评分的新用户,利用原始数据(0-5分)进行预测,会导致预测结果均为0分。
为了解决这个问题,我们可以对原始数据进行均值归一化。
原始数据的计算公式为:
\[Y^{'}=Y-\mu,\mu=\frac{1}{n}\sum_{i=1}^{n}Y_i \]用户的预测公式为:
\[\hat{y}^{(i,j)}=\sigma(W^{(j)}x^{(i)}+b^{(j)})+\mu_i \]相似度计算
相似度计算是协同过滤算法的核心,它的目的是计算用户之间的相似度,从而为用户生成推荐列表。
欧式距离
欧式距离是最常用的相似度计算方法,它的计算公式为:
\[d(x,y)=\sqrt{\sum_{i=1}^{n}(x_i-y_i)^2} \]协同过滤求相似度的缺点
-
冷启动问题
对于新用户,由于没有历史行为数据,无法计算用户之间的相似度。 -
无法使用用户的其他信息
对于用户的其他信息,比如年龄、性别等,无法利用这些信息计算用户之间的相似度。
基于内容的推荐系统
基于内容的推荐系统是一种基于物品的推荐算法,它的基本思想是利用物品的特征,计算物品之间的相似度,然后根据相似度为用户生成推荐列表。
基于内容的推荐系统和协同过滤的区别在于,基于内容的推荐系统是基于物品或用户的特征,而协同过滤是基于用户的评分数据。
基于内容的推荐系统的过程
- 特征提取
对于物品,我们可以定义一些特征,比如电影的类型、电影的导演、电影的演员等。 - 特征向量维度压缩
不同的向量之间进行点积运算,须保持向量的维度一致,通过特征向量压缩,可以减少向量的维度,从而提高运算效率。
- 特征相似度计算
深度学习在推荐系统中的应用
维度压缩
为了将特征向量压缩到相同低维度,我们可以使用深度学习实现。
相似度计算
深度学习的损失函数为:
\[J=\sum_{i,j:r(i,j)=1}(v_u^{(j)}\cdot v_i^{(i)}-y^{(i,j)})^2+\lambda\sum_{i=1}^{n_m}||v_i^{(i)}||^2+\lambda\sum_{j=1}^{n_u}||v_u^{(j)}||^2 \]其中,\(v_u^{(j)}\)表示用户\(j\)的特征向量,\(v_i^{(i)}\)表示物品\(i\)的特征向量,\(y^{(i,j)}\)表示用户\(j\)对物品\(i\)的评分。
相似度计算的公式为:
\[d = ||v_u^{(k)}-v_u^{(i)}||^2 \]预测过程如图所示:
大型数据集的处理
系统中可能被推荐的数目往往是非常大的,比如电商网站可能有上百万的商品,流媒体平台可能有上万部电影。
对于这种大型数据集,可以使用检索和排名的方法进行推荐
检索
- 生成一系列候选物品
以电影推荐为例,可选的候选方式有:用户看过最接近的电影、用户最喜欢题材中的热门电影,所在地区最热门的电影等。
- 合并候选物品:去除重复的物品以及用户已经看过的物品
排名
+利用深度学习计算用户对候选物品的评分
+对评分进行排序,得到最终的推荐列表