基于模型的推荐器所做的基本假设是,在我们试图预测的用户和商品的交互之间存在一些潜在的低维结构。换句话说,基于模型的推荐系统本质上是一种降维的方法。
简单来说,我们假设用户的意见,或者他们消费的物品的属性,可以被有效地总结为一些低维度的向量。你喜欢动作片吗?你喜欢高预算、特定演员或长时间运行的电影吗? 基于模型的推荐的目标是找到这些问题的答案。
这似乎是一个困难的过程:我们不知道如何提取这些重要特征(即,我们不知道哪些电影是动作电影,哪些电影时间比较长)。但令人惊讶的是,没有它们,人们仍然可以发现有关这些特征的潜在的维度。作为示例,考虑如下所示的交互(例如点击)数据:
根据矩阵分解原理:
(5.2) 分解以后变成:
左边 是用户向量 用来表示用户1的特征; 右边 是商品向量, 用来表示商品1的特征。
我们分解矩阵的目的是,可以用更加低维的形式表示他们。 而且, 我们找到物品和用户之间的关系会很简单, 就是他们之间的点积。
我们利用 K维 这个隐向量来表示用户,用 表示物品。 但其实我们无法解释向量中每个元素的具体含义, 因为他们来自于纯粹的数学运算 (矩阵分解)。 不过在实际使用中, 他们真的很好用。
PS:人类的认知只能处理日常生活中遇到的特征, 无法理解的特征其实是大多数。
与奇异值分解( Singular Value Decomposition)的关系
我们讨论的矩阵分解,其实和 奇异值分解(SVD), 在 SVD 中 一个矩阵可以被分解成:
和 是矩阵 的左右奇异值( 和 的特征向量), 是一个对角矩阵。
重要的是,我们可以通过取 , 和 中的前 个特征向量/特征值(EckartYoung 定理)来找到描述 的最佳 值(就 MSE 而言)。虽然这似乎为我们提供了在方程(5.5)中选择最佳可能 和 的方法,但奇异值分解必须针对一个完整的矩阵(包括左右观察到的值)。 而不是像 R 中那样, 可以观察到部分的相互作用。即使这个问题可以解决(例如,通过缺失值的数据插补策略),但是在规模为数百万行和列的矩阵上计算 SVD 是不切实际的。因此,在实践中,我们不会计算特征向量和特征值,而是采用基于梯度的方法(如下所述)。然而,与 SVD 的联系为我们提供了关于 和 可能对应的因子类型的提示。
Fit Latent Factor Model 训练 LFM 模型
这里我们开始讨论如何训练我们的 Factor 模型。 所谓训练模型, 其实就是让和 尽可能好的去拟合用户和物品的交互数据, 让loss 值尽可能的小,也就是是均方误差(Mean Squared Error):
其中, 这就是我们要寻找的函数, 是真实值。 正如上面讨论 SVD 时提到的,我们使用基于梯度下降来求解。
User and item biases
在介绍如何用梯度下降求解之前, 我们先介绍一些可以提高模型效果的方法。 尽管 看上去比较简单, 但是他缺少 regularizer 项, 我们可以给他们添加一个 regularizer :
我们可以用 来调节这个惩罚项, 当 变大的时候 , 会趋向于 0, 对应的他们的乘积 也会趋向于0 , 整个系统得到的结果就会倾向于 underpredict。
为了解决这个问题, 我们有很多办法, 其中一个就是从数据中去除均值。我们可以把 公式 (5.5) 改写成 (依然保持regularizer 的情况下) :
这种做法很像 linear regression 中, 我们使用的 bias 项,在下面, 我们都称之为 bias。
进一步的, 我们希望能够更加精确的单独去除 User 和 Item 的均值,我们可以在添加两个变量 , 得到
在加入这些 bias 以后,尤其是 , , 在我们的模型中 就会多出来 和 项。 是否需要对他们进行 regulaze , 目前还有争议。 一方面, 它们本事就是截距项, 一般不需要进行 regulaze ; 另外一方面,如果不对他们 regulaze , 有可能导致 overfitting。 在目前的实践中, 我们可以简单的把他们纳入regularizer
利用上面的式子做 regularizer 的时候, 统一用 作为 的系数, 来调节惩罚强度。
也可以对 和 进行单独惩罚:
Gradient update equations 利用 Gradient 求解
针对方差 (5.10) [] , 我们希望 minimize 的目标 (基于用户和物品的交互 ) :
对 obj 的内容分布求偏导,可以得到如下等式:
对于未列出来的 , 和上面 , 类似。
作者这里突然开始用 , 我觉得其实就是 , 因为有k 个隐变量。 感觉作者在细节上不是很注意, 书写的有些跳跃。
关于使用梯度下降(gradient descent) 要注意的地方:
这里要求解的目标比较复杂, 需要注意一些细节:
等式 (5.14) 不是凸函数, 有很多局部最优点。但是算法设计的比较好, 它是比较容易到达全局最优点的。
如果 和 被初始化为相同的值,那么就会导致他们的梯度一致,进入 'lock step' 状态。 这个问题通常可以通过随机初始化解决。
使用 SGD (stochastic gradient descent ) 或者 (alternating least squares) 比计算 full gradient 更快, 也更加节省内存。 (1. Large-scale machine learning with stochastic gradient descent. 2010), (2. Scalable coordinate
descent approaches to parallel matrix factorization for recommender systems. 2012)
发生了什么?
考虑一下,在第 2 章中的回归模型和我们上面开发的基于模型的推荐系统之间,我们已经从完全依赖特征的模型转变为完全避免特征的模型。
对刚开始接触推荐系统的同学来说, 这有点让人吃惊:显然,这样一部电影的预算或类型的特征应该可以预测用户对它的偏好。然而,如果一个特征是可预测的,它就会被 或 捕获。它们会用低维向量最大可能的包含各种特征的信息,而无需显式测量该特征。因此,有人可能会说,如果我们观察到足够多的交互, 或 将捕获任何有用的用户和项目特征。
我们将在后面的章节中重新讨论这个论点,并探索各种例外情况,例如如果我们没有足够的交互数据(例如对于新用户或项目,如第 6.2 节),我们该怎么办,或者如果用户偏好或项目属性随着时间的推移而不稳定,我们应该怎么做(第 7 章)。