视频封面

视频元信息

  • 课程:吴恩达深度学习专项课程 · 改善深层神经网络(第三周)
  • 章节:3.7 测试时的 Batch Norm(Batch Norm at Test Time)
  • 时长:约 5~6 分钟
  • 语言:官方中英双语字幕

内容摘要(TL;DR)

本视频讲解 Batch Norm 在测试(推理)阶段如何处理。训练时 μ 和 σ² 来自整个 mini-batch,但测试时可能一次只处理一个样本,无法计算 batch 统计量。解决方案是用训练过程中累积的指数加权平均(running average)来估计 μ 和 σ²,再用于测试时的归一化。该方法对具体估计方式不敏感,主流深度学习框架都有默认实现。


一、问题引入:训练与测试的差异 [00:00]

核心矛盾:训练时 Batch Norm 依赖一个 mini-batch 的样本计算均值和方差;但测试时可能只有一个样本,无法计算 batch 统计量。

  • 训练时,Batch Norm 对每个 mini-batch 计算:

    • μ = (1/m) Σ z⁽ⁱ⁾(该 batch 内隐藏层 z 的均值)
    • σ² = (1/m) Σ (z⁽ⁱ⁾ − μ)²(该 batch 内 z 的方差)
    • 然后用 z_norm = (z − μ) / √(σ² + ε) 归一化,再用 γ、β 缩放平移。
  • 测试时的问题:你可能需要一次只处理一个样本(比如在线预测、单张图片推理),此时:

    • 一个样本的"均值"就是它自己,"方差"为 0,归一化毫无意义;
    • 无法像训练那样从一个 mini-batch 中获取 μ 和 σ²。

理解:Batch Norm 本质上是一种依赖 batch 的归一化操作,它把"batch 内相对关系"作为归一化基准。一旦 batch 退化为单样本,这个基准就失效了,所以必须换一种方式提供 μ 和 σ²。


二、解决方案:用指数加权平均估计 μ 和 σ² [02:23]

核心方法:在训练过程中,对每个 mini-batch 计算出的 μ 和 σ² 做指数加权平均(exponentially weighted average),累积得到全局估计值,测试时直接使用。

  • 训练时,除了正常的 Batch Norm 前向传播外,额外记录每个 mini-batch 的 μ 和 σ²。
  • 用指数加权平均(也叫 running average / 滑动平均)不断更新:
    • μ_running ← β · μ_running + (1 − β) · μ_batch
    • σ²_running ← β · σ²_running + (1 − β) · σ²_batch
  • 测试时,用累积得到的 μ_running 和 σ²_running 代替 batch 统计量,对隐藏单元值 z 做归一化。

推导:这与之前学过的"用指数加权平均估计当前温度"是同一个技巧。β 通常取 0.9、0.99 等,相当于对最近若干个 batch 的统计量做加权平均,越近的 batch 权重越大。

思考:为什么可以这样做?因为训练集和测试集假设来自同一分布,训练过程中累积的 μ、σ² 是对整个训练数据分布统计量的良好近似,测试样本也服从这个分布,所以用训练累积值来归一化是合理的。

  • 视频原话要点:
    • "during training time, μ and σ² are computed on an entire mini-batch"
    • "at test time, you might need to process a single example at a time"
    • "estimate μ and σ² from your training set"
    • "implement an exponentially weighted average ... also called a running average"

三、其他可选做法与鲁棒性 [04:36]

易错点:不要纠结于"必须用哪种方法估计 μ 和 σ²",实践表明这个过程对具体估计方式相当鲁棒(robust)。

  • 理论上的另一种做法:

    • 把整个训练集跑一遍最终网络,统计每层 z 的均值和方差。
    • 但实际中很少这么做,因为计算成本高,且效果与指数加权平均差别不大。
  • 实践中常用的做法:

    • 指数加权平均 / running average(最主流)。
    • 深度学习框架(TensorFlow、PyTorch 等)通常有默认的估计方式,开箱即用,效果一般都不错。
  • 视频原话要点:

    • "this process is pretty robust to the exact way you used to estimate μ and σ²"
    • "I wouldn't worry too much about exactly how you do this"
    • "if you're using a deep learning framework, they'll usually have some default way"
    • "any reasonable way to estimate the mean and variance ... should work fine at test"

理解:这说明 Batch Norm 的测试阶段实现并不"娇贵",只要 μ、σ² 的估计大致反映训练数据分布,归一化就能正常工作。这也是为什么框架作者可以放心地给出一个默认实现。


四、知识小结与承上启下 [05:28]

  • Batch Norm 让训练更深的网络成为可能,并加速学习算法收敛。
  • 训练时:μ、σ² 来自 mini-batch。
  • 测试时:μ、σ² 来自训练过程中累积的 running average。
  • 视频结尾预告:下一节将讨论深度学习框架(deep learning frameworks)的相关思考。

视频原话:"So that's it for Batch Norm and using it, I think you'll be able to train much deeper networks and get your learning algorithm to run much more quickly. But before we wrap up for this week, I want to share a few thoughts on deep learning frameworks as well."


五、拓展与踩坑提示

【拓展】为什么测试时不能用测试样本自身的统计量?

  • 如果测试时用单个样本自己算均值和方差,归一化后 z_norm 恒为 0(因为减自身均值、除自身标准差),信息全部丢失。
  • 即使测试时凑一个 batch,batch 内样本之间会相互影响,导致同一张图片在不同 batch 中输出不同,这在推理场景中是不可接受的。
  • 因此必须用与输入无关的、固定的 μ、σ²,即训练阶段累积的估计值。

【拓展】训练/测试行为不一致的常见坑

  • 框架默认行为:PyTorch 中 model.train() 与 model.eval() 会切换 BatchNorm 的行为,忘记切换是新手常见错误——推理时若仍处于 train 模式,会用当前 batch 统计量,结果不稳定。
  • 小 batch 问题:训练时若 batch size 很小(如 1、2),batch 统计量噪声极大,running average 也会被污染,建议用更大的 batch 或改用 Group Norm、Layer Norm。
  • 分布式训练:多卡训练时 BatchNorm 的统计量通常跨卡同步(SyncBN),否则每个卡上的 running average 只反映局部数据。

【拓展】指数加权平均的偏差修正

  • 训练初期,running average 从 0 初始化,前几个 batch 的估计会偏小。吴恩达在之前的课程中提到过偏差修正(bias correction):用 μ_running / (1 − β^t) 修正,t 为当前步数。
  • 不过对于 Batch Norm 的 running average,很多框架并不做偏差修正,因为训练步数通常很多,初期偏差很快被稀释,影响可忽略。

关键标签 / 关键词

Batch Norm 测试时归一化 推理阶段 指数加权平均 running average 滑动平均 μ 和 σ² 估计 mini-batch 深度学习框架 吴恩达深度学习 改善深层神经网络 PyTorch eval 模式 偏差修正


生成时间:2026-10-10 22:20:28 生成平台:VideoNote www.xygy.top