推荐系统

引入

其中$ j $表示用户的编号,$ i $代表电影的编号,最终我们可以使用这个公式预测对于用户$ j $来讲电影$ i $的评分,这个算法有些类似于线性回归,都是将特征值乘上权重加上偏置。

$ r(i,j) $:表示用户$ j $是否对于电影$ i $进行评分,$ 1 $代表是,$ 0 $代表否。

$ y^{(i,j)} $:表示用户$ j $对于电影$ i $的评分,如果存在的话。

$ w^{(j)},b^{(j)} $:表示对于用户$ j $的权重和偏置

$ x^{(i)} $:表示电影$ i $的特征向量

因此对于用户$ j $和电影$ i $来讲,评分为$ \mathrm{w^{(j)}\cdot x^{(i)}+b^{(j)}} $,加入$ m^{(j)} $作为对于用户$ j $评分的电影个数。

为了更好的学习$ w^{(j)},b^{(j)} $可以通过最小化代价函数进行调整。

这仅仅是对于用户$ j $来讲所有评分电影的参数,为了实现对于全部用户的预测,我们可以将$ m^{(j)} $这个电影个数省略,这仅仅是一个常数,不会影响$ w^{(j)},b^{(j)} $的训练。同时将全部的用户相加,我们就可以训练出全部的参数。

协同过滤算法

我们刚刚使用了特征值,但是这些特征值的数据从何而来,我们可以对其进行学习。通过预测$ w,b $类似的算法我们可以对$ x $的值实现类似的预测。那么可能会想到既然可以通过评分对特征值进行预测,那么在之前的线性回归中为什么不这样做,其实是由于这里的评分是多个用户的评分,而在之前的传统机器学习算法中我们仅仅有一个用户,因此不可以对特征值进行学习。

为了对预测的值进行一个调整,我们可以使用类似的代价函数,只不过这次$ x $成为了参数,在正则化中也是对于$ x $的正则化实现。但是现在又存在一个问题,也就是我们的$ w,b $从何而来呢,我们会想到上一节中我们学习的$ w,b $,因此我们可以将其结合在一起,这就是我们的协同过滤算法。

协同过滤,从字面上理解,包括协同和过滤两个操作。所谓协同就是利用群体的行为来做决策(推荐),生物上有协同进化的说法,通过协同的作用,让群体逐步进化到更佳的状态。对于推荐系统来说,通过用户的持续协同作用,最终给用户的推荐会越来越准。而过滤,就是从可行的决策(推荐)方案(标的物)中将用户喜欢的方案(标的物)找(过滤)出来。

将上面两个算法和在一起,我们就可以得到协同过滤算法,也就是同时实现对于$ w,b,x $全部参数值的训练。

对于这个代价函数的调整,我们还可以使用梯度下降算法,只不过这次的偏置项会增加一个参数$ x $。

二进制标签

我们之前是对于评分进行$ 0-5 $之间的划分,现在我们不再使用这种评分而是使用$ 0,1,? $作为标签,分别代表,喜欢,不喜欢和没有被展现。

关于$ 0,1,? $的选择,我们可以根据用户在浏览后是否购买,是否浏览时间超过$ 30s $,是否点击,判断用户是否喜欢。

为了实现二进制,我们可以使用之前实现的$ sigmod $函数,将其转化为概率值。

最终,由于使用了$ sigmod $函数,我们无法再使用原先的代价函数,需要使用交叉熵对其计算。

均值归一化

尽管之前已经实现了均值归一化,但是我们的系统仍存在一些问题,也就是对于那些几乎没有评分的用户来讲,其中平方差为$ 0 $,又由于正则化参数越小越好,最终很有可能导致$ w=0,b=0 $的训练结果。如果直接使用这个参数对评分进行预测的话,那么就会得到全为$ 0 $的数据,因此,为了解决这个问题,我们提出了均值归一化。

