Skip to content

Latest commit

 

History

History
66 lines (46 loc) · 2.52 KB

BatchNorm.md

File metadata and controls

66 lines (46 loc) · 2.52 KB

Batch Normalization (批量归一化)

批量归一化(Batch Normalization,简称BatchNorm)是一种用于加速深度神经网络训练并提高其稳定性的方法。它通过在每一层网络中对输入数据进行归一化处理,使得每一层的输入数据分布更加稳定,从而加速训练过程并提高模型的泛化能力。

原理

批量归一化的基本思想是对每一层的输入进行标准化处理,使其均值为0,方差为1。具体步骤如下:

  1. 计算均值和方差:对于一个mini-batch中的每一个特征,计算其均值和方差。
  2. 归一化:使用计算得到的均值和方差对每一个特征进行归一化处理。
  3. 缩放和平移:引入两个可学习的参数,分别对归一化后的数据进行缩放和平移,以恢复网络的表达能力。

公式如下:

$$\hat{x}^{(k)} = \frac{x^{(k)} - \mu^{(k)}}{\sqrt{(\sigma^{(k)})^2 + \epsilon}}$$ $$y^{(k)} = \gamma^{(k)} \hat{x}^{(k)} + \beta^{(k)}$$

其中,$\mu^{(k)}$和$\sigma^{(k)}$分别是第k个特征的均值和方差,$\epsilon$是一个小常数,用于避免除零错误,$\gamma^{(k)}$和$\beta^{(k)}$是可学习的参数。

代码示例

以下是一个使用PyTorch实现批量归一化的示例:

import torch
import torch.nn as nn

# 定义一个简单的神经网络
class SimpleNN(nn.Module):
    def __init__(self):
        super(SimpleNN, self).__init__()
        self.fc1 = nn.Linear(784, 256)
        self.bn1 = nn.BatchNorm1d(256)
        self.relu = nn.ReLU()
        self.fc2 = nn.Linear(256, 10)

    def forward(self, x):
        x = self.fc1(x)
        x = self.bn1(x)
        x = self.relu(x)
        x = self.fc2(x)
        return x

# 创建网络实例
model = SimpleNN()

# 打印网络结构
print(model)

在上述代码中,我们定义了一个简单的神经网络,其中包含一个全连接层和一个批量归一化层。批量归一化层通过nn.BatchNorm1d实现,参数256表示该层的输入特征数。

优点

  1. 加速训练:通过稳定每一层的输入分布,批量归一化可以加速模型的训练过程。
  2. 提高稳定性:减少了梯度消失和梯度爆炸的问题,使得深层网络的训练更加稳定。
  3. 正则化效果:在一定程度上具有正则化效果,可以减少对其他正则化方法(如Dropout)的依赖。

参考文献