深度学习入门基于python的的理论与实现(学习笔记).第六章 与学习相关的技巧(第三部分)

6.3 Batch Normalization

在权重的初始化中,我们观察了各层的激活值分布,并从中了解到如果设定了合适的权重初始值,则各层的激活值分布会有合适的广度,从而可以顺利地进行学习。那么为了使各层拥有适当的广度,“强制性”地调整激活值的分布会怎样呢?Batch Normalization就是基于这个方法而产生的。
Batch Normalization(简称Batch Norm)是2015年提出的方法,他可以

  1. 可以使学习快速进行(可以增大学习率)
  2. 不那么依赖初始值(对于初始值不用那么神经质)
  3. 抑制过拟合(降低Dropout等的必要性)

如前所述,Batch Norm的思路是调整各层的激活值分布使其拥有适当的广度。为词,要向神经网络中插入对数据分布进行正规化的层,即Batch Normalization层(下文简称Batch Norm层)。一般放在放在Affine层和Relu层之间。
在这里插入图片描述
Batch Norm,顾名思义,以进行学习时的mini-batch为单位,按mini-batch进行正规化。具体而言,就是进行使数据分布的均值为0,方差为1的正规化。用数学式表达为:
在这里插入图片描述
对输入的集合B={x1,x2,…xn}求均值μ和方差σ。然后对输入数据进行均值为0,方差为1(合适的分布)的正规化。最后分母中的在这里插入图片描述
为一个微小值(比如之前用过的,1e-7)为了防止出现分母为0的情况。
如果归一化了训练数据,那么就需要保存参数μ\muμ和σ\sigmaσ,之后用保存的训练集上的μ和σ来归一化测试集,而非分别在训练集和测试集上计算μ和σ。这样可以让测试集和训练集都经过相同的μ和σ定义的数据转换

归一化图示:
在这里插入图片描述
直观地理解Batch Norm的优点:

  1. BN层强制性地调整各层的激活值分布使其拥有适当的广度,使激活值落在非饱和区从而缓解梯度消失问题,加速网络收敛,同时也避免了表现力不足的问题。
  2. 通过BN层可使后面的层对前面层的输出不那么敏感(没有BN层的话,当前面层参数改变时,输出值范围变化,导致后面层的参数也不得不调整),抑制了参数微小变化随网络加深而被放大的问题,减小耦合,是每一层都能独立学习,提升学习速率。(reduce the internal covariate shift)
  3. 如上节所述,归一化所有输入特征可以加速网络学习(enables higher learning rates)
  4. μ和σ只是由一个mini-batch计算得到的,而非是整个数据集上的μ和σ,因此相当于加入了一些噪声(add some noise to each hidden layer’s activations),因此有轻微的正则化效果(regularization effect)。(如果用更大的mini-batch 就会减小噪声,进而减弱正则化效果)

Batch Norm的缺点:

  1. 因为是在batch维度归一化,BN层要有较大的batch才能有效工作,而例如物体检测等任务由于占用内存较多,限制了batch的大小,进而也限制了BN层的归一化功能
  2. 测试时直接拿训练集的均值与方差对测试集进行归一化,可能会使测试集依赖于训练集

实际上,在不使用Batch Norm的情况下,如果不赋予一个尺度好的初始值,学习将完全无法进行
在这里插入图片描述

为什么需要归一化:
在这里插入图片描述
当输入都在相近范围内时,损失函数优化起来更简单更快速,从而加速网络学习。

参考博文:
https://blog.csdn.net/weixin_42437114/article/details/106593926

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值