批量归一化(Batch Normalization)是一种广泛使用的技术,它可以加速深度神经网络的训练,提高模型的泛化能力。
批量归一化的主要思想是:在激活函数之前对网络中的每一层进行归一化处理,即对该层上的每个神经元,使其特征值不断调整为高斯分布(均值为0,标准差为1)。
具体步骤为:
- 计算特征的均值和标准差
- 每个特征值减去均值,再除以标准差,使特征变换为高斯分布
- 可利用可学习参数γ和β进一步缩放和偏移特征值
- 将第3步的结果输入到激活函数
代码示例:
python
import numpy as np
# 一批数据
x = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
# 计算均值和标准差
mean = np.mean(x, axis=0) # [4, 5, 6]
std = np.std(x, axis=0) # [3, 3, 3]
# 归一化
x_norm = (x - mean) / std # [[-1, -1, -1],
# [ 0, 0, 0],
# [ 1, 1, 1]]
# 缩放和偏移
gamma = np.array([1.5, 2, 1])
beta = np.array([1, 0.5, 1])
x_norm_scale = gamma * x_norm + beta
# [[ 0.5, 0.5, 0 ],
# [ 2. , 2. , 2. ],
# [ 4. , 3.5, 3. ]]
可以看出,批量归一化通过减去均值和除以标准差,使得特征值变为高斯分布,然后利用γ和β再进行缩放和偏移,最终达到神经网络各层的特征值分布比较统一的目的。
所以,批量归一化的主要作用是:
- 使得每一层的输入特征值维持在一个相对较小的范围内,加速学习速度。
- 避免梯度消失或爆炸,加快模型的收敛。
- 减小模型对网络初始化的依赖,提高模型的泛化性。
批量归一化在训练深度神经网络时显示出很好的效果。它通过简单的归一化处理,可以极大提高模型的训练速度,提高最终模型的泛化性能。所以,理解批量归一化的原理和作用,对于我们训练深度神经网络很有帮助。