UFLDL new version:随机梯度下降优化方法
LBFGS等批量优化方法每次对参数更新需要计算所有的数据,通常也能够收敛到较好的局部最优值,但由于计算代价太大,且不利于新数据的在线学习,诞生了每次更新只采用部分数据的随机梯度下降算法(SGD)。
理论
标准梯度下降算法公式
θ=θ−α∇θE[J(θ)]
公式中期望通过整个数据集合的损失函数和梯度逼近得到,SGD对期望的逼近则只依赖部分数据
θ=θ−α∇θJ(θ,x(i),y(i))
通常,相对于单个数据来说,SGD利用部分数据(minibatch),一方面可以减小参数更新时,数据的方差,收敛更快。另一方面,使得计算可以利用矩阵快速计算的优点。Minibatch的大小可以选256个,具体值根据应用选择。
SGD利用的数据方差比batch gradient descent的大,因此学习速率 通常比batch的小。合适的 选择比较困难,实际中,在参数迭代的第一个或第二个epoch, 保持常数不变,然后随着收敛速度的减慢,将 减半。更好的方法是,每次迭代,判断损失函数是否小于某个阈值,然后减小 。另外一种常用的方法是按照公式ab+t进行改变学习速率,t表示迭代次数(该句引文的意思不是很理解)。也可以选择路径跟踪的复杂的方法。
关于SDG另外一点值得注意的是训练数据应该是随机的,否则收敛很差。
冲量
如果目标函数是一个很长的浅沟壑的话,SGD可能沿负梯度方向在沟壑里来回振荡,无法到达最优点,深度网络目标函数正式这种形式。冲量这种方法就是使目标函数在沟壑里能够更快的前进。公式如下:
ν=γν+α∇θJ(θ,x(i),y(i))
θ=θ−ν
ν 代表速率向量,由于梯度比常规方法更大,α 需要更小。 γ∈(0,1],该参数确定上一次梯度对当前更新的贡献率,通常,在初始学习稳定之前,取0.5,之后取0.9或更大。