隐语义模型 LFM 推导

文章目录

    • 算法应用场景
    • 问题分析
    • 算法推导
      • 推导损失函数
      • 求解损失函数
        • 梯度下降法
        • 交替最小二乘法
    • 开源库

算法应用场景

在推荐系统中,要根据用户的历史行为(点击、收藏、评分等),挖掘用户感兴趣的物品进行推荐(一般用作推荐系统里面的召回算法,来召回候选集)。这个问题就可以转换成:给定 用户-物品 的评分矩阵(稀疏矩阵),根据评分矩阵里面已有的评分,预测评分矩阵里面空缺的评分,然后对于每个用户,为其对应的物品向量的评分进行排序找出 Top-N,即可完成推荐。

问题分析

这里的中心问题是:如何根据 用户-物品 评分矩阵里面的非空值,预测出该矩阵里面空缺位置应该填的值?我们可以进行矩阵分解,将 user-item 矩阵分解成 2 个矩阵相乘的形式,那么这两个矩阵怎么表示呢?假设要将 user-item 矩阵 ( m ∗ n ) (m*n) (mn) 分解成 P ( m ∗ k ) P(m*k) P(mk) Q ( k ∗ n ) Q(k*n) Q(kn)矩阵,根据矩阵相乘的性质, m ∗ n = ( m ∗ k ) ∗ ( k ∗ n ) m*n = (m*k) * (k*n) mn=(mk)(kn),所以这里的问题转化为求出 矩阵 P P P Q Q Q,求出了 P P P Q Q Q 之后, P ∗ Q P*Q PQ 就可以将 user-item 矩阵空缺的地方填满,即得到未知的用户-物品对的预测评分

算法推导

推导损失函数

设 user-item 矩阵为 R R R,用户特征矩阵为 P P P,物品特征矩阵为 Q Q Q
R ^ = P ∗ Q \hat{R} = P*Q R^=PQ
要计算的损失就是 user-item 矩阵里面的预测评分已知评分的偏离程度,故损失函数用平方损失函数 ( u , i ) (u,i) (u,i) 是已知的 user-item 对
l o s s = ∑ ( u , i ) ∈ R ( R u i − R u i ^ ) 2 loss = \sum_{(u,i)\in{R}}(R_{ui} - \hat{R_{ui}})^2 loss=(u,i)R(RuiRui^)2
加入正则项
l o s s = ∑ ( u , i ) ∈ R ( R u i − P u T ∗ Q i ) 2 + λ ∑ u ∣ ∣ P u ∣ ∣ 2 + λ ∑ i ∣ ∣ Q i ∣ ∣ 2 loss = \sum_{(u,i)\in{R}}(R_{ui} - P^T_u*Q_i)^2 + \lambda\sum_u||P_u||^2 + \lambda \sum_i||Q_i||^2 loss=(u,i)R(RuiPuTQi)2+λuPu2+λiQi2
这里 P u P_u Pu ( 1 ∗ k ) (1*k) (1k)维, Q i Q_i Qi ( 1 ∗ k ) (1*k) (1k)维,代表 用户u物品i 对应的 k k k 个隐因子组成的向量,由于隐因子的数量越多,模型越复杂,为减少过拟合,加入 L2 正则项


求解损失函数

梯度下降法

到这里其实就可以用梯度下降法来求解损失函数取得最小值时对应的参数矩阵了,当然不是一下子得到整个矩阵,是逐行求解在拼接即可, 故可以化简损失函数,以求 ∂ l o s s ∂ P u \frac{\partial{loss}}{\partial{P_u}} Puloss 为例,此时 Q i Q_i Qi 可以看成常量
l o s s = ∑ ( u , i ) ∈ R ( R u i − P u T ∗ Q i ) 2 + λ ∑ u ∣ ∣ P u ∣ ∣ 2 + λ ∑ i ∣ ∣ Q i ∣ ∣ 2 = ∑ u ( ∑ i ( R u i − P u T ∗ Q i ) 2 + λ ∣ ∣ P u ∣ ∣ 2 ) \begin{aligned} loss &= \sum_{(u,i)\in{R}}(R_{ui} - P^T_u*Q_i)^2 + \lambda\sum_u||P_u||^2 + \lambda \sum_i||Q_i||^2\\ &=\sum_u \Big(\sum_i(R_{ui} - P^T_u*Q_i)^2 +\lambda||P_u||^2 \Big) \end{aligned} loss=(u,i)R(RuiPuTQi)2+λuPu2+λiQi2=u(i(RuiPuTQi)2+λPu2)
此时就相当于,对于每个物品,求出对应的用户评分向量了,所以遍历每一个物品,得到的用户评分向量拼接起来,就是 Q Q Q,求 P P P 同理。


