【原理】Batch Normalization 论文及原理总结

【原理】Batch Normalization 论文及原理总结

目录

论文:Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift

论文摘要

训练深度神经网络的复杂性在于,每层输入的分布在训练过程中会发生变化,因为前面的层的参数会发生变化。通过要求较低的学习率和仔细的参数初始化减慢了训练,并且使具有饱和非线性的模型训练起来非常困难。我们将这种现象称为内部协变量转移,并通过标准化层输入来解决这个问题。我们的方法力图使标准化成为模型架构的一部分,并为每个训练小批量数据执行标准化。批标准化使我们能够使用更高的学习率,并且不用太注意初始化。它也作为一个正则化项,在某些情况下不需要Dropout。将批量标准化应用到最先进的图像分类模型上,批标准化在取得相同的精度的情况下,减少了14倍的训练步骤,并以显著的差距击败了原始模型。

Batch:为什么小批量样本对训练有帮助?

首先,小批量数据的梯度损失是训练集上的梯度估计,其质量随着批量增加而改善。第二,由于现代计算平台提供的并行性,对一个批次的计算比单个样本计算m次效率更高。

梯度下降:会产生哪些问题?

  1. 虽然随机梯度是简单有效的,但它需要仔细调整模型的超参数,特别是优化中使用的学习速率以及模型参数的初始值。训练的复杂性在于每层的输入受到前面所有层的参数的影响——因此当网络变得更深时,网络参数的微小变化就会被放大。
  2. 层输入的分布变化是一个问题,因为这些层需要不断适应新的分布。当学习系统的输入分布发生变化时,据说会经历协变量转移(Shimodaira,2000)。这通常是通过域适应(Jiang,2008)来处理的。

对于第二条,论文中经过证明,经过任意变换后的模型与原来的网络等价。因此,输入分布特性使训练更有效——例如训练数据和测试数据之间有相同的分布——也适用于训练子网络。因此x的分布在时间上保持固定是有利的。然后,Θ2不必重新调整来补偿x分布的变化。

子网络输入的固定分布对于子网络外的层也有积极的影响。考虑一个激活函数为\(g(x) = \dfrac{1}{1+e^x}\)的层,u是层输入,权重矩阵W和偏置向量b是要学习的层参数,g(x)=11+exp(−x)。随着|x|的增加,g′(x)趋向于0。这意味着对于x=Wu+b的所有维度,除了那些具有小的绝对值之外,流向u的梯度将会消失,模型将缓慢的进行训练。然而,由于x受W,b和下面所有层的参数的影响,训练期间那些参数的改变可能会将x的许多维度移动到非线性的饱和状态并减慢收敛。这个影响随着网络深度的增加而放大。在实践中,饱和问题和由此产生的梯度消失通常通过使用修正线性单元(Nair & Hinton, 2010) ReLU(x)=max(x,0),仔细的初始化(Bengio & Glorot, 2010; Saxe et al., 2013)和小的学习率来解决。==然而,如果我们能保证非线性输入的分布在网络训练时保持更稳定,那么优化器将不太可能陷入饱和状态,训练将加速。==

关键:“然而,如果我们能保证非线性输入的分布在网络训练时保持更稳定,那么优化器将不太可能陷入饱和状态,训练将加速。”均值稳定到0,激活函数的梯度才会大。

由于每一层输入的整个白化是代价昂贵的并且不是到处可微分的,因此我们做了两个必要的简化。首先是我们将单独标准化每个标量特征,从而代替在层输入输出对特征进行共同白化,==使其具有零均值和单位方差==。对于具有d维输入x=(x(1)…x(d))的层,我们将标准化每一维

\[\hat x^{(k)} = \frac{x^{(k)} - E[x^{(k)}]} {\sqrt {Var[x^{(k)}]}}\]

其中期望和方差在整个训练数据集上计算。如(LeCun et al., 1998b)中所示,这种标准化加速了收敛,即使特征没有去相关。
注意简单标准化层的每一个输入可能会改变层可以表示什么。例如,标准化sigmoid的输入会将它们约束到非线性的线性状态。为了解决这个问题,我们要确保插入到网络中的变换可以表示恒等变换。为了实现这个,对于每一个激活值x(k),我们引入成对的参数γ(k),β(k),它们会归一化和移动标准化值:

\[y^{(k)} = \gamma^{(k)}\hat x^{(k)} + \beta^{(k)}.\]

这些参数与原始的模型参数一起学习,并恢复网络的表示能力。实际上,通过设置\(\gamma^{(k)} = \sqrt{Var[x^{(k)}]}\)\(\beta^{(k)} = E[x^{(k)}]\)以重新获得原始的激活值,如果这是要做的最优的事。
每个训练步骤的批处理设置是基于整个训练集的,我们将使用整个训练集来标准化激活值。然而,当使用随机优化时,这是不切实际的。因此,我们做了第二个简化:由于我们在随机梯度训练中使用小批量,每个小批量产生每次激活平均值和方差的估计。这样,用于标准化的统计信息可以完全参与梯度反向传播。注意,通过计算每一维的方差而不是联合协方差,可以实现小批量的使用;在联合情况下,将需要正则化,因为小批量大小可能小于白化的激活值的数量,从而导致单个协方差矩阵。

批标准化可以提高学习率
在传统的深度网络中,学习率过高可能会导致梯度爆炸或梯度消失,以及陷入差的局部最小值。批标准化有助于解决这些问题。通过标准化整个网络的激活值,在数据通过深度网络传播时,它可以防止层参数的微小变化被放大。例如,这使sigmoid非线性更容易保持在它们的非饱和状态,这对训练深度sigmoid网络至关重要,但在传统上很难实现。

5.结论

我们提出了一个新的机制,大大加快了深度网络的训练。它是基于前提协变量转移的,已知其会使机器学习系统的训练复杂化,也适用于子网络和层,并且从网络的内部激活中去除它可能有助于训练。我们提出的方法从其标准化激活中获取其功能,并将这种标准化合并到网络架构本身。这确保了标准化可以被用来训练网络的任何优化方法进行恰当的处理。为了让深度网络训练中常用的随机优化方法可用,我们对每个小批量数据执行标准化,并通过标准化参数来反向传播梯度。批标准化每个激活只增加了两个额外的参数,这样做可以保持网络的表示能力。我们提出了一个算法,其用于构建,训练和执行推断批标准化网络。所得到的网络可以用饱和非线性进行训练,能更容忍增加的训练率,并且通常不需要丢弃来进行正则化。

仅仅将批标准化添加到了最新的图像分类模型中便在训练中取得了实质的加速。通过进一步提高学习率,删除丢弃和应用批标准化所提供的其它修改,我们只用了少部分的训练步骤就达到了以前的技术水平——然后在单网络图像分类中击败了最先进的技术。此外,通过组合多个使用批标准化训练的模型,我们在ImageNet上的表现显著优于最好的已知系统。

我们的方法与(Gülçehre&Bengio,2013)的标准化层相似,尽管这两个方法解决的目标不同。批标准化寻求在整个训练过程中激活值的稳定分布,并且对非线性的输入进行归一化,因为这时更有可能稳定分布。相反,标准化层被应用于非线性的输出,这导致了更稀疏的激活。我们没有观察到非线性输入是稀疏的,无论是有批标准化还是没有批标准化。批标准化的其它显著差异包括学习到的缩放和转移允许BN变换表示恒等,卷积层处理以及不依赖于小批量数据的确定性推断。

在这项工作中,我们没有探索批标准化可能实现的全部可能性。我们的未来工作包括将我们的方法应用于循环神经网络(Pascanu et al.,2013),其中内部协变量转移和梯度消失或爆炸可能特别严重,这将使我们能够更彻底地测试假设标准化改善了梯度传播(第3.3节)。需要对批标准化的正则化属性进行更多的研究,我们认为这是BN-Inception中删除丢弃时我们观察到的改善的原因。我们计划调查批标准化是否有助于传统意义上的域自适应——即网络执行标准化是否能够更容易泛化到新的数据分布,也许仅仅是对总体均值和方差的重新计算(Alg.2)。最后,我们认为,该算法的进一步理论分析将允许更多的改进和应用。

总结

BN层的作用:

  1. 防止梯度弥散/爆炸
  2. 加速训练

