正如我们在上一节中讨论的,训练期间层输入分布的变化,被称为内部协变量偏移,会使深度网络的训练过程变得极为复杂。这迫使我们使用较小的学习率和仔细的参数初始化,减缓收敛速度,并使训练更易出错。批归一化(BN)由Sergey Ioffe和Christian Szegedy于2015年提出,旨在解决深度网络训练过程中层输入分布不断变化的问题。其主要思想直接而有效:在训练期间,对每个小批量的层输入进行归一化。BN的目标是使这些输入的均值和方差保持更稳定,而不是让层输入的分布发生剧烈变化。可以设想一下我们如何对机器学习模型的输入特征进行标准化(例如,减去均值并除以标准差)。批归一化采用类似的方法,但它是在网络内部对特定层的输入进行操作。具体来说,对于给定层,批归一化在小批量训练期间执行以下步骤:计算小批量统计量: 它计算当前小批量 $ \mathcal{B} $ 中层输入的均值 ($ \mu_{\mathcal{B}} $) 和方差 ($ \sigma^2_{\mathcal{B}} $)。归一化: 它使用这些统计量对小批量中的每个输入 $ x_i $ 进行归一化: $$ \hat{x}i = \frac{x_i - \mu{\mathcal{B}}}{\sqrt{\sigma^2_{\mathcal{B}} + \epsilon}} $$ 这里,$ \epsilon $ 是一个用于数值稳定的小常数(以避免方差非常小时发生除零错误)。缩放与偏移: 归一化后的值 $ \hat{x}i $ 随后通过可学习参数 $ \gamma $ (gamma) 进行缩放,并通过另一个可学习参数 $ \beta $ (beta) 进行偏移: $$ y_i = \gamma \hat{x}i + \beta $$ 这些 $ \gamma $ 和 $ \beta $ 参数在训练期间与网络的权重一同被学习。它们允许网络在对下一层所需的表示形式最佳时,潜在地撤销归一化。如果网络学习到 $ \gamma = \sqrt{\sigma^2{\mathcal{B}} + \epsilon} $ 和 $ \beta = \mu{\mathcal{B}} $,它能有效地恢复原始激活。然而,在实践中,网络会学习到有助于稳定训练的最佳 $ \gamma $ 和 $ \beta $ 值。整个操作通常插入在层的激活函数之前。例如,在全连接层中,顺序可能是:线性变换 -> 批归一化 -> 激活函数(例如ReLU)。digraph G { rankdir=LR; node [shape=box, style=rounded, fontname="Helvetica"]; edge [fontname="Helvetica"]; subgraph cluster_0 { label = "标准层"; style=dashed; color="#adb5bd"; Input -> Linear [label="z = Wx + b"]; Linear -> Activation [label="a = g(z)"]; Activation -> Output; } subgraph cluster_1 { label = "带有批归一化的层"; style=dashed; color="#adb5bd"; Input_BN [label="输入"]; Linear_BN [label="线性"]; BN [label="批归一化\n(归一化, 缩放+偏移)", shape=ellipse, style=filled, fillcolor="#a5d8ff"]; Activation_BN [label="激活"]; Output_BN [label="输出"]; Input_BN -> Linear_BN [label="z = Wx + b"]; Linear_BN -> BN [label="输入到BN: z"]; BN -> Activation_BN [label="输入到激活函数: y = γẑ + β"]; Activation_BN -> Output_BN [label="a = g(y)"]; } } 标准层与在激活函数前加入批归一化的层之间数据流的比较。通过对每个小批量内的输入进行归一化,批归一化有助于稳定学习过程。这种稳定性通常允许使用更高的学习率,极大地加快训练速度。此外,它减少了对仔细初始化的依赖,并可作为一种正则化形式,有时减少了对Dropout等其他技术的需求。我们将在接下来的章节中考察前向和反向传播的精确计算、它在测试(推理)期间的行为以及它的各种好处。目前,请理解批归一化是一个插入到网络架构中的强大工具,用于调节激活的内部统计量并促进更稳定高效的训练。