BN踩坑记--谈一下Batch Normalization的优缺点和适用场景

本文讨论了BatchNormalization(BN)的优缺点,包括解决内部协变量偏移和梯度饱和,但强调了在小批量、RNN和测试阶段的局限性。文章指出BN在MLP和CNN中表现良好,但在动态文本模型如RNN中的效果较差,推荐关注层归一化在NLP中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

BN踩坑记–谈一下Batch Normalization的优缺点和适用场景

这个问题没有定论,很多人都在探索,所以只是聊一下我自己的理解,顺便为讲 layer-norm做个引子。

BN的理解重点在于它是针对整个Batch中的样本在同一维度特征在做处理。

在MLP中,比如我们有10行5列数据。5列代表特征,10行代表10个样本。是对第一个特征这一列(对应10个样本)做一次处理,第二个特征(同样是一列)做一次处理,依次类推。

在CNN中扩展,我们的数据是N·C·H·W。其中N为样本数量也就是batch_size,C为通道数,H为高,W为宽,BN保留C通道数,在N,H,W上做操作。比如说把第一个样本的第一个通道的数据,第二个样本第一个通道的数据…第N个样本第一个通道的数据作为原始数据,处理得到相应的均值和方差。

BN有两个优点。

第一个就是可以解决内部协变量偏移,简单来说训练过程中,各层分布不同,增大了学习难度,BN缓解了这个问题。当然后来也有论文证明BN有作用和这个没关系,而是可以使损失平面更加的平滑,从而加快的收敛速度。

第二个优点就是缓解了梯度饱和问题(如果使用sigmoid激活函数的话),加快收敛。

BN的缺点:

第一个,batch_size较小的时候,效果差。这一点很容易理解。BN的过程,使用 整个batch中样本的均值和方差来模拟全部数据的均值和方差,在batch_size 较小的时候,效果肯定不好。

第二个缺点就是 BN 在RNN中效果比较差。这一点和第一点原因很类似,不过我单挑出来说。

首先我们要意识到一点,就是RNN的输入是长度是动态的,就是说每个样本的长度是不一样的。

举个最简单的例子,比如 batch_size 为10,也就是我有10个样本,其中9个样本长度为5,第10个样本长度为20。

那么问题来了,前五个单词的均值和方差都可以在这个batch中求出来从而模型真实均值和方差。但是第6个单词到底20个单词怎么办?

只用这一个样本进行模型的话,不就是回到了第一点,batch太小,导致效果很差。

第三个缺点就是在测试阶段的问题,分三部分说。

首先测试的时候,我们可以在队列里拉一个batch进去进行计算,但是也有情况是来一个必须尽快出来一个,也就是batch为1,这个时候均值和方差怎么办?

这个一般是在训练的时候就把均值和方差保存下来,测试的时候直接用就可以。那么选取效果好的均值和方差就是个问题。

其次在测试的时候,遇到一个样本长度为1000的样本,在训练的时候最大长度为600,那么后面400个单词的均值和方差在训练数据没碰到过,这个时候怎么办?

这个问题我们一般是在数据处理的时候就会做截断。

还有一个问题就是就是训练集和测试集的均值和方差相差比较大,那么训练集的均值和方差就不能很好的反应你测试数据特性,效果就回差。这个时候就和你的数据处理有关系了。

BN使用场景

对于使用场景来说,BN在MLP和CNN上使用的效果都比较好,在RNN这种动态文本模型上使用的比较差。至于为啥NLP领域BN效果会差,Layer norm 效果会好,下一个文章会详细聊聊我的理解。

列一下参考资料:

模型优化之Batch Normalization - 大师兄的文章 - 知乎 https://zhuanlan.zhihu.com/p/54171297

这个文章写的很好,推荐,从BN的特点(ICS/梯度饱和),训练,测试以及损失函数平滑都讲了一下。

李宏毅- Batch Normalization https://www.bilibili.com/video/av16540598/

大佬的讲解视频,不解释,推荐

各种Normalization - Mr.Y的文章 - 知乎 https://zhuanlan.zhihu.com/p/86765356

这个文章关于BN在CNN中使用的讲解很好,推荐一下。

Batch NormalizationLayer Normalization都是常用的深度学习网络中的归一化技术,可以加速模型收敛,提高模型的泛化能力。它们的原理公式如下: 1. Batch Normalization Batch Normalization(简称BN)是在每个Batch中对每个神经元的输出进行归一化,使得每个神经元的输出都服从标准正态分布,公式如下: $$\hat{x_i} = \frac{x_i - \mu_B}{\sqrt{\sigma_B^2 + \epsilon}}$$ 其中,$\hat{x_i}$是归一化后的神经元输出,$x_i$是未归一化的神经元输出,$\mu_B$是Batch中所有神经元输出的均值,$\sigma_B^2$是Batch中所有神经元输出的方差,$\epsilon$是一个极小值,防止分母为0。 在归一化后,还需要对神经元输出进行缩放平移,即: $$y_i = \gamma \hat{x_i} + \beta$$ 其中,$\gamma$$\beta$是可学习的参数,用于缩放平移神经元输出。 2. Layer NormalizationBatch Normalization不同,Layer Normalization(简称LN)是对每个神经元的输入进行归一化,使得每个神经元的输入都服从标准正态分布,公式如下: $$\hat{x_i} = \frac{x_i - \mu_L}{\sqrt{\sigma_L^2 + \epsilon}}$$ 其中,$\hat{x_i}$是归一化后的神经元输入,$x_i$是未归一化的神经元输入,$\mu_L$是该层所有神经元输入的均值,$\sigma_L^2$是该层所有神经元输入的方差,$\epsilon$是一个极小值,防止分母为0。 在归一化后,还需要对神经元输入进行缩放平移,即: $$y_i = \gamma \hat{x_i} + \beta$$ 其中,$\gamma$$\beta$是可学习的参数,用于缩放平移神经元输入。 3. 优缺点 Batch Normalization的优点是可以加速模型收敛,提高模型的泛化能力,但它需要对每个Batch中的数据进行归一化,因此需要较大的Batch Size才能获得较好的效果;另外,BN对网络的最终表现有一定的贡献,但对于网络的可解释性来说,BN会使得网络的特征变得更加难以理解。 Layer Normalization的优点是不需要较大的Batch Size即可获得较好的效果,同时LN可以使得每个神经元的输入都服从标准正态分布,因此可以提高模型的泛化能力;另外,LN对于网络的可解释性来说更好,因为它不涉及Batch的处理。 但是,Layer Normalization缺点是在训练过程中,它只考虑了当前层的神经元输入,而忽略了上一层下一层的影响,因此可能会导致模型收敛速度较慢。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

onnx

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

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

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

打赏作者

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

抵扣说明:

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

余额充值