批归一化(Batch Normalization)

批归一化(Batch Normalization

Batch Normalization (labml.ai)

       Labml.ai是实现论文笔记与代码结合的一个网站,上面有许多的示例可供参考进行论文实现。

1)理论介绍

       Batch Normalization(批归一化)是一种常用的深度学习中的技术,用于加速神经网络的训练并提高模型的性能。它通过在网络中的每个隐藏层对输入进行归一化处理,使得每个神经元的输入分布更稳定,从而有助于网络的收敛和训练效果。

7 三层神经网络

       这是一个三层的神经网络,输入是x1x2 构成的向量x=[x1,x2]Tx 也被称为一个训练样本,在训练过程中,假设所有的样本一共有30个,每一次会从训练样本集合中选取五个X={x1,x2,x3,x4,x5} 进行随机梯度下降,那么这五个样本所构成的集合就叫做一个批量(batch),假设输入样本的batch服从这样一个奇怪的分布:

8 样本分布示意图

       在经过层层网络的非线性变换之后,每层学习到的分布都将无法预测,并且在网络学习的过程中,每一层的输出是前一层网络的输入,因此由于参数的更新,每层的输入分布都在发生变化,导致网络的很难收敛,为了让网络可以正常的训练,就需要学习率不能设置的太高、每层网络的参数初始化设定要准确,而且网络层数不能过多。

       这种现象的出现是由于每层分布的差异过大,并且无法预测导致的,那么如果让同一个batch中,样本在每一层中都服从类似的分布,就可以解决这个问题吗?是可以的,这就是2015年提出的batch normalization批量归一化方法。

       假设在一个batch中包含了x1x5 这五个样本X=\begin{Bmatrix}x_{1},x_{2},x_{3},x_{4},x_{5} \end{Bmatrix},其中任意一个元素xi 通过第一层神经网络线性变换后得到输出,那么由z1z5 构成的集合Z_{(1)}=\begin{Bmatrix} z_{(1)1},z_{(2)1},z_{(3)1},z_{(4)1},z_{(5)1} \end{Bmatrix},就是第二层网络的输入,在进行下一层运算之前,我们首先计算着五个值的中间结果的平均值和标准差。

\mu _{(1)}=\frac{1}{5}\sum_{i}z_{i(1)}      

\sigma _{(1)}=\sqrt{\frac{1}{5}\sum _{i}(z_{i(1)}- \mu _{(1)})^{2}}

       通过减去均值并处以标准差的方法,将每个样本归一化到均值为0,标准差为1的分布中,为了稳定数值计算,我们需要在分母中加一个小量,以避免分母出现为0的情况,同时,我们也并不希望每层样本的分布都相同,因此在通过一个线性计算进行简单的分布变化,其中伽马和贝塔是可以学习的参数。

z_{i(1),norm}=\gamma \frac{z_{i(1))- \mu_{(1)}}}{\sqrt{\sigma ^{2}_{(1)}+\varepsilon }}+\beta

       随着训练过程的自动调整,这就是batch normalization的运算过程。如果我们在每一层网络中都进行闭n归一化,那么就可以保证每一层输入的分布都是类似的,我们就可以使用较大的学习率,尝试不同的参数初始化方法,并且加速训练过程,这里需要注意两个问题。首先,bn算法中额外的引入了两个需要学习的参数伽马和贝塔,因此需要反向传播更新的参数从两个变为了四个,但是在归一化过程中需要减低所有向量的均值,因此偏执b向量可以不用参与运算,实际需要更新的变量是三个,另外需要注意的一点是这里的神经元不止进行了一个线性变换,它实际包含了三个运算:

z=Wx+b                                   线性变换

z_{i(1),norm}=\gamma \frac{z_{i(1))- \mu_{(1)}}}{\sqrt{\sigma ^{2}_{(1)}+\varepsilon }}+\beta              分布归一化

y=ReLU(znorm)                          非线性激活

       理论上来讲,后面两个的顺序并不是固定的,以上是对batch normalization在训练阶段运算的讨论,在测试推理阶段,我们仍可以使用训练得到的伽马和贝塔这两个参数,但因为训练集和测试集的样本并不完全一致,并且我们可能仅仅使用一个样本进行测试,无法计算均值和标准差,因此我们需要保存并使用训练过程中的结果来辅助运算。假设我们有30个样本,每五个样本构成一个batch进行训练,完整遍历,一次训练集就需要6个batch,那么对于每一层神经网络来说,我们会得到6个均值的历史数值,接下来通过指数加权的方式,获得这6个均值的平均值。

X_{\left \{ 1 \right \}}= \left \{ X_{1},X_{2},X_{3},X_{4},X_{5} \right \}                  \mu _{\left \{ 1 \right \}1}

X_{\left \{ 2 \right \}}= \left \{ X_{6},X_{7},X_{8},X_{9},X_{10} \right \}                 \mu _{\left \{ 2 \right \}1}

X_{\left \{ 3 \right \}}= \left \{ X_{11},X_{12},X_{13},X_{14},X_{15} \right \}           \mu _{\left \{ 3 \right \}1}

X_{\left \{ 4 \right \}}= \left \{ X_{16},X_{17},X_{18},X_{19},X_{20} \right \}           \mu _{\left \{ 4 \right \}1}

X_{\left \{ 1 \right \}}= \left \{ X_{21},X_{22},X_{23},X_{24},X_{25} \right \}           \mu _{\left \{ 5 \right \}1}

X_{\left \{ 1 \right \}}= \left \{ X_{26},X_{27},X_{28},X_{29},X_{30} \right \}           \mu _{\left \{ 6 \right \}1}

       第t次的均值等于1-m乘以t-1次的均值加上m乘以第t次迭代的历史数值,这里的m可以看作是对历史的保留,非常类似于随机梯度下降中动量的概念。

\overline{\mu _{\left \{t \right \}(1)}}=(1-m)\times \overline{\mu _{\left \{t-1 \right \}(1)}}+m\times \mu _{\left \{t \right \}(1)}

       在torch框架中也将这个变量命名为momentum,默认值是0.1。

2nn.BatchNorm2

BatchNorm2d是PyTorch中的一个类,用于在卷积神经网络中进行批量归一化操作。它可以用于二维卷积层的输入数据。

BatchNorm2d的参数如下:

       num_features(int):输入特征的数量。对于二维卷积层,这通常是卷积核的通道数。       数学表达为(N、C、H、W)

       eps(float,可选):分母中添加的值,用于数值稳定性。默认值为1e-5。

       momentum(float,可选):用于计算移动平均的动量。默认值为0.1。

       affine(bool,可选):如果设置为True,表示对归一化的结果应用可学习的仿射变换。       默认值为True。

       track_running_stats(bool,可选):如果设置为True,表示对训练期间的每个通道计算       并跟踪统计信息(均值和方差)。默认值为True。

注:以上为torch的帮助文档内容

3)总结及分析

       Batch Normalization批量归一化方法可以加速神经网络的收敛,使训练过程中对学习率和参数初始化更加鲁棒,但它也有一些缺陷。

  1. bn算法仅在batch中包含样本数量足够多的时候才有效。
  2. 对于循环神经网络(RNN)或序列数据(Sequence)性能较差。
  3. 分布式运算也有影响。

       为了应对bn算法的缺陷,后续又提出了

  1. Layer Normalization:在每一个样本特征空间内的归一化。
  2. Instance Normalization:在每一个样本特征空间内逐通道的归一化
  3. Group Normalization:LNBN的结合。

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏天是冰红茶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值