引言
最优化问题是计算数学中最为重要的研究方向之一。而在深度学习领域,优化算法的选择也是一个模型的重中之重。即使在数据集和模型架构完全相同的情况下,采用不同的优化算法,也很可能导致截然不同的训练效果。
梯度下降是目前神经网络中使用最为广泛的优化算法之一。为了弥补朴素梯度下降的种种缺陷,研究者们发明了一系列变种算法,从最初的 SGD (随机梯度下降) 逐步演进到 NAdam。然而,许多学术界最为前沿的文章中,都并没有一味使用 Adam/NAdam 等公认“好用”的自适应算法,很多甚至还选择了最为初级的 SGD 或者 SGD with Momentum 等。
本文旨在梳理深度学习优化算法的发展历程,并在一个更加概括的框架之下,对优化算法做出分析和对比。
Gradient Descent
梯度下降是指,在给定待优化的模型参数 和目标函数 后,算法通过沿梯度 的相反方向更新 来最小化 。学习率 决定了每一时刻的更新步长。对于每一个时刻 ,我们可以用下述步骤描述梯度下降的流程:
(1) 计算目标函数关于参数的梯度
(2) 根据历史梯度计算一阶和二阶动量
(3) 更新模型参数
其中, 为平滑项,防止分母为零,通常取 1e-8。
Gradient Descent 和其算法变种
根据以上框架,我们来分析和比较梯度下降的各变种算法。
Vanilla SGD
朴素 SGD (Stochastic Gradient Descent) 最为简单,没有动量的概念,即
这时,更新步骤就是最简单的
SGD 的缺点在于收敛速度慢,可能在鞍点处震荡。并且,如何合理的选择学习率是 SGD 的一大难点。
Momentum
SGD 在遇到沟壑时容易陷入震荡。为此,可以为其引入动量 Momentum[3],加速 SGD 在正确方向的下降并抑制震荡。
SGD-M 在原步长之上,增加了与上一时刻步长相关的 , 通常取 0.9 左右。这意味着参数更新方向不仅由当前的梯度决定,也与此前累积的下降方向有关。这使得参数中那些梯度方向变化不大的维度可以加速更新,并减少梯度方向变化较大的维度上的更新幅度。由此产生了加速收敛和减小震荡的效果。