
视频元信息
- 课程:吴恩达深度学习专项课程 · 改善深层神经网络(第三周)
- 章节: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