• 关于Adam和SGD等优化方法的讨论


    第一篇是这个:

    https://zhuanlan.zhihu.com/p/32230623 

    在上面一篇文章已经讲了:

    https://www.cnblogs.com/charlesblc/p/15908598.html

    接下来是这篇文章:

    https://zhuanlan.zhihu.com/p/32262540

    《Adam那么棒,为什么还对SGD念念不忘 (2)—— Adam的两宗罪》

    Adam罪状一:可能不收敛

    Adam罪状二:可能错过全局最优解

    他们提出了一个用来改进Adam的方法:前期用Adam,享受Adam快速收敛的优势;后期切换到SGD,慢慢寻找最优解。 

     

    第三篇是这个:

    https://zhuanlan.zhihu.com/p/32338983

    《Adam那么棒,为什么还对SGD念念不忘 (3)—— 优化算法的选择与使用策略》

     

    不同优化算法的核心差异:下降方向

    从第一篇的框架中我们看到,不同优化算法最核心的区别,就是第三步所执行的下降方向:

    [公式]

    这个式子中,前半部分是实际的学习率(也即下降步长),后半部分是实际的下降方向。SGD算法的下降方向就是该位置的梯度方向的反方向,带一阶动量的SGD的下降方向则是该位置的一阶动量方向。自适应学习率类优化算法为每个参数设定了不同的学习率,在不同维度上设定不同步长,因此其下降方向是缩放过(scaled)的一阶动量方向。

     

    主流的观点认为:Adam等自适应学习率算法对于稀疏数据具有优势,且收敛速度很快;但精调参数的SGD(+Momentum)往往能够取得更好的最终结果。

     

    优化算法的常用tricks

     

    最后,分享一些在优化算法的选择和使用方面的一些tricks。

     

    1. 首先,各大算法孰优孰劣并无定论。如果是刚入门,优先考虑SGD+Nesterov Momentum或者Adam.(Standford 231n : The two recommended updates to use are either SGD+Nesterov Momentum or Adam
    2. 选择你熟悉的算法——这样你可以更加熟练地利用你的经验进行调参。
    3. 充分了解你的数据——如果模型是非常稀疏的,那么优先考虑自适应学习率的算法。
    4. 根据你的需求来选择——在模型设计实验过程中,要快速验证新模型的效果,可以先用Adam进行快速实验优化;在模型上线或者结果发布前,可以用精调的SGD进行模型的极致优化。
    5. 先用小数据集进行实验。有论文研究指出,随机梯度下降算法的收敛速度和数据集的大小的关系不大。(The mathematics of stochastic gradient descent are amazingly independent of the training set size. In particular, the asymptotic SGD convergence rates are independent from the sample size. [2])因此可以先用一个具有代表性的小数据集进行实验,测试一下最好的优化算法,并通过参数搜索来寻找最优的训练参数。
    6. 考虑不同算法的组合。先用Adam进行快速下降,而后再换到SGD进行充分的调优。切换策略可以参考本文介绍的方法。
    7. 数据集一定要充分的打散(shuffle)。这样在使用自适应学习率算法的时候,可以避免某些特征集中出现,而导致的有时学习过度、有时学习不足,使得下降方向出现偏差的问题。
    8. 训练过程中持续监控训练数据和验证数据上的目标函数值以及精度或者AUC等指标的变化情况。对训练数据的监控是要保证模型进行了充分的训练——下降方向正确,且学习率足够高;对验证数据的监控是为了避免出现过拟合。
    9. 制定一个合适的学习率衰减策略。可以使用定期衰减策略,比如每过多少个epoch就衰减一次;或者利用精度或者AUC等性能指标来监控,当测试集上的指标不变或者下跌时,就降低学习率。

     

    initialization, activation, normalization 等等无不是四两拨千斤。

  • 相关阅读:
    MultipartFile(文件的上传)
    JSONObject.fromObject--JSON与对象的转换
    Map集合与转化
    java读取excel文件
    Java中的Arrays类使用详解
    Arrays 类的 binarySearch() 数组查询方法详解
    JDK8 特性详解
    关于Java堆、栈和常量池的详解
    深入java final关键字
    杯酒人生
  • 原文地址:https://www.cnblogs.com/charlesblc/p/15920535.html
Copyright © 2020-2023  润新知