聊聊深度学习中的BN和LN

在一个深度神经网络中,每一层的神经网络参数发生变化会影响其上层的输入数据分布,又因为DP的网络深度较大,这样层层叠加,导致高层的输入分布变化较大,使得高层的参数需要不断的去适应底层的参数更新。导致神经网络难以训练。

这听起来很糟糕,那么有什么方案去解决这个问题呢?
我们可以为每一层都设立不同的学习率、不同的初始化策略等,去解决这个问题。但是这样的解决方案非常麻烦,而且需要很多人为的经验。而Normalization能够较好的解决该问题,且不需要为每一层单独设置学习率等。

什么是Normalization

上节说到,高层的输入数据由于底层的参数变化发生剧烈震荡,那么在送入上层神经元之前,首先对数据进行平移和伸缩变化,使其分布规范化成在固定区间的标准分布。进一步的,假设有输入向量 x = ( x 1 , x 2 , ⋯   , x d ) x=(x_1,x_2,\cdots,x_d) x=(x1,x2,

### Batch Normalization是什么? Batch Normalization(简称BN)是一种在深度学习中广泛使用的优化技术,由Sergey IoffeChristian Szegedy于2015年提出,旨在加速深度神经网络的训练过程并提高模型的稳定性。其核心思想是对神经网络中每一层的输入进行标准化处理,使得输入数据的分布更加稳定,从而减少内部协变量偏移(Internal Covariate Shift)[^2]。 具体来说,BN通过对每个小批量(Batch)数据进行归一化操作,使得每层的输入服从均值为0、方差为1的分布。在此基础上,BN还引入了两个可学习的参数(缩放因子γ偏移因子β),用于恢复数据的表达能力,从而保证归一化不会降低模型的表示能力[^1]。 ### Batch Normalization的作用 1. **加速训练过程** BN通过减少内部协变量偏移,使得每一层的输入分布更加稳定,从而加快了网络的训练速度。实验表明,使用BN后可以使用更高的学习率,并减少对初始化的敏感度。 2. **提升模型稳定性** BN在训练过程中对每个Batch的数据进行标准化处理,使得网络各层的输入分布更加一致,从而提高了训练过程的稳定性[^3]。 3. **缓解梯度消失梯度爆炸问题** 在深层神经网络中,梯度消失梯度爆炸是常见的问题。BN通过对输入进行归一化,有助于保持各层激活值的合理分布,从而减轻这些问题的影响。 4. **具有一定的正则化效果** BN在训练时使用的是每个Batch的均值方差,因此在一定程度上引入了噪声,这有助于防止模型过拟合。在某些情况下,BN可以部分替代Dropout等正则化方法。 5. **允许使用更大的学习率** 由于BN提升了训练的稳定性,因此可以使用更大的学习率进行训练,而不会导致训练过程发散,从而进一步加快收敛速度[^3]。 ### Batch Normalization的实现流程 1. 计算当前Batch的均值方差。 2. 对该Batch中的每个样本进行标准化,使其均值为0,方差为1。 3. 引入可学习的缩放参数γ偏移参数β,对标准化后的数据进行线性变换,以保留网络的表达能力。 4. 在训练过程中,BN层还会维护一个全局的均值方差,用于推理阶段的数据处理。 ### Batch Normalization的数学表达 对于一个输入张量 $ x $,BN的计算过程如下: - 计算Batch的均值: $$ \mu_B = \frac{1}{m} \sum_{i=1}^{m} x_i $$ - 计算Batch的方差: $$ \sigma_B^2 = \frac{1}{m} \sum_{i=1}^{m} (x_i - \mu_B)^2 $$ - 标准化: $$ \hat{x}_i = \frac{x_i - \mu_B}{\sqrt{\sigma_B^2 + \epsilon}} $$ - 缩放与偏移: $$ y_i = \gamma \hat{x}_i + \beta $$ 其中,$\epsilon$ 是一个很小的常数,用于防止除零错误,$\gamma$ $\beta$ 是可学习的参数。 ### Batch Normalization的代码示例 以下是一个简单的PyTorch实现: ```python import torch import torch.nn as nn # 定义一个包含Batch Normalization的卷积层 class ConvBNReLU(nn.Module): def __init__(self, in_channels, out_channels, kernel_size, stride=1): super(ConvBNReLU, self).__init__() self.conv = nn.Conv2d(in_channels, out_channels, kernel_size, stride, padding=kernel_size//2) self.bn = nn.BatchNorm2d(out_channels) self.relu = nn.ReLU(inplace=True) def forward(self, x): x = self.conv(x) x = self.bn(x) x = self.relu(x) return x ``` 在该示例中,`nn.BatchNorm2d` 是PyTorch提供的Batch Normalization层,适用于2D卷积网络。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值