为什么要做batch normlization,怎么做batch normlization
- 1. batch normlization
- 1.1 批量归一化是什么:
- 1.2 为什么要做批量归一化:
- 2. feature normalization
- 2.1 特征归一化是什么:
- 2.2 为什么要做特征归一化:
- 3. batch normlization test
1. batch normlization
Batch Normalization(批量归一化)是一种在深度神经网络中常用的技术,特别是在训练期间,用于提高训练速度、稳定性和性能。它由 Sergey Ioffe 和 Christian Szegedy 在 2015 年提出。
1.1 批量归一化是什么:
批量归一化操作涉及对神经网络中的每个小批量(batch)数据进行归一化处理。具体来说,它对每个特征通道(feature map)的激活值进行归一化,使其具有固定的均值和方差。归一化过程如下:
-
计算批次的均值和方差:
对于每个特征通道,计算小批量数据的均值 (\mu_B) 和方差 (\sigma_B^2)。 -
归一化:
使用批次的均值和方差对数据进行归一化,得到:
[ \hat{x} = \frac{x - \mu_B}{\sqrt{\sigma_B^2 + \epsilon}} ]
其中 (\epsilon) 是一个很小的常数,用来保证数值稳定性。 -
缩放和平移:
然后通过两个可学习的参数 (\gamma)(缩放因子)和 (\beta)(偏移量)对归一化后的数据进行缩放和平移:
[ y = \gamma \hat{x} + \beta ]
1.2 为什么要做批量归一化:
-
加速训练:
批量归一化可以显著加速训练过程,因为它减少了训练初期的震荡,使得优化算法能够更快地收敛。 -
提高稳定性:
它使得每层网络的输入分布更加稳定,减少了梯度消失或爆炸的风险。 -
允许更高的学习率:
由于批量归一化减少了深度网络中的内部协变量偏移问题,可以使用更高的学习率,从而加快训练速度。 -
减少对初始化的依赖:
传统的网络训练对权重初始化非常敏感,而批量归一化减少了这种敏感性,使得网络更容易训练。 -
作为正则化:
批量归一化在一定程度上起到了正则化的作用,可以减少过拟合。 -
允许更深层网络:
由于它有助于缓解梯度消失和梯度爆炸问题,因此使得训练更深的网络成为可能。 -
加速收敛:
批量归一化可以使得训练过程中的损失函数更快地下降,从而加速收敛。
尽管批量归一化带来了许多好处,但它也有一些局限性,比如可能会轻微增加模型的计算负担,以及在小批量大小下可能导致训练和推理不一致的问题。在某些情况下,研究者可能会使用其他的归一化技术,如 Layer Normalization、Instance Normalization 或 Group Normalization。
2. feature normalization
Feature normalization(特征归一化)是深度学习和机器学习中用于数据预处理的一种技术,旨在将数据的特征缩放到统一的范围或分布。这通常有助于提高模型的训练效率和性能。
2.1 特征归一化是什么:
特征归一化通常包括以下几种类型:
-
零均值归一化(Zero-Mean Normalization):
将特征的均值调整为0,即通过减去特征的均值来实现。 -
单位方差归一化(Unit Variance Normalization):
将特征缩放到单位方差,即在零均值归一化的基础上,再除以特征的标准差。 -
最小-最大归一化(Min-Max Normalization):
将特征缩放到指定的 [a, b] 范围内,通常是 [0, 1],通过线性变换实现。 -
Z得分归一化(Z-Score Normalization):
基于特征的均值和标准差进行归一化,使得结果具有单位方差和零均值。
2.2 为什么要做特征归一化:
-
提高模型收敛速度:
归一化可以加速基于梯度下降的优化算法的收敛速度,因为梯度在各个方向上的尺度一致。 -
防止某些特征占优:
当特征在不同尺度上时,尺度较大的特征可能会在模型训练中占主导地位,归一化可以避免这种情况。 -
提高模型泛化能力:
归一化有助于模型学习到更加一般化的特征表示,从而提高模型对新数据的泛化能力。 -
稳定训练过程:
归一化可以减少训练过程中的数值不稳定性,如梯度爆炸或消失问题。 -
适应不同模型的需求:
某些模型,如支持向量机(SVM)和 K-近邻(KNN)等,对特征的尺度非常敏感,归一化是这些模型训练的前提。 -
改善模型性能:
在某些情况下,归一化可以显著提高模型的预测精度。 -
便于比较不同特征:
当特征在不同的量纲和尺度时,归一化后可以更容易地比较和组合不同特征。 -
数据预处理的一部分:
特征归一化是数据预处理的重要步骤之一,有助于后续的特征工程和模型训练。
然而,并非所有情况下都需要特征归一化。例如,一些基于树的模型(如决策树、随机森林)和一些深度学习模型(如使用批量归一化的卷积神经网络)可能不依赖于特征的尺度。此外,如果数据集中的特征已经接近归一化,或者特征的尺度对于问题本身具有重要意义,则可能不需要进行归一化。
3. batch normlization test
test 阶段如何获取 train 呢? 如何更新 均值和方差,如果使用pytorch实现,那么pytorch再训练阶段,(假设batch =64) ,在数据陆续进入 train的batch个过程中 , 会维持更新 均值和方差,当test阶段可以调用这个更新的均值和方差