L ( P u ) = ∑ i ( R u i − P u T ∗ Q i ) 2 + λ ∣ ∣ P u ∣ ∣ 2 L ( Q i ) = ∑ u ( R u i − P u T ∗ Q i ) 2 + λ ∣ ∣ P u ∣ ∣ 2 L(P_u) = \sum_i(R_{ui} - P^T_u*Q_i)^2 +\lambda||P_u||^2\\ L(Q_i) = \sum_u(R_{ui} - P^T_u*Q_i)^2 +\lambda||P_u||^2 L(Pu)=i(RuiPuTQi)2+λPu2L(Qi)=u(RuiPuTQi)2+λPu2

计算梯度
∂ L ∂ P u = 2 ∑ i ( R u i − P u T ∗ Q i ) ∗ ( − Q i ) + 2 λ P u ∂ L ∂ Q i = 2 ∑ u ( R u i − P u T ∗ Q i ) ∗ ( − P u ) + 2 λ Q i \frac{\partial{L}}{\partial{P_u}} = 2\sum_i(R_{ui} - P^T_{u}*Q_i)*(-Q_i) + 2\lambda P_u \\ \frac{\partial{L}}{\partial{Q_i}} = 2\sum_u(R_{ui} - P^T_{u}*Q_i)*(-P_u) + 2\lambda Q_i PuL=2i(RuiPuTQi)(Qi)+2λPuQiL=2u(RuiPuTQi)(Pu)+2λQi
每次迭代
P u = P u − η ∂ l o s s ∂ P u Q i = Q i − η ∂ l o s s ∂ Q i P_u = P_u - \eta\frac{\partial{loss}}{\partial{P_u}}\\ Q_i = Q_i - \eta\frac{\partial{loss}}{\partial{Q_i}} Pu=PuηPulossQi=QiηQiloss
直到 loss 达到阈值,或者达到最大迭代次数,此时的 P u P_u Pu Q i Q_i Qi

交替最小二乘法

先回顾一下线性回归模型里面求解损失函数的最小二乘法,本质上就是令损失函数的偏导等于0,求出对应的参数


回顾最小二乘法求解线性回归
令要求解的回归方程表达式为: y = w T x + b y = w^Tx + b y=wTx+b
损失函数: J ( w , b ) = ∑ i = 1 m ( y i − w T x i − b ) 2 J(w,b) = \sum_{i=1}^m(y_i - w^Tx_i - b)^2 J(w,b)=i=1m(yiwTxib)2,m为样本个数
这里以 ∂ J ( w , b ) ∂ b = 0 \frac{\partial{J(w, b)}}{\partial{b}} = 0 bJ(w,b)=0 求解 b b b 为例

∂ J ( w , b ) ∂ b = ∑ i = 1 m 2 ( y i − w T x i − b ) = 0 \frac{\partial{J(w, b)}}{\partial{b}} = \sum^m_{i=1}2(y_i-w^Tx_i - b) =0 bJ(w,b)=i=1m2(yiwTxib)=0

∑ i = 1 m y i − w T ∑ i = 1 m x i − ∑ i = 1 m b = 0 \sum^m_{i=1}y_i-w^T\sum^m_{i=1}x_i-\sum^m_{i=1}b = 0 i=1myiwTi=1mxii=1mb=0

m b = ∑ i = 1 m y i − w T ∑ i = 1 m x i mb = \sum^m_{i=1}y_i-w^T\sum^m_{i=1}x_i mb=i=1myiwTi=1mxi

解得: b = y ‾ − w T x ˉ b = \overline{y} - w^T\bar{x} b=ywTxˉ


那么交替最小二乘法呢?

