Batch Normalization解读

本文探讨了在深度学习中内部方差漂移的问题及其解决方案。介绍了如何通过归一化步骤固定每一层输入的均值和方差,使用ReLU激活函数及小心的初始化等方法来缓解梯度消失现象。

介绍

每一层的输入被之前所有层的参数影响着,所以当网络中的参数有一个很小的变化时,这个变化会随着网络的加深而变大。

covrate shift

令q1(x)表示对预测表现进行评价时,x的密度。令q0(x)表示观测数据x的密度。当q1(x)不等于q0(x)就叫做covrate shift。covrate shift 是怎么产生的呢,因为q0(x)是由采样方式决定的,q1(x)是由总体决定的,在回归分析中,covrate shift经常发生,因为实际情况会受资源限制或者实验方式影响。在人工神经网络中,“动态学习”是一种典型的情况,我们控制q0(x)为了更好地预测。我们可以说,未来x的观测分布和过去是不同的,未来的x分布没有必要和q1(x)相同,但是我们可以给一个虚拟的q1(x)去限制x在一个预测精度可控的范围内。

为什么会产生梯度消失导致训练速度下降

解决方法:激活函数用ReLu、小心的初始化

因此,作者提出了消除内部方差漂移的方法。使用一个新的机制来实现这个想法。它是通过归一化步骤固定每一层的输入的均值和方差。而且此方法可以不受参数规模的限制,或者参数的初始化值的限制,可以减少Dropout的使用。

减少内部方差

内部方差漂移:在训练期间网络参数的改变导致的网络激活值分布的改变。

怎么消除他呢,在训练过程中固定输入x的分布。众所周知,乐村在一篇文章中提过,如果输入是白化的话,网络训练就会收敛的更快,比如,线性的变换为零均值,单位方差,去相关就可以。如果每一层观察到的输入是由底下每一层产生的,这将有利于对每一层的输入实现白化。通过白化每一层的输入,我就可以达到固定输入分布的目的,就可以消除内部方差漂移的不好影响。

我们想白化激活值在训练的每一步,或者是间隔,通过直接修改网络或者改变优化算法的参数去依赖网络的激活值。然而,如果这些修改散布在优化步骤中,那么梯度下降中也许企图更新参数用要求被更新的归一化的方法,这样就会减少梯度的影响。

看不懂待续。。


### 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 集成到神经网络架构中。 --- ####
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值