批归一化(BN)在神经网络中的作用与原理
批归一化作为一种有效的神经网络技术,在加速训练、提高泛化能力等方面发挥了重要作用。在实际应用中,需要根据具体情况权衡其优缺点,选择合适的方法和参数设置。同时,对其原理和实现方式的深入理解,有助于更好地应用于实际问题中。
文章目录
1. 批归一化(BN)在神经网络中的作用与原理
1.1 作用与优势
批归一化(Batch Normalization,BN)是一种用于神经网络的技术,通过对每个训练批次的输入进行归一化,加速了神经网络的训练过程。它的作用主要体现在以下几个方面:
- 加速收敛:通过归一化输入特征值,减少了网络训练的迭代次数,加快了收敛速度。
- 改善梯度传播:缓解了梯度消失和爆炸问题,使得深层网络的训练更加稳定。
- 提高泛化能力:降低了网络对超参数的敏感度,提高了模型的泛化能力。
这其实就是一个问题——把学习问题的轮廓,从很长的东西,变成更圆的东西,变得更易于算法优化。
1.2 原理与推导
BN的核心思想是对每个特征进行归一化,以使其均值接近于0,方差接近于1。其具体过程如下:
- 对于每个训练批次,计算该批次输入的均值和方差。
- 使用得到的均值和方差对输入进行归一化。
- 引入可学习的缩放参数和偏移参数,使网络能够学习适应不同数据分布的特征。
数学公式如下:
所以现在 值已经被标准化了(平均值0和标准单位方差),但我们不想让隐藏单元总是如此,也许隐藏单元有了不同的分布会有意义,所以一个很牛的计算是:
其中 和 是模型需要学习的参数,请注意 和 的作用,是无论如何随意设置 的平均值,事实上,如果 ,如果 等于这个分母项( 中的分母), 等于 ,这里的 中的 ,那么 的作用在于,它会精确转化这个方程,如果这些成立(),那么 。
归一化输入特征 是有助于神经网络中的学习的,批归一化(BN) 的作用是一个适用的归一化过程,不只是输入层,甚至同样适用于神经网络中的深度隐藏层。
有了 和 两个参数后,就可以确保所有的 值都是想赋予的值,或者是保证隐藏的单元已使均值和方差标准化,即 无论数据归一化计算时出现多大问题,通过参数都可以调整回来。
2. 将BN应用于神经网络的方法
2.1 训练时的BN
在训练时,BN的操作如下:
- 对每个训练批次进行正向传播,并计算均值和方差。
- 使用计算得到的均值和方差对批次输入进行归一化。
- 引入可学习的缩放参数和偏移参数,调整归一化后的值。
- 在反向传播时,根据梯度更新参数。
2. 将BN应用于神经网络的方法
2.1 训练时的BN
在训练时,BN的操作如下:
- 对每个训练批次进行正向传播,并计算均值和方差。
- 使用计算得到的均值和方差对批次输入进行归一化。
- 引入可学习的缩放参数和偏移参数,调整归一化后的值。
- 在反向传播时,根据梯度更新参数。
数学公式:
上面这些公式都是用来执行 BN。在一个 mini-batch 中,
先对 值求和,计算均值,所以这里只把一个 mini-batch 中的样本都加起来,假设用m来表示这个 mini-batch 中的样本数量,而不是整个训练集。
然后计算方差,再算 ,即用均值和标准差来调整,加上 是为了数值稳定性。 是用 和 再次调整 得到的。
请注意,用于调节计算的 和 是在整个 mini-batch 上进行计算的,但是在测试时,可能不能将一个 mini-batch 中的很多个样本同时处理,因此,需要用其它方式来得到 和 ,而且如果只有一个样本的话,一个样本的均值和方差是没有意义的。
所以实际上,为了将神经网络运用于测试,就需要单独估算 和 ,在典型的 BN 运用中,需要用一个指数加权平均来估算。
总结来说就是,在训练时, 和 是在整个 mini-batch 上计算出来的包含了一定数量的样本,但在测试时,可能需要逐一处理样本,方法是根据训练集估算 和 。
估算的方式有很多种,
理论上可以在最终的网络中运行整个训练集来得到 和 ,但在实际操作中,通常运用指数加权平均来追踪在训练过程中的 和 的值。
还可以用指数加权平均,有时也叫做流动平均,来粗略估算 和 ,然后在测试中使用 和 的值来进行所需的隐藏单元 值的调整。
在实践中,不管用什么方式估算 和 ,这套过程都是比较稳健的,而且如果使用的是某种深度学习框架,通常会有默认的估算 和 的方式,应该会起到比较好的效果。
2.2 测试时的BN
在测试时,需要对每个样本逐一处理,无法使用整个训练集的均值和方差。因此,需要使用一种估算方式来得到均值和方差。
代码示例(Python):
# 在测试时估算均值和方差
def estimate_mean_and_variance(X):
mean = np.mean(X, axis=0)
variance = np.var(X, axis=0)
return mean, variance
# 使用估算的均值和方差对输入进行归一化
def normalize_input(X, mean, variance, epsilon=1e-5):
normalized_X = (X - mean) / np.sqrt(variance + epsilon)
return normalized_X
# 使用缩放参数和偏移参数对归一化后的值进行调整
def scale_and_shift(normalized_X, gamma, beta):
scaled_X = gamma * normalized_X + beta
return scaled_X
在实际应用中,可以根据训练集的均值和方差的估计值来进行归一化。
3. BN的优缺点与适用场景
3.1 优点
- 加速了神经网络的训练过程,提高了收敛速度。
- 提高了模型的泛化能力,降低了过拟合的风险。
- 缓解了梯度消失和爆炸问题,使得深层网络的训练更加稳定。
3.2 缺点
- 需要额外的计算成本,在推理阶段需要对均值和方差进行估算。
- 引入了额外的参数,增加了模型的复杂度。
3.3 适用场景
- 对于深层网络和大规模数据集,BN效果显著,可以加快训练速度。
- 在需要提高模型泛化能力的场景下,BN也是一种有效的正则化方法。
4. 结语
批归一化作为一种有效的神经网络技术,在加速训练、提高泛化能力等方面发挥了重要作用。在实际应用中,需要根据具体情况权衡其优缺点,选择合适的方法和参数设置。同时,对其原理和实现方式的深入理解,有助于更好地应用于实际问题中。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)