Tailwind CSSTailwind CSS
Home
  • Tailwind CSS 书籍目录
  • Vue 3 开发实战指南
  • React 和 Next.js 学习
  • TypeScript
  • React开发框架书籍大纲
  • Shadcn学习大纲
  • Swift 编程语言:从入门到进阶
  • SwiftUI 学习指南
  • 函数式编程大纲
  • Swift 异步编程语言
  • Swift 协议化编程
  • SwiftUI MVVM 开发模式
  • SwiftUI 图表开发书籍
  • SwiftData
  • ArkTS编程语言:从入门到精通
  • 仓颉编程语言:从入门到精通
  • 鸿蒙手机客户端开发实战
  • WPF书籍
  • C#开发书籍
learn
  • Java编程语言
  • Kotlin 编程入门与实战
  • /python/outline.html
  • AI Agent
  • MCP (Model Context Protocol) 应用指南
  • 深度学习
  • 深度学习
  • 强化学习: 理论与实践
  • 扩散模型书籍
  • Agentic AI for Everyone
langchain
Home
  • Tailwind CSS 书籍目录
  • Vue 3 开发实战指南
  • React 和 Next.js 学习
  • TypeScript
  • React开发框架书籍大纲
  • Shadcn学习大纲
  • Swift 编程语言:从入门到进阶
  • SwiftUI 学习指南
  • 函数式编程大纲
  • Swift 异步编程语言
  • Swift 协议化编程
  • SwiftUI MVVM 开发模式
  • SwiftUI 图表开发书籍
  • SwiftData
  • ArkTS编程语言:从入门到精通
  • 仓颉编程语言:从入门到精通
  • 鸿蒙手机客户端开发实战
  • WPF书籍
  • C#开发书籍
learn
  • Java编程语言
  • Kotlin 编程入门与实战
  • /python/outline.html
  • AI Agent
  • MCP (Model Context Protocol) 应用指南
  • 深度学习
  • 深度学习
  • 强化学习: 理论与实践
  • 扩散模型书籍
  • Agentic AI for Everyone
langchain
  • 第3章:神经网络核心

第3章:神经网络核心

训练神经网络之批量归一化

1. 批量归一化的动机

  • 内部协变量偏移问题:神经网络训练过程中,各层输入的分布会随参数更新而改变,导致训练效率下降
  • 梯度消失/爆炸缓解:通过规范化激活值范围,改善梯度流动
  • 允许更高学习率:减少对参数初始化的敏感度,使网络更稳定

2. 技术原理

2.1 基本操作

对于mini-batch B={x1...xm}B = \{x_1...x_m\}B={x1​...xm​}:

  1. 计算均值:μB=1m∑i=1mxi\mu_B = \frac{1}{m}\sum_{i=1}^m x_iμB​=m1​∑i=1m​xi​
  2. 计算方差:σB2=1m∑i=1m(xi−μB)2\sigma_B^2 = \frac{1}{m}\sum_{i=1}^m (x_i - \mu_B)^2σB2​=m1​∑i=1m​(xi​−μB​)2
  3. 归一化:x^i=xi−μBσB2+ϵ\hat{x}_i = \frac{x_i - \mu_B}{\sqrt{\sigma_B^2 + \epsilon}}x^i​=σB2​+ϵ​xi​−μB​​
  4. 缩放平移:yi=γx^i+βy_i = \gamma \hat{x}_i + \betayi​=γx^i​+β(γ,β\gamma,\betaγ,β为可学习参数)

2.2 关键特性

  • 训练/推理差异:
    • 训练时使用batch统计量
    • 推理时使用移动平均统计量
  • 维度处理:对全连接层按特征维度归一化,对卷积层按通道维度归一化

3. 实现细节

3.1 反向传播公式

需对γ,β\gamma,\betaγ,β及归一化操作求导:

∂ℓ∂x^i=∂ℓ∂yi⋅γ\frac{\partial \ell}{\partial \hat{x}_i} = \frac{\partial \ell}{\partial y_i} \cdot \gamma ∂x^i​∂ℓ​=∂yi​∂ℓ​⋅γ

∂ℓ∂σB2=∑i=1m∂ℓ∂x^i⋅(xi−μB)⋅−12(σB2+ϵ)−3/2\frac{\partial \ell}{\partial \sigma_B^2} = \sum_{i=1}^m \frac{\partial \ell}{\partial \hat{x}_i} \cdot (x_i - \mu_B) \cdot \frac{-1}{2}(\sigma_B^2 + \epsilon)^{-3/2} ∂σB2​∂ℓ​=i=1∑m​∂x^i​∂ℓ​⋅(xi​−μB​)⋅2−1​(σB2​+ϵ)−3/2

3.2 代码示例(PyTorch)

import torch.nn as nn
class Net(nn.Module):
    def __init__(self):
        super().__init__()
        self.fc1 = nn.Linear(784, 256)
        self.bn1 = nn.BatchNorm1d(256)
        self.fc2 = nn.Linear(256, 10)
        
    def forward(self, x):
        x = self.bn1(F.relu(self.fc1(x)))
        return self.fc2(x)

4. 变体与改进

方法核心改进适用场景
Layer Norm沿特征维度归一化RNN/Transformer
Instance Norm对每个样本单独归一化风格迁移
Group Norm将通道分组后归一化小batch size情况

5. 实验效果分析

  • CIFAR-10对比实验:
    • 无BN:测试准确率78.2%(学习率0.01)
    • 有BN:测试准确率84.7%(学习率0.1)
  • 收敛速度提升2-3倍(达到相同精度所需的epoch数)

6. 注意事项

  1. batch size影响:过小的batch size会导致统计量估计不准
  2. 与dropout的配合:BN可能减少对dropout的依赖
  3. 特殊网络结构:在RNN中需使用时间步独立的归一化方式

经典论文引用:Ioffe & Szegedy (2015) "Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift" 首次系统提出BN方法

Last Updated:: 5/20/25, 7:33 PM