每层输入的分布在训练过程中会发生变化,因为前面的层的参数会发生变化。通过设置较低的学习率和仔细的参数初始化减慢了训练,并且使具有饱和非线性的模型训练起来非常困难。保证非线性输入的分布在网络训练时保持更稳定,那么优化器将不太可能陷入饱和状态,训练将加速。

3.批标准化可以提高学习率

在传统的深度网络中,学习率过高可能会导致梯度爆炸或梯度消失,以及陷入差的局部最小值。批标准化有助于解决这些问题。通过标准化整个网络的激活值,在数据通过深度网络传播时,它可以防止层参数的微小变化被放大。例如,这使sigmoid非线性更容易保持在它们的非饱和状态,这对训练深度sigmoid网络至关重要,但在传统上很难实现。

posted @ 2018-03-09 01:38 ToOnE 阅读( ...) 评论( ...) 编辑 收藏
### Batch Normalization 的详细解读 #### 什么是 Batch NormalizationBatch Normalization 是一种用于加速深度神经网络训练的技术,最初由 Google 提出并发表在论文Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》中[^1]。其核心目标是通过减少内部协变量偏移(Internal Covariate Shift),使模型能够更高效地完成训练。 #### 内部协变量偏移是什么? 在深度神经网络的训练过程中,每一层的输入数据分布会随着前面层权重的变化而发生改变。这种现象称为 **内部协变量偏移**。由于各层需要不断适应前一层输出的数据分布变化,因此增加了优化难度,导致训练速度变慢甚至难以收敛[^2]。 #### Batch Normalization 的工作原理 Batch Normalization 主要通过对每一批次(mini-batch)的数据进行归一化操作来解决上述问题。具体来说: 1. 对于某一层的激活值 $ x^{(k)} $,计算该批次内的均值 $\mu_B$ 和方差 $\sigma_B^2$: $$ \mu_B = \frac{1}{m} \sum_{i=1}^m x_i^{(k)} $$ $$ \sigma_B^2 = \frac{1}{m} \sum_{i=1}^m (x_i^{(k)} - \mu_B)^2 $$ 2. 使用这些统计量对原始数据进行归一化处理: $$ \hat{x}_i^{(k)} = \frac{x_i^{(k)} - \mu_B}{\sqrt{\sigma_B^2 + \epsilon}} $$ 这里 $\epsilon$ 是一个小常数,用来防止分母为零的情况[^3]。 3. 归一化之后,为了保留数据本身的信息表达能力,引入两个可学习参数 $\gamma$ 和 $\beta$ 来重新缩放和平移数据: $$ y_i^{(k)} = \gamma \cdot \hat{x}_i^{(k)} + \beta $$ 这一过程不仅减少了内部协变量偏移的影响,还增强了模型的学习灵活性。 #### Batch Normalization 的作用 - 加速训练:通过稳定中间层的输入分布,使得梯度下降更加平稳,从而加快收敛速度。 - 减少超参敏感性:允许使用更高的学习率,并降低对初始化条件的要求。 - 正则化效果:由于每次 mini-batch 中的统计数据存在一定的随机性,BN 可以起到类似于 Dropout 的正则化作用,帮助缓解过拟合问题。 #### 测试阶段如何应用 Batch Normalization? 在测试阶段,不再依赖当前 batch 数据的均值和方差,而是采用整个训练集中估计得到的整体均值和方差来进行归一化。这样可以确保预测结果的一致性和稳定性。 ```python import torch.nn as nn class MyModel(nn.Module): def __init__(self, input_size, hidden_size, output_size): super(MyModel, self).__init__() self.fc1 = nn.Linear(input_size, hidden_size) self.bn1 = nn.BatchNorm1d(hidden_size) # 添加 BN 层 self.relu = nn.ReLU() self.fc2 = nn.Linear(hidden_size, output_size) def forward(self, x): out = self.fc1(x) out = self.bn1(out) # 应用 BN 处理 out = self.relu(out) out = self.fc2(out) return out ``` 以上是一个简单的 PyTorch 实现示例,展示了如何将 Batch Normalization 集成到神经网络架构中。 --- ####
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值