矩阵分解算法的求解 随机梯度下降SGD和交替最小二乘ALS

矩阵分解算法的求解 随机梯度下降SGD和最小二乘ALS

  • 1 优化时为何选择偏导数的负方向?
    • 1.1 使用泰勒展开进行解释
    • 1.2 使用图像进行解释
  • 2 随机梯度下降算法(Stochastic Gradient Descent, SGD)
  • 3 交替最小二乘算法(Alternating Least Squares, ALS)

1 优化时为何选择偏导数的负方向?

首先假设目标函数为 m i n f ( x ) min f(x) minf(x)
那么我们的关注点就是如何找到当前状态 x k x^k xk后的下一个状态点 x k + 1 x^{k+1} xk+1
x k + 1 = x k + t k ⋅ p k x^{k+1}=x^k+t_k\cdot p_k xk+1=xk+tkpk
其中, t k t_k tk表示步长, p k p_k pk表示方向

1.1 使用泰勒展开进行解释

依据泰勒展开式
f ( x ) = f ( a ) + f ′ ( a ) 1 ! ( x − a ) + f ′ ′ ( a ) 2 ! ( x − a ) 2 + ⋯ + f ( n ) ( a ) n ! ( x − a ) n + R n ( x ) f(x)=f(a)+\frac{f^{'}(a)}{1!}(x-a)+\frac{f^{''}(a)}{2!}(x-a)^2+\cdots+\frac{f^{(n)}(a)}{n!}(x-a)^n+R_n(x) f(x)=f(a)+1!f(a)(xa)+2!f(a)(xa)2++n!f(n)(a)(xa)n+Rn(x)
因此
f ( x k + t k p k ) = f ( x k ) + t k ⋅ ∇ f ( x k ) T ⋅ p k + o ( ∥ t k ⋅ p k ∥ ) f(x^k+t_kp_k)=f(x^k)+t^k\cdot \nabla f(x^k)^T\cdot p^k+o(\Vert t^k \cdot p^k \Vert) f(xk+tkpk)=f(xk)+tkf(xk)Tpk+o(tkpk)
于是
f ( x k ) − f ( x k + t k p k ) = − t k ⋅ ∇ f ( x k ) T ⋅ p k + o ( ∥ t k ⋅ p k ∥ ) f(x^k)-f(x^k+t_kp_k)=-t^k\cdot \nabla f(x^k)^T\cdot p^k+o(\Vert t^k \cdot p^k \Vert) f(xk)f(xk+tkpk)=tkf(xk)Tpk+o(tkpk)
由于 o ( ∥ t k ⋅ p k ∥ ) o(\Vert t^k \cdot p^k \Vert) o(tkpk)是高阶无穷小量,可以不考虑
若要使 f ( x k ) − f ( x k + t k p k ) f(x^k)-f(x^k+t_kp_k) f(xk)f(xk+tkpk)最大,即下降的最多,又因为 t k t^k tk是不变的参数,因此就要使
p k = − ∇ f ( x k ) T p^k=-\nabla f(x^k)^T pk=f(xk)T
即方向向量等于(偏)导数的负方向

1.2 使用图像进行解释

矩阵分解算法的求解 随机梯度下降SGD和交替最小二乘ALS_第1张图片
在适合的 t k t_k tk的情况下,x(k)点右侧的x(k+1)点可以使得函数值变小,那么如何找到x(k+1)点呢?答案是找f(x)在x(k)点处下降最快的方向,显然这个方向与f(x)在x(k)处的斜率有关系,但从图中可以看出 ∇ f ( x ( k ) ) \nabla f(x(k)) f(x(k))的方向是左上方,但显然我们需要的是到右下方去找下一个状态点。因此,方向向量等于(偏)导数的负方向。

2 随机梯度下降算法(Stochastic Gradient Descent, SGD)

SGD的思路就是让训练集中的每一条数据依次进入模型,不断优化变量。
要注意的是,因为是一条条进入模型,因此数据的顺序会对实验结果产生影响,
对于考虑时间因素的数据集,应按照时间顺序依次进入模型

以最基本的矩阵分解模型 r u i = q i T p u r_{ui}=q_i^Tp_u rui=qiTpu为例
损失函数可以定义为 J ( p u , q i ) = 1 2 ( ∑ ( r u i − q i T p u ) 2 + λ ( ∥ q i ∥ 2 + ∥ p u ∥ 2 ) ) J(p_u,q_i) =\frac{1}{2}\left( \sum (r_{ui}-q_i^Tp_u)^2 + \lambda(\Vert q_i \Vert^2 + \Vert p_u \Vert^2 ) \right) J(pu,qi)=21((ruiqiTpu)2+λ(qi2+pu2))
其中 λ \lambda λ是正则化系数,这里把对 p u p_u pu q i q_i qi的正则化系数设置为相同值,也可以为不同值,不使用括号即可
下面求损失函数对 p u p_u pu的偏导
∂ J ( p u ) ∂ p u = ( r u i − q i T p u ) ( − q i T ) + λ p u \frac{\partial J(p_u)}{\partial p_u} = (r_{ui}-q_i^Tp_u)(-q_i^T) + \lambda p_u puJ(pu)=(ruiqiTpu)(qiT)+λpu
常令
e u i = r u i − q i T p u e_{ui} = r_{ui}-q_i^Tp_u eui=ruiqiTpu
因此
p u = p u − η ⋅ ∂ J ( p u ) ∂ p u = p u + η ( e u i ⋅ q i − λ ⋅ p u ) p_u = p_u - \eta \cdot \frac{\partial J(p_u)}{\partial p_u}= p_u+\eta(e_{ui}\cdot q_i - \lambda \cdot p_u) pu=puηpuJ(pu)=pu+η(euiqiλpu)
其中, η \eta η表示学习速率
同理
q i = q i − η ⋅ ∂ J ( q i ) ∂ q i = q i + η ( e u i ⋅ p u − λ ⋅ q i ) q_i = q_i - \eta \cdot \frac{\partial J(q_i)}{\partial q_i}= q_i+\eta(e_{ui}\cdot p_u - \lambda \cdot q_i) qi=qiηqiJ(qi)=qi+η(euipuλqi)

3 交替最小二乘算法(Alternating Least Squares, ALS)

因为p和q两个变量未知,因此损失函数不是凸函数,无法使用凸优化求解。
但是,如果固定p,那么损失函数是只关于q的二次函数,用解二次函数方法。
因此,可固定p,求q;再固定q,求p,这样迭代下去,此即为交替一词出处。

∂ J ( p u ) ∂ p u = ( r u i − q i T p u ) ( − q i T ) + λ p u = ( q i T q i + λ ) p u − r u i q i T \frac{\partial J(p_u)}{\partial p_u} = (r_{ui}-q_i^Tp_u)(-q_i^T) + \lambda p_u=(q_i^T q_i + \lambda)p_u - r_{ui}q_i^T puJ(pu)=(ruiqiTpu)(qiT)+λpu=(qiTqi+λ)puruiqiT
下面令 ∂ J ( p u ) ∂ p u = 0 \frac{\partial J(p_u)}{\partial p_u}=0 puJ(pu)=0
写成矩阵形式
( Q Q T + λ E ) P = R j Q T (QQ^T+\lambda E)P=R_jQ^T (QQT+λE)P=RjQT
P = ( Q Q T + λ E ) − 1 R j P=(QQ^T+\lambda E)^{-1}R_j P=(QQT+λE)1Rj
同理
Q = ( P P T + λ E ) − 1 R i Q=(PP^T+\lambda E)^{-1}R_i Q=(PPT+λE)1Ri

你可能感兴趣的:(推荐系统)