zoukankan      html  css  js  c++  java
  • Batch Normalization 笔记

    原理

    输入层可以归一化,那么其他层也应该可以归一化。但是有个重要的问题,为什么要引入beta和gamma。

    为什么要引入beta和gamma

    • 不总是要标准正态分布,否则会损失表达能力,作者以sigmoid函数为例进行说明。可以看到,标准正态分布(正负三倍标准差)正好落在sigmoid函数的线性部分。其他激活函数(ReLU系列)更有可能需要不同的分布。
      sigmoid vs normal
    • 恒等映射
      如果beta和gamma正好是均值和标准差,那么变换之后得到的是该特征原来的分布。
    • 可以不要bias,因为会减均值

    测试过程

    • 测试时,归一化过程往往针对一个输入,因此均值和方差需要在训练时学习。例如:
    # training
    running_mean = momentum * running_mean + (1 - momentum) * sample_mean
    running_var = momentum * running_var + (1 - momentum) * sample_var
    
    # testing
    output = gamma * (x-running_mean)/sqrt(running_var+epsilon) + beta
    

    参数数量

    • 当前层的每个特征有各自的分布,因此BN是针对各个特征的
    • 对于CNN来说,n个激活图的层有4n个参数,beta,gamma以及running mean和running variance

    BN的效果

    • 改善了网络中的梯度流
    • 可以使用更大的学习率
    • 降低了对权重初始化的要求
    • 提供一定程度的正则化

    Why BN works?

    covariate shift
    数据的分布是变化的,已经学习到的映射(权重)在新的数据上需要重新训练。在隐藏层之间,称为internal covariate shift。

    • 当实际的映射(ground truth mapping)有shift时(网络没有训练好时)问题更严重

    BN的作用

    • 使各层的输入数据具有相似的分布(正态分布)
    • 减小了internal covariate shift
      • 限制了当前层分布的变化,因此减小了对下一层的影响
      • 当前层可以改变数据的分布,因此减小了之前层的影响
  • 相关阅读:
    桟错误分析方法
    gstreamer调试命令
    sqlite的事务和锁,很透彻的讲解 【转】
    严重: Exception starting filter struts2 java.lang.NullPointerException (转载)
    eclipse 快捷键
    POJ 1099 Square Ice
    HDU 1013 Digital Roots
    HDU 1087 Super Jumping! Jumping! Jumping!(动态规划)
    HDU 1159 Common Subsequence
    HDU 1069 Monkey and Banana(动态规划)
  • 原文地址:https://www.cnblogs.com/whenyd/p/8416332.html
Copyright © 2011-2022 走看看