Jaison's ink

Back

Bug Defender#

好久没发技术类博客了。原因是最近在学习CS230,而CS230网上早已有人做了笔记。但由于CS230的Coursera部分刻意避免了数学,所以有些东西还是讲得不太清楚,故我也有在写一篇很长的补充。
但是一下子全部一起发布好像意义不大(没法水博客文章数了hhh),故从中抽取一些先发了。

Batch Norm#

为什么要用BatchNorm?#

BatchNorm主要是为了解决内部协变量偏移问题。其和RMSprop一样,都能让地形变得更为平坦。

什么是“内部协变量偏移”#

首先,我们要解释一下什么是“协变量偏移”
这里的“协变量”就只是指输入的X。
“协变量偏移” (Covariate Shift) 被严格定义为:
1. X1X_1X2X_2 的分布不同:
Ptrain(X)Ptest(X)P_{\text{train}}(X) \neq P_{\text{test}}(X)
2. 但 XXYY 之间的潜在关系保持不变:
Ptrain(YX)=Ptest(YX)P_{\text{train}}(Y | X) = P_{\text{test}}(Y | X)
就比如我们原本学习了怎么映射10 - 100的数据,神经网络对于这部分数据的映射极为精确。对于100 - 1000的数据,其实映射的方式是一样的。但是由于神经元没见过这部分数据,所以映射得一塌糊涂。
但是,我们知道,W只要改一点点,输出的Z都会有大变化。这就导致下一层的神经元不仅要学习P(XX)P(X'|X),还需要学习X的分布。这不是我们想要的。(我们只想学习P(XX)P(X'|X),不想花时间学习数据的分布)

而BatchNorm(下文简称BN)可以解决这个问题。
它会在训练开始时,先将每一个Z层的分布转化为以0为中心,方差为1的标准正态分布。
这样每一个神经元的激活函数,都拥有了一个以0为中心的“锚点”。

问题一:标准化会降低模型自由度#

聪明的你或许会发现这里有问题:
1、几乎所有激活函数在0附近都是线性的,BN不会导致整个神经网络的非线性学习能力下降吗?(即简化为线性神经网络?)

BN的创造者也想到了这个问题,所以他们在标准化强制归零: znorm=(zμbatch)/σbatchz_{norm} = (z - \mu_{\text{batch}}) / \sigma_{\text{batch}}之后,又给标准化后的输出加了一个可学习层: z^=γznorm+β\hat{z} = \gamma \cdot z_{norm} + \beta,这就重塑了分布(不是数据的样子),现在锚点可变(β\beta),锚点系的绳子长度也可变(即方差γ2\gamma^2

问题二:γ\gammaβ\beta也会造成漂移?#

聪明的你或许会发现这里又有问题:
2、那既然γ\gammaβ\beta是可学习的,那他们也会“漂移”,那不又类似于“内部协变量漂移”了吗?

其实并不一样。因为γ\gammaβ\beta是像WW一样缓慢学习的参数,不会像Z一样偏移得那么厉害。

问题三:测试/应用时只有一个样本,没法标准化?#

还有个在训练时和在测试/应用时不一样的问题:
3、训练时我们可以计算每个mini-batch方差and均值,但是在测试/应用中我们只有一个输入样本,没法计算方差and均值啊?
其实,BN在训练过程中,还悄悄记录了整体训练样本的方差and均值。测试/应用时,我们默认输入来自于这个整体方差and均值的分布。

补充一:一定的正则化效果#

另外 BN 还有一定的正则化效果(防止过拟合),因为每一次 BN所用到的都是mini-batch的方差and均值,这就相当于给每层输入都添加了一点噪声,让神经元不要过度学习具体数值。

补充二:γ\gammaβ\beta 的“初始化”#

  • 标准初始化: γ\gamma (缩放) 初始化为 1β\beta (平移) 初始化为 0
    这意味着在训练刚开始时,BN 层“什么都不做”(除了标准化)。它就是一个纯粹的 N(0,1)\text{N}(0, 1) 标准化器。然后它再慢慢通过训练,去学习 γ\gammaβ\beta 到底应该是多少。

补充三:记录全局均值和方差用的其实是指数移动平均(而不是简单平均)。#

WHY?

  • “冷启动”问题: 这种平均方法给了所有批次相同的权重
    • 这有什么不好? 在训练刚开始时(比如前 1000 步),网络的权重 WW 还是随机的、一塌糊涂的。
    • 此时产出的 zz,以及计算出的 μbatch\mu_{\text{batch}}σbatch2\sigma^2_{\text{batch}}完全没有代表性,可以说是“垃圾数据”。
    • 如果用“简单平均”,这些“垃圾数据”会**永久地“污染”**你的全局平均值。即使训练到后期,这些早期的数据也始终占有 1/N1/N 的权重,拖慢你的平均值“跟上”新状态的速度。
      μpop, new=momentumμpop, old+(1momentum)μbatch, current\mu_{\text{pop, new}} = \text{momentum} \cdot \mu_{\text{pop, old}} + (1 - \text{momentum}) \cdot \mu_{\text{batch, current}}

RMSpropVS Batch Norm#

要注意RMSprop和BN较为容易混淆,因为都用到了“标准化”这一工具。
但是BN是用于正向传播过程的(也间接作用在了反向传播过程的计算梯度中),而RMSprop是反向传播中对梯度的修正。

  1. BN (地形平整器) 先把损失函数这个“地图”变得非常平滑。

  2. RMSprop (智能登山车) 在这个“平滑”的地图上行驶。

    • 因为地图已经很平滑了,RMSprop 就可以大胆地使用更大的学习率(油门)

    • 同时,RMSprop 依然在工作:当它遇到一个(BN 没能完全烫平的)小斜坡时(gg 很大),它会自动“松油门”(除以 E[g2]\sqrt{E[g^2]});当它在一个平原上时(gg 很小),它会“踩油门”。

啥是Batch Norm?
https://jaison.ink/blog/batchnorm/%E5%95%A5%E6%98%AFbatch-norm
Author Jaison
Published at October 30, 2025
Loading comments…