梯度下降法及优化算法
内容目录
1 梯度下降法(Gradient Descent)1.1 批量梯度下降法(Batch Gradient Descent)1.2 随机梯度下降法(Stochastic Gradient Descent)1.3 mini-batch 梯度下降法(Mini-Batch Gradient Descent)1.4 存在的问题2 梯度下降优化算法2.1 Momentun动量梯度下降法2.2 Nesterov accelerated gradient(NAG)2.3 自适应学习率算法(Adagrad)2.4 均方根传递算法(Root Mean Square prop,RMSprop)2.5 自适应增量算法(Adadelta)2.6 适应性矩估计算法(Adam)
1 梯度下降法(Gradient Descent)
梯度下降法是最流行的优化算法,假设我们的目标函数为
,其梯度为
,梯度下降就是沿着目标函数梯度的反方向进行更新参数,不断最小化目标函数,学习速率决定了每次更新的步长。
1.1 批量梯度下降法(Batch Gradient Descent)
批量梯度下降法就是利用全部训练数据对目标函数进行优化,由于是每轮都要计算所有数据,如果整个数据集是500万或者5000万个,那么每次梯度下降都要计算这么多的数据,因此计算过程会很慢,而且比较占内存,但批量梯度下降可以收敛到盆地的极小值。
Python代码:
代码语言:javascript复制for i in range(nb_epochs):
params_grad = evaluate_gradient(loss_function, data, params)
Params = params - learning_rate * params_grad
1.2 随机梯度下降法(Stochastic Gradient Descent)
随机梯度下降法是以一个训练样本进行参数更新,可以避免批量梯度下降法在大数据集产生的冗余计算问题(每次梯度下降都要对相似的样本进行重复计算),随机梯度下降法更容易跳出局部最优但很可能会一直在局部最优之间,很难收敛到确切的极小值。
Python代码:
代码语言:javascript复制for i in range(nb_epochs):
np.random.shuffle(data)
for example in data:
params_grad = evaluate_gradient(loss_function, example, params)
params = params - learning_rate * params_grad
1.3 mini-batch 梯度下降法(Mini-Batch Gradient Descent)
Mini-batch梯度下降法利用小批量训练数据进行梯度更新,比如64、128、512、1000等,相对500万个数据里的mini部分,既可以减少参数更新的方差,又可以更加高效的计算小批量的梯度,注意通常训练神经网络都是采用mini-batch梯度下降法,也会称之为随机梯度下降(SGD)。
Python代码:
代码语言:javascript复制for i in range(nb_epochs):
np.random.shuffle(data)
for batch in get_batches(data, batch_sizes=50):
params_grad = evaluate_gradient(loss_function, batch, params)
Params = params - learning_rate * params_grad
1.4 存在的问题
但是即使采用更好的梯度下降算法,在实际模型训练中仍然会难以得到很好的模型表现,这就与学习率有关了,学习率太大时会导致在训练后期目标函数一直在最优解附近跳来跳去,难以得到极小值,学习率太小又会导致模型训练时间过长,学习率很小意味着模型需要不断摸索,走很多很多步才能到达极小值处。在实验中也会有一些方法不断调整学习率,如模拟退火按照预先定义好的调度算法或者当相邻的迭代中目标变化小于一个阈值时候减小学习速率。但是这些调度和阈值需要预先设置,无法对数据集特征进行自适应。同时对所有参数采用固定的学习率可能也有问题,特别是数据具有稀疏性的时候。
2 梯度下降优化算法
我们知道随机梯度下降法主要依据当前梯度与学习速率的乘积来更新模型参数。
2.1 Momentun动量梯度下降法
梯度下降法的目标函数在极小值附近往往出现频繁的震荡难以收敛,如下图,
动量法的思想就是通过优化方法使得优化路线减少这样的上下摆动,也就是在垂直方向步长小一点,在水平方向步长大一点,在相关方向加速并抑制摇摆震荡,动量梯度下降法采用带有动量的梯度(指数滑动平均梯度),而不是当前梯度对模型参数进行更新,
其中,
这里的beta一般设置为0.9,V0初始化为0,
2.2 Nesterov accelerated gradient(NAG)
NAG梯度下降算法使用Nesterov加速梯度下降,引入了一个预测功能,对下一步走向进行预估,
其中,
这里有一个比较生动的说明,来自Silence_Dong,
当动量法第一次计算当前梯度时(短蓝线),并在累积梯度方向上进行了一大步参数更新(长蓝线);NAG是首先在之前的梯度方向上走了一大步(棕色线),然后在此位置上评估一下梯度,最后做出一个相对正确的参数更新(绿线)。这种“先知”更新方法可以避免走过头而逃离了最优解——这在RNN相关的各种任务中收益甚好。
2.3 自适应学习率算法(Adagrad)
自适应学习率算法通过将学习率除以当前和过去平方梯度的累计和对学习率进行自适应调整,考虑了历史梯度的信息,对于很少更新的参数采用较大的学习率,对于频繁更新的参数采用较小的学习率,
其中,
这里平方根里的常量通常会设定为1e-8等很小的非0值,由于自适应学习率算法会一直积累历史梯度,因此学习率会一直减小,在训练后期无法学习到更多特征了。
2.4 均方根传递算法(Root Mean Square prop,RMSprop)
RMSprop算法在AdaGrad基础上进行改进,将之前的累积平方梯度和改为指数加权平均,
其中,
2.5 自适应增量算法(Adadelta)
Adadelta也是在AdaGrad基础上改进学习率的,将delta的指数加权平均值替代AdaGrad中的学习率参数,delta为当前权重和新更新权重之间的差值。
其中,
2.6 适应性矩估计算法(Adam)
Adam(Adaptive Moment Estimation)算法是将动量算法和RMSprop相结合的算法。不仅衰减累积历史梯度的平方和(类似Adadelta和RMSprop)而且还要保存历史梯度的衰减累积和,参数更新:
其中,无偏估计值:
且
就目前而言,Adam是整体最好的选择。