zoukankan      html  css  js  c++  java
  • 【dlbook】优化

    【神经网络优化的挑战】

    一、病态:

      虽然学习率很小,而且梯度大,但是由于Hessian阵的病态,二次项比一次项还要大,梯度下降事实上并不一定能下降,反而有可能上升。因此需要将学习率调低。

      表现:梯度很强,但是学习很缓慢,因为曲率太强

     

    二、局部最小值:

      由于权重空间对称性,神经网络有很多局部极小值。

      是否存在大量代价高的局部极小值,优化算法是否会碰到,都尚未解决。

      梯度范数是否能收缩到一个微小的值。

    三、鞍点:

      鞍点是更加现实的问题!局部最小值是全正,鞍点是有正有负。

      牛顿法会陷入鞍点,二阶算法通常难以扩大到大型神经网络。

     

    四、悬崖和梯度爆炸:

      常见于循环神经网络,

      斜率较大区域,由于几个较大的权重相乘。使得导数巨大,梯度下降会使参数弹射的非常远,之前的优化就成为无用功。

     

    五、梯度爆炸和梯度消失:

      常见于循环神经网络或者很深的神经网络。

      如果一个矩阵经过多次相乘运算,而其特征值 > 1。最终特征值会趋于无穷,表现出悬崖的特征,即梯度爆炸。如果特征值小于1,会趋于0,显示为梯度消失,不知道向哪个方向移动。

      比较好的方式是记录每个梯度值!

    六、非精确梯度

      梯度估计是一个常见的问题,需要基于采样来估计,采样通常有噪声。

     

    七、局部与全局弱对应

      没有全局的优化算法。

      主要是在低维度的时候会达不到局部最优。

      高维度能够达到,但是路径可能会比较长。

    【基本算法】

    SGD:

      lr需要逐步衰减,一般使用的是线性衰减,

    动量:

      v = alpha  v  -  epsilon  梯度

      theta = theta + v

      解决问题1:Hessian矩阵的病态条件

      解决问题2:随机梯度的方差

      实践中,动量alpha的取值一般为 0.5 , 0.9 , 0.99, 应当随着时间变大。但是扩大动量alpha 没有收缩学习率 epsilon重要。

    Nesterov动量

      梯度计算时使用参数为 theta + alpha v,也就是提前计算动量的梯度

      在批量梯度下降(使用所有样本更新)的表现比动量算法好,但是在随机梯度的情况下并没有改善收敛率

    【参数初始化】

    权重初始化

    需要在不同单元之间破坏对称性、如果连接相同的输入,必须有不同的初始参数。

    一般是高斯或者均匀分布,这两种似乎没有很大差别,但没有研究证实。

    初始权重方差是重要的。更大的权重可以更好的破坏对称性,避免冗余单元更好传播信息,但是容易在前向或者反向传播中产生爆炸的值。

    优化希望初始权重大,更好的传播信息,正则化希望初始权重更小,

    如果计算资源允许,可以将初始数据范围设置为超参数。

    偏置初始化

    通常可以简单设置为0,以下是例外:

    1、偏置作为输出单元,

    2、避免初始化引起太大饱和,例如ReLU不设置为0而是0.1

    3、一个单元控制其他单元能否参与等式,

    【自适应学习率算法】

    Adagrad

      不同模型参数具有不同的学习率!

      缺陷:从训练开始进行累积会导致学习率过早过量减小,更多适用于凸优化

    RMSProp

      相比较Adagrad,在非凸设定下效果更好,从梯度累积转变为指数加权的移动平均。

      实现指数加权的方式是与动量相近,动量的值一般设成

      有效且使用,是经常采用的优化方法。

    Adam

       一阶矩和二阶矩综合使用,对超参数的选择相当鲁棒,但是需要修改一下建议的学习率。

    【二阶算法】

    待续

  • 相关阅读:
    PHP 设计模式系列 —— 资源库模式(Repository)
    在 Laravel 5 中使用 Repository 模式实现业务逻辑和数据访问的分离
    laravel集合
    2013项目总结
    项目总结
    到底创建了几个String对象?
    String s=new String("abc")创建了几个对象?
    局部刷新
    robot framework 在pycharm中语法无法高亮显示的,显示绿色解决办法(Robot Framework with PyCharm)
    UNIX环境高级编程——进程管理和通信(总结)
  • 原文地址:https://www.cnblogs.com/yesuuu/p/8398617.html
Copyright © 2011-2022 走看看