Batch normalization分析

深入理解BatchNormalization:原理、优势与局限
本文探讨了批量归一化(BN)在深度学习中的工作原理,如何通过限制协变量位移加速训练,以及其实践中的优缺点,包括对批大小依赖和RNN应用的挑战。

Batch normalization分析

为简洁起见,下文中将batch normalization简写为BN

优点:

  1. BN使得训练过程中可以用更大的学习率,加速学习过程
  2. 网络引入BN之后,可以利用sigmoid函数,使得容易出现的梯度淹没问题得到了解决。
  3. 在此基础上出现了layer normalization和weighted normalization

缺点:

虽然技术成熟,但在实践过程中也很容易出现问题。BN过程虽然简单,但其真正有效的原因比看起来复杂(并不只是协变量位移那么简单)。

本文旨在描述BN的工作原理,进而解答其之所以可以广泛应用的内在原因。

1. Covariate Shift(协变量位移)

Covariate shift一词出现在BN原文标题中,它是指学习算法中输入值分布的变化。这不是深度学习所独有的问题。例如当训练集和测试集数据源完全不同(比方说训练集来自网络爬图,测试集都是iphone拍摄的图像),那么二者分布就会不同。covariance shift之所以是一个问题,在于机器学习算法的行为会根据输入数据的分布而发生改变。
在机器学习上下文中,我们尤为关心网络内部节点输入的分布变化。神经网络在整个训练过程中会不断变化每层的权重。这就意味着每层激活函数输出也会变化。前一层的激活值即为后一层的输入。也就是说,在训练过程中,神经网络的每一层都面临着每步迭代其输入分布都会发生变化的局面。这样是又问题的,因为这就强迫每个中间层都需要不断地适应其输入变化的分布。
batch normalization最基本的思想就是用归一化每一层的activations来限制covariate shift(将每层输入变为均值为0,方差为1的数据分布)。这样,理论上使得每层的输入具有更稳定的分布,由此可以加速神经网络的训练过程。
实际应用过程中,如果将每层的activations都严格变为均值为0,方差为1的数据分布会限制网络的表达能力。由此,在实践中,BN允许网络学习合适其自身的网络参数 β \beta β γ \gamma γ

BN算法

原始的BN论文
deeplearning.ai讲座

2. 高阶影响

(待续)

3. BN的局限性

最关键的局限在于其取决于mini-batch。BN过程是按照每个mini-batch计算均值和方差,并将特征数据按照mini-batch数据归一化。这就意味着每个mini-batch的均值和方差不同。这种依赖会带来两个问题:

3.1 batch size不能太小

很明显,batch size为1时,无法用BN。但当batch size稍大一点儿的时候也会出问题。理论上我们想用全局的均值和方差归一化输入数据,但是每次迭代都针对整个数据库计算均值和方差,计算量太大,因此改为mini-batch形式估计均值和方法。这种简单的均值和方差估计意味着结果中有一定量的误差,并且在每个mini-batch是不同的。更小的batch size会加大这些估计的方差,也就意味着在利用BN+SGD时要注意batch size。

3.2 难以在RNN网络的recurrent connection中应用

注:本文内容部分翻译自An Intuitive Explanation of Why Batch Normalization Really Works (Normalization in Deep Learning Part 1)

`BatchNormalization` 是深度学习中一种非常重要的技术,用于加速神经网络的训练并提高模型的稳定性。它是通过规范化每一批数据的输入来实现的,使得每一层的输入具有相对稳定的分布。 以下是使用 TensorFlow 中 `BatchNormalization` 的方法和解释: ### 实现代码 ```python import tensorflow as tf from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense, BatchNormalization # 构建一个简单的神经网络模型,并在其中加入BatchNormalization层 model = Sequential([ Dense(64, activation='relu', input_shape=(100,)), # 输入层 BatchNormalization(), # 批量归一化层 Dense(64, activation='relu'), # 隐藏层 BatchNormalization(), # 批量归一化层 Dense(10, activation='softmax') # 输出层 ]) # 编译模型 model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy']) # 打印模型结构 model.summary() ``` --- ### 解释 1. **什么是批量归一化(Batch Normalization)?** - 批量归一化是一种用来解决内部协变量偏移(Internal Covariate Shift)的技术。它通过对每一批数据进行归一化处理,使得每一层的输入都具有稳定的分布,从而加快训练速度并提高模型性能。 - 在训练过程中,`BatchNormalization` 层会对每一批数据计算均值和方差,并将数据归一化到零均值和单位方差。 2. **`BatchNormalization` 层的作用:** - 在训练阶段: - 计算当前批次数据的均值和方差。 - 使用这些统计量对数据进行归一化。 - 引入两个可学习参数:`gamma` 和 `beta`,分别用于缩放和偏移归一化后的数据。 - 在推理阶段: - 使用整个训练集的移动平均均值和方差代替批次的均值和方差。 3. **代码中的关键点:** - `BatchNormalization()`:这是 TensorFlow 提供的一个内置层,可以直接插入到神经网络中。 - `Dense` 层:表示全连接层,`activation='relu'` 表示使用 ReLU 激活函数。 - `input_shape=(100,)`:表示输入数据的形状为 100 维。 4. **为什么需要 `BatchNormalization`?** - 加快训练速度:通过减少梯度消失或爆炸问题,使模型更快收敛。 - 减少对超参数的敏感性:允许使用更高的学习率。 - 正则化效果:在一定程度上可以减少过拟合。 --- ### 注意事项 - `BatchNormalization` 层通常放在激活函数之前或之后,具体位置取决于实际需求。 - 在小型数据集或批次大小较小时,`BatchNormalization` 可能会导致不稳定的结果,因为每批数据的统计量可能不够准确。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值