zoukankan      html  css  js  c++  java
  • Batch Normalization

    一、Internal Covariate Shift

    论文提出BN是用来解决“Internal Covariate Shift”问题的。如果输入数据经常变换,那么网络模型很难学到泛化的特征。对于深度学习这种包含很多隐层的网络结构,在训练过程中,因为各层参数不停在变化,所以每个隐层都会面临covariate shift的问题,也就是在训练过程中,隐层的输入分布老是变来变去,这就是所谓的“Internal Covariate Shift”,Internal指的是深层网络的隐层,是发生在网络内部的事情,而不是covariate shift问题只发生在输入层。

      然后提出了BatchNorm的基本思想:让每个隐层节点的激活输入分布固定下来呢?这样就避免了“Internal Covariate Shift”问题了。

     

    二、加速收敛

    在没有进行BN之前,如果两个输入数据$x_1$,$x_2$的分布的量级差别很大的话,导致$x_2$对计算结果的影响比较大(图左),所以训练的时候,横纵方向上需要给与不同的training rate,在$x_1$方向需要一个更大的learning rate,使参数快速的变大,才能平衡$x_2$影响的结果,不过这样做的办法却不见得很简单,因为学习率不好控制。如果做了normalization之后,输入数据是同一个量级,使得error surface看起来比较接近正圆的话(图右),就可以使训练容易得多,从而加速收敛。


    三、解决梯度消失和梯度爆炸

      因为深层神经网络在做非线性变换前的激活输入值(就是那个$y=wx+b$,$x$是输入)随着网络深度加深或者在训练过程中,其分布逐渐发生偏移或者变动,一般是整体分布逐渐往非线性函数的取值区间的上下限两端靠近(对于Sigmoid函数来说,意味着激活输入值$wx+b$是大的负值或正值),所以这导致反向传播时低层神经网络的梯度消失.
      而BN就是通过一定的规范化手段,把每层神经网络任意神经元这个输入值的分布强行拉回到均值为0方差为1的标准正态分布,其实就是把越来越偏的分布强制拉回比较标准的分布,这样使得激活输入值落在非线性函数对输入比较敏感的区域,这样输入的小变化就会导致损失函数较大的变化,意思是这样让梯度变大,避免梯度消失问题产生,而且梯度变大意味着学习收敛速度快,也能加快训练速度

    BN之后,因为大权重有小梯度,这就不怕bp导致梯度放大,引起梯度爆炸。

    四、BN其他优点

    1.允许使用较大的学习率

      分布较为一致,较大的学习率也不会导致不稳定的学习,较大的学习率可以避免进入局部最优,也能够加速收敛。

    2.可以不需要小心翼翼地设置权重初始化

      初始化对学习的影响减小了,可以不那么小心地设置初始权重。举例来说,对于一个单元的输入值,不管权重w,还是放缩后的权重kw,BN过后的值都是一样的,这个k被消掉了,对于学习来说,激活值是一样的。$frac{kw-kar{w}}{ksqrt{sigma }}$,可以看到k被消掉。

    3.减小对正则的需要

      而导致overfitting往往是数据很大导致,而BN就使数据变小,overfitting现象就可以得到一定的缓解。所以可以减小或者不用dropout。

    五、BN具体执行流程

    我们可能不希望所有的数据总是均值为0,方差为1。更好的模拟原始的数据。

    $y_igetshat{gamma x_i}+etaequiv BN_{gamma,eta}x_i$

    参考:

    https://www.cnblogs.com/guoyaohua/p/8724433.html

    https://www.jianshu.com/p/b4d186cca6be

     

  • 相关阅读:
    java基础 ——String类型
    WinSCP密钥登录,实现文件上传
    linux 文件压缩,以及解压
    win10的资源管理器,边框不见了
    在360浏览器中打开表单,回显错误数据
    java返回数据工具类
    WEB工具类
    JSON 的几种转换
    二维码生成工具类
    XML的几种转换
  • 原文地址:https://www.cnblogs.com/AntonioSu/p/12205564.html
Copyright © 2011-2022 走看看