先前,每个参数θ(i)使用相同的学习率,每次会对所有参数θ进行更新。在每个时间步t中,Adagrad方法为每个参数θ选取不同的学习率,更新对应参数,然后进行向量化。为了简单起见,我们把在t时刻参数θ(i)的损失函数梯度设为g(t,i)。 图3:参数更新公式 Adagrad方法是在每个时间步中,根据过往已计算的参数梯度,来为每个参数θ(i)修改对应的学习率η。 Adagrad方法的主要好处是,不需要手工来调整学习率。大多数参数使用了默认值0.01,且保持不变。 Adagrad方法的主要缺点是,学习率η总是在降低和衰减。 因为每个附加项都是正的,在分母中累积了多个平方梯度值,故累积的总和在训练期间保持增长。这反过来又导致学习率下降,变为很小数量级的数字,该模型完全停止学习,停止获取新的额外知识。 因为随着学习速度的越来越小,模型的学习能力迅速降低,而且收敛速度非常慢,需要很长的训练和学习,即学习速度降低。 另一个叫做Adadelta的算法改善了这个学习率不断衰减的问题。 4. AdaDelta方法 这是一个AdaGrad的延伸方法,它倾向于解决其学习率衰减的问题。Adadelta不是累积所有之前的平方梯度,而是将累积之前梯度的窗口限制到某个固定大小w。 与之前无效地存储w先前的平方梯度不同,梯度的和被递归地定义为所有先前平方梯度的衰减平均值。作为与动量项相似的分数γ,在t时刻的滑动平均值Eg⊃2;仅仅取决于先前的平均值和当前梯度值。 Eg⊃2;=γ.Eg⊃2;+(1−γ).g⊃2;(t),其中γ设置为与动量项相近的值,约为0.9。 Δθ(t)=−η⋅g(t,i). θ(t+1)=θ(t)+Δθ(t) 图4:参数更新的最终公式 AdaDelta方法的另一个优点是,已经不需要设置一个默认的学习率。 目前已完成的改进 1)为每个参数计算出不同学习率; 2) 也计算了动量项momentum; 3)防止学习率衰减或梯度消失等问题的出现。 还可以做什么改进? 在之前的方法中计算了每个参数的对应学习率,但是为什么不计算每个参数的对应动量变化并独立存储呢?这就是Adam算法提出的改良点。 Adam算法 Adam算法即自适应时刻估计方法(Adaptive Moment Estimation),能计算每个参数的自适应学习率。这个方法不仅存储了AdaDelta先前平方梯度的指数衰减平均值,而且保持了先前梯度M(t)的指数衰减平均值,这一点与动量类似: M(t)为梯度的第一时刻平均值,V(t)为梯度的第二时刻非中心方差值。 图5:两个公式分别为梯度的第一个时刻平均值和第二个时刻方差 则参数更新的最终公式为: 图6:参数更新的最终公式 其中,β1设为0.9,β2设为0.9999,ϵ设为10-8。 在实际应用中,Adam方法效果良好。与其他自适应学习率算法相比,其收敛速度更快,学习效果更为有效,而且可以纠正其他优化技术中存在的问题,如学习率消失、收敛过慢或是高方差的参数更新导致损失函数波动较大等问题。 对优化算法进行可视化 图8:对鞍点进行SGD优化 从上面的动画可以看出,自适应算法能很快收敛,并快速找到参数更新中正确的目标方向;而标准的SGD、NAG和动量项等方法收敛缓慢,且很难找到正确的方向。 结论 我们应该使用哪种优化器? 在构建神经网络模型时,选择出最佳的优化器,以便快速收敛并正确学习,同时调整内部参数,最大程度地最小化损失函数。 Adam在实际应用中效果良好,超过了其他的自适应技术。 如果输入数据集比较稀疏,SGD、NAG和动量项等方法可能效果不好。因此对于稀疏数据集,应该使用某种自适应学习率的方法,且另一好处为不需要人为调整学习率,使用默认参数就可能获得最优值。 如果想使训练深层网络模型快速收敛或所构建的神经网络较为复杂,则应该使用Adam或其他自适应学习速率的方法,因为这些方法的实际效果更优。 希望你能通过这篇文章,很好地理解不同优化算法间的特性差异。 相关链接: 二阶优化算法: https://web.stanford.edu/class/msande311/lecture13.pdf Nesterov梯度加速法: 【完】 一则通知 (责任编辑:本港台直播) |