对于损失函数
l o s s = ∑ ( u , i ) ∈ R ( R u i − P u T ∗ Q i ) 2 + λ ∑ u ∣ ∣ P u ∣ ∣ 2 + λ ∑ i ∣ ∣ Q i ∣ ∣ 2 loss = \sum_{(u,i)\in{R}}(R_{ui} - P^T_u*Q_i)^2 + \lambda\sum_u||P_u||^2 + \lambda \sum_i||Q_i||^2 loss=(u,i)R(RuiPuTQi)2+λuPu2+λiQi2
P u P_u Pu Q i Q_i Qi 是通过矩阵乘法耦合在一起的,我们可以先以 P u P_u Pu 为常量,求解 Q i Q_i Qi,在以 Q i Q_i Qi 为常量,求解 P u P_u Pu,如此反复,知道达到迭代次数上限,或 loss 小于阈值。

这里以固定 Q i Q_i Qi P u P_u Pu 为例,进行推导
l o s s = ∑ ( u , i ) ∈ R ( R u i − P u T ∗ Q i ) 2 + λ ∑ u ∣ ∣ P u ∣ ∣ 2 + λ ∑ i ∣ ∣ Q i ∣ ∣ 2 = ∑ u ( ∑ i ( R u i − P u T ∗ Q i ) 2 + λ ∣ ∣ P u ∣ ∣ 2 ) \begin{aligned} loss &= \sum_{(u,i)\in{R}}(R_{ui} - P^T_u*Q_i)^2 + \lambda\sum_u||P_u||^2 + \lambda \sum_i||Q_i||^2\\ &=\sum_u \Big(\sum_i(R_{ui} - P^T_u*Q_i)^2 +\lambda||P_u||^2 \Big) \end{aligned} loss=(u,i)R(RuiPuTQi)2+λuPu2+λiQi2=u(i(RuiPuTQi)2+λPu2)
L ( P u ) = ∑ i ( R u i − P u T ∗ Q i ) 2 + λ ∣ ∣ P u ∣ ∣ 2 L(P_u) = \sum_i(R_{ui} - P^T_u*Q_i)^2 +\lambda||P_u||^2 L(Pu)=i(RuiPuTQi)2+λPu2

求偏导,令其=0:

∂ L ∂ P u = 2 ∑ i ( R u i − P u T ∗ Q i ) ∗ ( − Q i ) + 2 λ P u = 0 \frac{\partial{L}}{\partial{P_u}} = 2\sum_i(R_{ui} - P^T_{u}*Q_i)*(-Q_i) + 2\lambda P_u=0 PuL=2i(RuiPuTQi)(Qi)+2λPu=0

∑ i P u T Q i Q i − ∑ i R u i Q i + λ P u = 0 \sum_iP^T_uQ_iQ_i - \sum_iR_{ui}Q_i + \lambda P_u =0 iPuTQiQiiRuiQi+λPu=0

P u T Q i = Q i T P u P_u^TQ_i = Q_i^TP_u PuTQi=QiTPu ( A T B = ( B T A ) T ) (A^TB = (B^TA)^T) (ATB=(BTA)T)

∑ i P u T Q i Q i − ∑ i R u i Q i + λ P u = ∑ i Q i T P u Q i − ∑ i R u i Q i + λ P u = 0 \sum_iP^T_uQ_iQ_i - \sum_iR_{ui}Q_i + \lambda P_u\\=\sum_iQ_i^TP_uQ_i - \sum_iR_{ui}Q_i + \lambda P_u=0 iPuTQiQiiRuiQi+λPu=iQiTPuQiiRuiQi+λPu=0

( ∑ i Q i T Q i + λ E ) P u = ∑ i R u i Q i (\sum_iQ_i^TQ_i + \lambda E)P_u=\sum_iR_{ui}Q_i (iQiTQi+λE)Pu=iRuiQi

( Q T Q + λ E ) P u = R u Q i (Q^TQ+ \lambda E)P_u=R_{u}Q_i (QTQ+λE)Pu=RuQi
最终得到:
P u = ( Q i Q i T + λ E ) − 1 R u Q P_u = (Q_iQ_i^T+\lambda E)^{-1}R_uQ Pu=(QiQiT+λE)1RuQ
同理得:
Q i = ( P P T + λ E ) − 1 P R i Q_i = (PP^T+\lambda E)^{-1}PR_i Qi=(PPT+λE)1PRi


开源库

implicit
pyspark.mllib.recommendation.ALS



这篇真的码了很久,累死了。。

笔记:
隐语义模型 LFM 推导_第1张图片

你可能感兴趣的:(机器学习算法,推荐系统)