推荐系统笔记:无任何限制的矩阵分解
Posted UQI-LIUWJ
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了推荐系统笔记:无任何限制的矩阵分解相关的知识,希望对你有一定的参考价值。
1 非稀疏矩阵的矩阵分解
假设我们有各个条目均有值的观测矩阵R,我们希望用低维矩阵U,V的乘积来近似它。目标方程如下:
2 稀疏矩阵的矩阵分解
我们用S记录所有有值的(i,j)点对
预测矩阵的每一个条目如下计算:
那么此时观测矩阵和预测矩阵每一个条目的差距为
此时,目标方程为(只考虑观测矩阵有数值的那些条目):
2.1 梯度下降解法
我们可以使用梯度下降来计算J的偏微分
我们把这些偏微分拼成一个向量,这个向量的维度是 mk+nk维,记这些偏微分组成的向量为
与此同时,我们记这些偏微分对应的U和V的条目组成的 mk+nk维向量维
于是我们有如下的更新方程:
梯度下降方式如下:
我们也可以直接用矩阵运算的方式来实现梯度下降
首先构造偏差矩阵(其中R中 没有数值的那些条目对应的E 为0)
然后我们可以用如下方式更新U,V矩阵
2.1.2 SGD
从上面我们不难发现,更新是评级矩阵中观察条目的误差的线性函数。
更新可以通过其他方式执行,将其分解为与单个观察到的条目(而不是所有条目)中的错误相关联的更小的组件。
换言之,每一次更新我不是要看到所有S中的(i,j),然后再更新;我看到一个(i,j),就利用它所蕴涵的信息进行更新
我们可以在R中一次随机观察到一个条目,并只更新因子矩阵中相关的2·k项,而不是全部(m·k + n·k)项
记表示u的第i行,那么我们有:
在实际应用中,SGD的收敛速度比2.1中的方法快,但2.1中的方法 收敛趋势更平稳。
这是因为在后一种情况下,U和V的条目是同时更新的,使用的是所有观察到的条目,而不是单个随机选择的观察到的条目。
这种随机梯度下降的噪声近似有时会影响解的质量和收敛的平滑性。一般情况下,当数据量非常大且计算时间是主要瓶颈时,采用随机梯度下降法SGD更好。
在其他“折衷”方法中,使用了小批量(mini-batch——,其中使用观察到的条目的子集来构造更新。它在解决方案质量和计算效率之间提供了权衡。
3 初始化
另一个问题是如何初始化。例如,可以将矩阵的每一项初始化为(−1,1)中的小数字。
然而,初始化的选择会影响最终解决方案的质量。
可以使用一些启发式方法来提高质量。例如,可以使用一些简单的基于svd的启发式方法来创建一个近似的初始化。 (这个会在基于SVD的推荐系统中介绍)
4 正则化
当评级矩阵R是稀疏的且观测到的条目相对较少时,另一种问题出现了。
在这种情况下,打分数据会很少,这会导致过拟合。(当训练数据有限时,过拟合也是分类中常见的问题。)
解决这个问题的一种常见方法是使用正则化。正则化减少了模型过度拟合的趋势,代价是在模型中引入了一定的偏差。
正则化的思想是不让U和V中的系数值太大,以促进模型稳定性。
于是在之前目标函数的基础上,新增了这一个正则项
这是一种标准的方法,在许多形式的分类和回归中都使用了它。参数λ一般是非负的,它控制正则化项的权值
还是和之前一样,于是正则化的目标函数可以写成
同样可以采用梯度下降进行优化
用矩阵形式可以写成(E也是有观测数值的地方有值,没有观测数值的地方为0)
可以发现这时候U和V的系数 1-αλ 在每一步缩小了 U和V的参数,这就是正则化的作用
同样地,也可以采用 SGD进行优化:
用向量形式表示,则有:
5 增量潜在成分训练 Incremental Latent Component Training
一种变体是增量地训练潜在成分
我们首先用SGD训练所有q=1时候的,(也就是U的第一列和V的第一列),不断迭代直至收敛
等和 收敛完成后 ,我们计算这两个向量相乘得到的矩阵
然后我们更新观测矩阵R’=R-,之后对q=2做同样的操作
如此往复,直到q=k
然后我们将这k个求出来的矩阵相加,就是我们用增量潜在成分训练得到的预测矩阵
得到的方法提供了所需的矩阵分解,因为总的秩k分解可以表示为k个秩1分解的和:
由于一次优化的变量较少,这种方法可以使收敛速度更快、更稳定
6 交替最小二乘
SGD是一种有效的优化方法。另一方面,它对初始化和选择步长的方式都相当敏感。其他优化方法包括使用交替最小二乘(ALS),它通常更稳定
ALS的思路如下:
(1)固定U,我们通过将这个问题作为一个最小二乘回归问题来求解V的每n行。
比如我们想求解V的第j行,那我们就希望去最小化这是一个的一个最小二乘问题,其中所有的我们目前视为定值常量
于是V中的条目都可以使用最小二乘法来进行求解
由于不同条目之间的最小二乘问题是互相独立的,因此可以并行计算
(2)同样的方法,固定V,求解U
迭代(1)(2)两步,直至收敛
7 使用用户和条目偏差
一种无约束MF的变体能够了解用户和商品偏好。
为了讨论的目的,假设评级矩阵是以均值0为中心的,预处理步骤是从所有条目中减去整个评级矩阵的整体平均μ。利用潜因子模型预测条目后,将μ值加回预测值作为后处理步骤。
因此,在本小节中,我们将简单地假设评级矩阵R已经以这种方式居中,忽略预处理和后处理步骤。
与每个用户i相关联,我们有一个变量oi,它表示用户对商品评级的一般偏差。例如,如果用户i是一个慷慨的人,他倾向于给所有的物品打分,那么变量oi将是一个正的量。另一方面,对于一个坏脾气的人来说,oi的值是负的,因为他对大多数项目的评价都是负面的。
同样,变量pj表示项目j评级的偏差。高度喜欢的项目(如票房大片)的pj值往往更大(正),而几乎所有人都不喜欢的项目的pj值则为负值。
这里所说的模型的工作是以数据驱动的方式来学习oi和pj的值。
和原始MF的主要不同是,预测矩阵的第(i, j)个条目的一部分由oi + pj组成,另一部分由潜在因素矩阵乘积的第(i, j)个条目组成。因此,条目(i, j)的评分预测值由下式给出:
于是误差项可以写成
于是整体的目标函数可以改写成
结果表明,这个问题与无约束矩阵分解的区别只是很小的程度。
我们可以增加因子矩阵的大小来合并这些偏差变量,而不是对用户和商品使用单独的偏差变量oi和pj。
我们需要为每个因子矩阵U和V增加两列,以创建大小分别为m × (k + 2)和n × (k + 2)的更大的因子矩阵。
每个因子矩阵的后两列是特殊的,因为它们对应于偏置分量。具体地说,我们有
这样的话,我们进行的时候就会得到
于是我们修改后的目标方程可以写成:
由于问题表述方式的微小变化,只需对梯度下降法进行相应的微小改变。(只是V的第k+1列,U的第k+2列必须永远为1,不进行更新)
7.1 有效的原因
一个自然的问题是,为什么这种方法比无约束矩阵分解执行得更好。
在因子矩阵的最后两列上添加约束只会降低全局解的质量,因为现在是在更小的解空间上寻找最优解。
然而,在许多情况下,添加这些约束会使解决方案产生偏差,同时减少过拟合。
换句话说,这种直观约束的添加通常可以提高学习算法对不可见条目的通用性,即使某些观测条目的误差可能更高。
当用户或项目观察到的评级数量很少时,这特别有用。偏见变量为评级添加了一个组件,它对用户或项目都是全局的。当可用的数据有限时,这种全局属性非常有用。
作为一个具体的例子,考虑这样一种情况:用户仅为少量的项目(1或2)提供评级。在这种情况下,许多推荐算法,如基于邻居的方法,都不能为用户提供可靠的预测。另一方面,项目偏差变量的(非个性化)预测将能够给出合理的预测。毕竟,如果一部特定的电影在全球范围内是票房大片,那么相关用户也更有可能欣赏它。偏差变量也将反映这一事实,并将其纳入学习算法。
7.2 只使用用户和项目偏差
事实上,已经证明只使用偏差变量(即k = 0)通常可以提供相当好的评级预测。
这意味着很大一部分评级可以用用户打分的慷慨程度和物品的受欢迎程度来解释,而不是用户对物品的任何特定的个性化偏好。
因此,只有用户和物品的偏差被学习,并且通过将用户i和物品j的偏差相加,可以预测出(i,j)条目的baseline评级。
可以使用这样的baseline评级来辅助任何现成的协同过滤模型。在应用协作过滤之前,可以简单地从评级矩阵的第(i, j)个有数值条目中减去相应的Bij。这些值在后处理阶段被添加回预测值。减去之后的评级矩阵就只是用户对于特定商品的个性化评价了。
以上是关于推荐系统笔记:无任何限制的矩阵分解的主要内容,如果未能解决你的问题,请参考以下文章