欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

解读Batch Normalization

发布时间:2024/8/23 编程问答 40 豆豆
生活随笔 收集整理的这篇文章主要介绍了 解读Batch Normalization 小编觉得挺不错的,现在分享给大家,帮大家做个参考.
【活动】Python创意编程活动开始啦!!!     CSDN日报20170424 ——《技术方向的选择》    程序员4月书讯:Angular来了!

解读Batch Normalization

5262人阅读 评论(1) 收藏 举报 本文章已收录于: 分类: 深度学习基础(10) 作者同类文章X

    目录(?)[+]

  • 目录
  • 1-Motivation
  • 2-Normalization via Mini-Batch Statistics
  • 测试
  • BN before or after Activation
  • 3-Experiments
  • 目录

      • 目录
        • 1-Motivation
        • 2-Normalization via Mini-Batch Statistics
          • 测试
          • BN before or after Activation
        • 3-Experiments

    本次所讲的内容为Batch Normalization,简称BN,来源于《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》,是一篇很好的paper。

    1-Motivation

    作者认为:网络训练过程中参数不断改变导致后续每一层输入的分布也发生变化,而学习的过程又要使每一层适应输入的分布,因此我们不得不降低学习率、小心地初始化。作者将分布发生变化称之为 internal covariate shift

    大家应该都知道,我们一般在训练网络的时会将输入减去均值,还有些人甚至会对输入做白化等操作,目的是为了加快训练。为什么减均值、白化可以加快训练呢,这里做一个简单地说明:

    首先,图像数据是高度相关的,假设其分布如下图a所示(简化为2维)。由于初始化的时候,我们的参数一般都是0均值的,因此开始的拟合y=Wx+b,基本过原点附近,如图b红色虚线。因此,网络需要经过多次学习才能逐步达到如紫色实线的拟合,即收敛的比较慢。如果我们对输入数据先作减均值操作,如图c,显然可以加快学习。更进一步的,我们对数据再进行去相关操作,使得数据更加容易区分,这样又会加快训练,如图d。

    白化的方式有好几种,常用的有PCA白化:即对数据进行PCA操作之后,在进行方差归一化。这样数据基本满足0均值、单位方差、弱相关性。作者首先考虑,对每一层数据都使用白化操作,但分析认为这是不可取的。因为白化需要计算协方差矩阵、求逆等操作,计算量很大,此外,反向传播时,白化操作不一定可导。于是,作者采用下面的Normalization方法。

    2-Normalization via Mini-Batch Statistics

    数据归一化方法很简单,就是要让数据具有0均值和单位方差,如下式:

    但是作者又说如果简单的这么干,会降低层的表达能力。比如下图,在使用sigmoid激活函数的时候,如果把数据限制到0均值单位方差,那么相当于只使用了激活函数中近似线性的部分,这显然会降低模型表达能力。

    为此,作者又为BN增加了2个参数,用来保持模型的表达能力。
    于是最后的输出为:

    上述公式中用到了均值E和方差Var,需要注意的是理想情况下E和Var应该是针对整个数据集的,但显然这是不现实的。因此,作者做了简化,用一个Batch的均值和方差作为对整个数据集均值和方差的估计。
    整个BN的算法如下:

    求导的过程也非常简单,有兴趣地可以自己再推导一遍或者直接参见原文。

    测试

    实际测试网络的时候,我们依然会应用下面的式子:

    特别注意: 这里的均值和方差已经不是针对某一个Batch了,而是针对整个数据集而言。因此,在训练过程中除了正常的前向传播和反向求导之外,我们还要记录每一个Batch的均值和方差,以便训练完成之后按照下式计算整体的均值和方差:

    BN before or after Activation

    作者在文章中说应该把BN放在激活函数之前,这是因为Wx+b具有更加一致和非稀疏的分布。但是也有人做实验表明放在激活函数后面效果更好。这是实验链接,里面有很多有意思的对比实验:https://github.com/ducha-aiki/caffenet-benchmark

    3-Experiments

    作者在文章中也做了很多实验对比,我这里就简单说明2个。
    下图a说明,BN可以加速训练。图b和c则分别展示了训练过程中输入数据分布的变化情况。

    下表是一个实验结果的对比,需要注意的是在使用BN的过程中,作者发现Sigmoid激活函数比Relu效果要好。

    6
    0

    我的同类文章

    深度学习基础(10) http://blog.csdn.net
    • •CNN不能识别Negative图像2017-04-10阅读849
    • •深度模型一些新的运行框架或者辅助库工具等2016-11-04阅读1399
    • •深度学习——PReLU激活2016-05-08阅读4060
    • •GoogLeNet系列解读2016-02-25阅读13083
    • •多尺度竞争卷积2016-01-12阅读1248
    • •思考深度学习的泛化能力2017-02-20阅读617
    • •深度学习——MSRA初始化2016-05-08阅读3364
    • •深度学习——Xavier初始化方法2016-05-07阅读9004
    • •系列解读Dropout2016-01-25阅读1880
    • •mxnet学习记录【1】2015-12-01阅读10031

    参考知识库

    软件测试知识库

    4519关注|318收录

    算法与数据结构知识库

    15752关注|2320收录

    更多资料请参考: 猜你在找
    使用决策树算法对测试数据进行分类实战
    使用决策树算法对测试数据进行分类实战
    《C语言/C++学习指南》加密解密篇(安全相关算法)
    数据结构与算法在实战项目中的应用
    C语言系列之 字符串相关算法
    深入浅出深度学习中的Batch Normalization使用
    Batch Normalization 学习
    Batch Normalization导读
    Batch Normalization 神经网络加速算法
    Batch Normalization导读
    关闭 查看评论 1楼 meadl 2016-11-23 18:20发表 [回复] [引用] [举报]
    博主 具体到一个batch,假设为20,要对每个map在激活前使用BN,我要对y=wx+b的中的y求和,然后除以20 ,这样就是这个神经元的均值吗?那么方差是多少了?难道把输入的20张map看成一个数来求方差吗?比如2*1的向量方差是2*2的呀
    * 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    核心技术类目
    全部主题HadoopAWS移动游戏JavaAndroidiOSSwift智能硬件DockerOpenStackVPNSparkERPIE10EclipseCRMJavaScript数据库UbuntuNFCWAPjQueryBIHTML5SpringApache.NETAPIHTMLSDKIISFedoraXMLLBSUnitySplashtopUMLcomponentsWindows MobileRailsQEMUKDECassandraCloudStackFTCcoremailOPhone CouchBase云计算iOS6Rackspace Web AppSpringSideMaemoCompuware大数据aptechPerlTornadoRubyHibernateThinkPHPHBasePureSolrAngularCloud FoundryRedisScalaDjangoBootstrap

    总结

    以上是生活随笔为你收集整理的解读Batch Normalization的全部内容,希望文章能够帮你解决所遇到的问题。

    如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。