【深度学习】神经网络中,BatchNormalization(批量归一化)层

在神经网络中,BatchNormalization(批量归一化)层计算每一批数据的均值和方差是其核心操作,下面详细介绍其计算方法。

计算均值和方差的基本公式

假设输入数据是一个形状为 (m, n) 的矩阵,其中 m 是批量大小(即一批数据中样本的数量),n 是特征的数量。

均值计算

均值是每一个特征维度上所有样本值的平均值。对于第 j 个特征维度,其均值 μ j \mu_j μj 的计算公式为:
μ j = 1 m ∑ i = 1 m x i j \mu_j = \frac{1}{m} \sum_{i=1}^{m} x_{ij} μj=m1i=1mxij
这里, x i j x_{ij} xij 表示第 i 个样本的第 j 个特征值。也就是说,对于每一个特征维度,将该维度上所有样本的值相加,再除以样本数量 m,就得到了该特征维度的均值。

方差计算

方差衡量的是数据相对于均值的离散程度。对于第 j 个特征维度,其方差 σ j 2 \sigma_j^2 σj2 的计算公式为:
σ j 2 = 1 m ∑ i = 1 m ( x i j − μ j ) 2 \sigma_j^2 = \frac{1}{m} \sum_{i=1}^{m} (x_{ij} - \mu_j)^2 σj2=m1i=1m(xijμj)2
同样是针对每一个特征维度,先计算每个样本的该特征值与该维度均值的差值的平方,然后将这些平方值相加并除以样本数量 m,得到该特征维度的方差。

代码示例

下面是一个使用 Python 和 NumPy 实现手动计算一批数据均值和方差的简单示例:

import numpy as np

# 模拟一批数据,形状为 (m, n)
# m 是批量大小,n 是特征数量
batch_size = 10
num_features = 5
data_batch = np.random.randn(batch_size, num_features)

# 计算每个特征维度的均值
means = np.mean(data_batch, axis=0)

# 计算每个特征维度的方差
variances = np.var(data_batch, axis=0)

print("每个特征维度的均值:", means)
print("每个特征维度的方差:", variances)

在这个示例中:

  1. 首先使用 np.random.randn 函数生成了一个形状为 (batch_size, num_features) 的随机数据矩阵,模拟一批输入数据。
  2. 然后使用 np.mean 函数,通过指定 axis=0,计算每一个特征维度上的均值。
  3. 最后使用 np.var 函数,同样指定 axis=0,计算每一个特征维度上的方差。

BatchNormalization 层中的应用

KerasBatchNormalization 层中,计算得到均值和方差后,会对输入数据进行归一化处理,公式如下:
x ^ i j = x i j − μ j σ j 2 + ϵ \hat{x}_{ij} = \frac{x_{ij} - \mu_j}{\sqrt{\sigma_j^2 + \epsilon}} x^ij=σj2+ϵ xijμj
其中, x ^ i j \hat{x}_{ij} x^ij 是归一化后的第 i 个样本的第 j 个特征值, ϵ \epsilon ϵ 是一个很小的正数,用于防止除零错误。之后,归一化后的数据还会经过缩放和平移操作,以增加模型的表达能力。