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的输入数据:

  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​+β

2.2 关键特性

  • γ\gammaγ(缩放因子)和β\betaβ(偏移因子)是可学习参数
  • ϵ\epsilonϵ 是为数值稳定性添加的小常数(通常1e-5)
  • 推理阶段使用全体数据的移动平均统计量

3. 实现优势

优势说明
加速收敛减少每层输入分布变化带来的震荡
正则化效果添加了轻微噪声,类似Dropout
网络深度支持使超深层网络(如ResNet)训练成为可能

4. 变体与改进

  1. Layer Normalization:沿特征维度归一化,适用于RNN
  2. Instance Normalization:图像生成任务中保持风格不变性
  3. Group Normalization:小批量场景的替代方案

5. PyTorch实现示例

import torch.nn as nn

class Net(nn.Module):
    def __init__(self):
        super().__init__()
        self.conv1 = nn.Conv2d(3, 64, 3)
        self.bn1 = nn.BatchNorm2d(64)  # 通道数需匹配卷积输出
        self.fc = nn.Linear(64*28*28, 10)
        
    def forward(self, x):
        x = self.conv1(x)
        x = self.bn1(x)  # 通常在卷积后、激活前
        x = F.relu(x)
        return self.fc(x)

6. 注意事项

  • batch size影响:过小的batch会导致统计量估计不准
  • 特殊网络结构:RNN中需考虑时间步维度
  • 与Dropout的配合:部分研究表明BN可能减少对Dropout的需求

7. 经典论文参考

[Ioffe & Szegedy, 2015] "Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift" (ICML)

Last Updated:: 6/17/25, 10:13 AM