首先将全部用户的评分合成为一个矩阵,接着计算每一行的均值,得到一个平均值向量$ u $,然后对于每个用户都减去这个向量$ u $,最终我们得到了新的$ y{(i,j)} $,然后再计算预测值的时候将得到的结果加上之前的均值。其实本质上相当于对于原来预测为$ 0 $的评分设置为其他用户评分的平均值,使得预测的结果更加的合理。这样就可以使得对于原来那些评分很少或没有评分的用户的预测值更加的合理。

这是对于行平均,也可以进行列平均,比如有一部之前从没有上线的电影,由于评分很少,可以使用列平均进行优化,但是这样的效果不如行平均。

低秩矩阵分解

我们为了更加方便计算实现向量化,将原先的矩阵$ Y $分解为$ \theta^Tx $,这样的方式也被称为低秩矩阵分解

低秩矩阵分解的核心目标是将一个高维矩阵 $ M $ 近似分解为两个较小的矩阵$ A $$ B $ 的乘积。在数学上,这可以表达为 $ M ≈ A × B $,其中$ M $是一个$ m × n $矩阵,$ A $$ m × k $的矩阵,$ B $$ k × n $ 的矩阵,而$ k $(秩)远小于$ m $$ n $。这种分解的目的是减少矩阵的维度,同时保留其主要的特征和结构。

还有一个问题

我们找到一个物品时,通常界面上会推荐类似的物品,为了实现找到类似的物品,我们可以利用我们已经训练好的特征。对于人们来讲,这些特征可能会很难被解释出来,但是我们可以通过计算另外一个电影的特征$ x^{(j)} $和我们已经看过的电影的特征$ x^{(i)} $进行计算,通过计算他们的$ L2 $范数从而得到其中最类似的五个电影推荐给用户。

补充

  • 冷启动问题

对于新出的电影或者新的用户,我们如果使用协同过滤算法最终的表现不是很好,即使有均值归一化的帮助。

  • 使用更多的边信息

再协同过滤算法中我们仅使用了用户对于电影的评分,但是还有很多的信息,例如用户偏好,电影的主演,等等这些信息都没有被充分利用。

基于内容过滤

通过对比可以看到之前的协同过滤算法仅仅是通过多个用户之前的评分进行预测,而现在我们通过充分利用用户和物品的特征来进行预测,我们仍然具有不同用户的评分,但是现在基于内容过滤更加侧重于利用用户和物品的特征。

现在我们通过分析用户和电影的特征,分别得到$ x_u^{(j)} $,$ x_m^{(i)} $,这两个向量的大小可以并不相同,甚至差距很大。

再基于内容的过滤中不再使用偏置项,同时将$ w,x $修改为$ V_u^{(j)} $,$ V_m{(i)} $。将这两个进行点积,但是注意$ x_u^{(j)},x_m^{(i)} $的大小可以不同,但是得到的$ V_u^{(j)} $,$ V_m{(i)} $的大小一定要相同。

为了得到$ V_u^{(j)} $,$ V_m{(i)} $,可以使用神经网络进行深度学习,然后将得到的值进行内积,同时通过$ sigmod $函数计算概率值。注意,隐藏层的神经元个数可以任意,但是输出层的神经元个数这两个神经网络一定要相同。

再计算这个神经网络的参数时,通过最小化之前的代价函数,同时进行正则化,最终得到$ V_u^{(j)} $,$ V_m{(i)} $。同时可以使用这两个参数进行相似值的寻找。

我们可以使用之前提到的$ L2 $范数,进行计算找到类似的电影,这种方法可以提前计算,例如在用户访问之前提前在服务器上进行计算,当用户看完当前电影之后可以为用户提供推荐。

大型目录推荐

在我们为用户进行推荐的时候如果对每个项目都进行评估,需要的计算量一定是相当巨大的,因此可以通过先检索再评分的方式。

在进行检索时,可以选择根据用户最近看的$ 10 $个电影进行推荐类似的电影,或者选择用户最常看的三个分类中的$ Top 10 $,或者选择用户所在地区$ Top20 $的电影。最后将这些合在一起去除重复和看过的,合成一个列表给用户。

