...
矩阵分解算法的求解 随机梯度下降SGD和最小二乘ALS
优化时为何选择偏导数的负方向?
首先假设目标函数为minf(x)
那么我们的关注点就是如何找到当前状态xk后的下一个状态点xk+1
xk+1=xk+tk⋅pk
其中,tk表示步长,pk表示方向
依据泰勒展开式
f(x)=f(a)+1!f′(a)(x−a)+2!f′′(a)(x−a)2+⋯+n!f(n)(a)(x−a)n+Rn(x)
因此
f(xk+tkpk)=f(xk)+tk⋅∇f(xk)T⋅pk+o(∥tk⋅pk∥)
于是
f(xk)−f(xk+tkpk)=−tk⋅∇f(xk)T⋅pk+o(∥tk⋅pk∥)
由于o(∥tk⋅pk∥)是高阶无穷小量,可以不考虑
若要使f(xk)−f(xk+tkpk)最大,即下降的最多,又因为tk是不变的参数,因此就要使
pk=−∇f(xk)T
即方向向量等于(偏)导数的负方向
随机梯度下降算法(Stochastic Gradient Descent, SGD)
SGD的思路就是让训练集中的每一条数据依次进入模型,不断优化变量。
要注意的是,因为是一条条进入模型,因此数据的顺序会对实验结果产生影响,
对于考虑时间因素的数据集,应按照时间顺序依次进入模型
以最基本的矩阵分解模型rui=qiTpu为例
损失函数可以定义为J(pu,qi)=21(∑(rui−qiTpu)2+λ(∥qi∥2+∥pu∥2))
其中λ是正则化系数,这里把对pu和qi的正则化系数设置为相同值,也可以为不同值,不使用括号即可
下面求损失函数对pu的偏导
∂pu∂J(pu)=(rui−qiTpu)(−qiT)+λpu
常令
eui=rui−qiTpu
因此
pu=pu−η⋅∂pu∂J(pu)=pu+η(eui⋅qi−λ⋅pu)
其中,η表示学习速率
同理
qi=qi−η⋅∂qi∂J(qi)=qi+η(eui⋅pu−λ⋅qi)
交替最小二乘算法(Alternating Least Squares, ALS)
因为p和q两个变量未知,因此损失函数不是凸函数,无法使用凸优化求解。
但是,如果固定p,那么损失函数是只关于q的二次函数,用解二次函数方法。
因此,可固定p,求q;再固定q,求p,这样迭代下去,此即为交替一词出处。
∂pu∂J(pu)=(rui−qiTpu)(−qiT)+λpu=(qiTqi+λ)pu−ruiqiT
下面令∂pu∂J(pu)=0
写成矩阵形式
(QQT+λE)P=RjQT
P=(QQT+λE)−1Rj
同理
Q=(PPT+λE)−1Ri