Batch gradient descent
使用整个训练集来优化权重,意思是用训练集中的所有样本的loss来更新模型的权重。此时,权重的梯度为:
可以看出权重的梯度是每个每个样本的梯度的期望。
此时的更新过程为:
如果样本的个数的是10000, 100000个的时候,需要先遍历所有的样本在对权重$W$更新,这个是非常耗时的。因此有人提出了SGD
Stochastic gradient descent
相比与batch gradient descent方法, SGD不适用全部的样本来估计权重的梯度,而是使用的一小部分的样本。主要的原因是一小部分的样本的梯度均值可以近似真实的梯度,而这部分样本的数量越多,估计的梯度越近似真实的梯度。另一方面,用小部分样本来估计的梯度是带有噪声的,在一定程度也起到了正则化的作用。
此时的梯度为:
此时的更新过程为:
实际过程中,每次选取一部分的样本来估计梯度,并进行更新,这部分被叫做一个迭代;如果一整个的训练集都使用一次,就叫经过了一个 epoch。注意,每个epoch,样本都要被打散。
SGD+Momentum
SGD方法存在这一个“震荡”的问题,如下图:
可以看到在更新的过程中,梯度下降的迭方向会偏离实际中真正的下降方向。momentum就是为了克服
这个震荡的问题。
动量可以看作是迭代过程中下降方向,震荡的方向被消除了,使得权重更新的方向变得一致。
Adagrad
梯度下降中存在一个问题,如果使用相同的学习率,对于权重W中每一个元素$W_i$,如果他们的梯度值有较大的差别的时候,会导致权重在梯度值较小的维度上迭代过慢。Adagrad方法根据权重在每个维度上梯度值的大小来调整各个维度上的学习率,来避免统一学习率难以适应所有维度的问题。
Adagrad存在一个问题,有与$s_t$一致累加着梯度按元素平方的和,因此如果权重的某个元素的偏导数一直较大,会使得学习率下降较快;反之,如果某个元素的偏导数一直较小,学习率则会下降较慢。所以Adagrad在后期的时候,比较难找到一个合适的解。
RMSprop
由于Adagrad存在后期学习率低的问题,RMSprop对其做了一点小小的改动:
RMSprop对这些梯度的平方做指数加权移动平均,使得每个权重的学习率不会一直降低或者不变。
可以消除梯度下降过程中的摆动,包括mini-batch,允许使用更大的$\alpha$,加快算法学习速度
Adadelta
Adadelta也针对Adagrad做了改进,同样的,Adadelta也是了梯度平方的加权移动平均。但是它与RMSprop不同的是Adadelta还维护了一个额外的状态变量$\Delta W_t$ 来计算自变量的变化值:
然后更新权重:
最后使用$\Delta W_t$来记录权重变化量的指数加权移动平均:
Adam
Adam算法是将momentum和RMSprop结合起来
$\beta_1$常用为0.9,$\beta_2$常用为0.999,而$\epsilon$为10^-8。Adam还对动量项和 梯度平方项做了偏差修正,然后使用修正后的变量对权重进行更新。