在进行排名时,将刚刚得到的列表放入训练模型中,将得到的内积作为评分,为用户形成一个排名表。

在检索中,虽然选择更多的项目数可以得到更好的表现,但是会降低推荐速度。为了分析/优化权衡,可以通过离线学习来查看检索更多项目是否会导致更相关的推荐(即,显示给用户的项目中$ p(y) = 1 $的概率更高)。

在线学习

对于一个连续变化的数据集,我们现在可以具有更好的处理方法,也就是将其中的样本仅使用一次,然后丢弃,不再使用固定的训练集。因为我们具有连续不断的数据集,因此可以随着用户的偏好进行随时的调整,这种方法也被称为在线学习。

于此对应,还有一种方法称为离线学习。

离线学习,类似于批量学习,每次训练一批数据,直至跑完整个样本,这个时候误差率可能不让你满意,把整个样本又做个上述操作,直至误差很小。离线学习是一个$ batch $训练完才更新权重,因此要求所有数据必须在每一个训练训练操作中$ batch $中都是可用的,这样不会因为个别数据的更新错误把网络带向极端。

简单的讲:

在线学习:一个样本训练完,直接更新权重。

离线学习:一个样本进入,跑完整个样本才更新权重。

主成分分析PCA

大多数时候我们选择的特征不仅仅是两三个,可能是$ 10,20,50,1000 $,这样的话,我们无法做到对人们展示一个二维或者三维的图像。因此我们需要讲这些大量的特征简化为两个或者三个,更好对用户展示,这种方法可以被称为$ PCA(principal components analysis) $即 主成分分析。

图中这种情况,我们有两个特征,一个是长度,一个是宽度,但是宽度几乎不变,但是长度变化很大,因此我们可以选择仅使用长度作为我们需要的特征。

但是在这个图中,车子的高度和长度都有很大的变化。因此,我们可以再加上一个轴$ z $,作为新的特征值,这样就可以使用一个特征代表之前的两个特征。

如果选择之前的$ x $轴作为新的$ z $轴,那么我们仍能在新的轴上得到很大的方差。

稍微进行一下调整,现在得到的$ z $轴上仅保留了很小的方差。

在进行一次调整,我们可以得到最大的方差,那么现在的$ z $轴就可以作为我们的主成分。

现在我们既然找到了主成分,可以讲原先两维的数据转换为一维,也就是改变基向量,将原先在$ x,y $坐标轴上斜长度为$ 1 $的向量作为新的坐标轴的基向量,也就是$ [0.71,0.71]^{T} $。接着将原先在$ x,y $上的坐标和基向量做内积,最终我们可以得到在新的轴上的新特征值$ 3.55 $。

现在我们已经得到了其中的一个基向量$ z_1 $,接着找的这个基向量的垂直向量$ z_2 $,如果是要形成一个三维的可视化图形的话,我们可以在加上一个向量$ z_3 $,垂直于前两个$ z_1,z_2 $。

似乎看起来$ PCA $和之前学到的线性回归很类似,但是实际上两者完全不一样,线性回归是最小化预测值和实际值之间基于$ y $轴的距离,但是$ PCA $则是最小化它们之间的垂直距离,或者说是增大他们分布的方差。

从直观上来看,显然我们投影的距离越短,那么两点的分布也就越远,同时也就更更好的代表原始的数据。

从数学推导上来看,参照:

主成分分析(PCA)原理总结 - 刘建平Pinard - 博客园

那么如何将新的坐标转换为原先的基向量下的坐标,需要将新的坐标乘上新的基向量,可以得到一个近似的估计。

$ PCA $还有别的应用在其他的方面,例如数据压缩,加速监督学习,但是现在几乎已经不用了,更多的还是用于可视化中。

Author

yzd

Posted on

2024-09-10

Updated on

2024-11-19

Licensed under