PyTorch 深度学习专题【左扬精讲】—— 深度学习结构正则化技术学习:从 BatchNorm 到 GroupNorm

PyTorch 深度学习专题【左扬精讲】—— 深度学习结构正则化技术学习:从 BatchNorm 到 GroupNorm

在深度学习的实践中,Internal Covariate Shift(内部协变量偏移)是一个核心问题。

随着网络层数加深,前面层参数的微小变化会被后面层放大,导致每层的输入分布不断变化,这给训练带来很大困难。

结构正则化通过改变网络结构本身来约束模型,而不是像 L1/L2 正则化那样在损失函数中添加惩罚项。其中,归一化层是最重要的结构正则化技术之一。

本文将系统讲解深度学习中常用的归一化技术:BatchNorm、LayerNorm、GroupNorm 和 InstanceNorm,以及它们各自适用的场景。

torch.nn.BatchNorm1d              ← 批标准化(1D 输入)
torch.nn.BatchNorm2d              ← 批标准化(2D 输入)
torch.nn.BatchNorm3d              ← 批标准化(3D 输入)
torch.nn.LayerNorm                ← 层标准化
torch.nn.GroupNorm                ← 组标准化
torch.nn.InstanceNorm1d           ← 实例标准化(1D)
torch.nn.InstanceNorm2d           ← 实例标准化(2D)

PyTorchBatchNormLayerNormGroupNorm归一化结构正则化

学习重点

  • 必须掌握
  • BatchNorm、LayerNorm、GroupNorm、InstanceNorm 的计算方式
  • 训练时和推理时 BatchNorm 行为的区别
  • 不同归一化方法的适用场景
  • 理解即可
  • 归一化对梯度传播的影响
  • 归一化与其他正则化技术的配合

目录


一、归一化的数学基础

What — 归一化是什么?

归一化(Normalization)是一种将数据转换到特定范围或分布的技术。在深度学习中,归一化通常指将神经网络的激活值转换为均值为 0、方差为 1 的分布。

标准归一化公式:

# 给定输入 x,计算均值和方差
mean = E[x]             # 均值
var = Var[x]            # 方差

# 归一化
x_normalized = (x - mean) / sqrt(var + eps)

# 可学习的仿射变换(可选)
y = gamma * x_normalized + beta  # gamma 和 beta 是可学习参数

Why — 为什么需要归一化?

问题一:什么是 Internal Covariate Shift?

在深度神经网络中,前面层的参数变化会导致后面层的输入分布变化。每一层都需要不断适应前面层输出的新分布,这使得训练变得困难,尤其是网络层数较深时。

问题二:归一化如何解决这个问题?

归一化将每层的输入转换为稳定分布,减少前面层参数变化对后面层的影响。这使得:

  • 梯度更加稳定,不容易出现梯度消失或爆炸
  • 可以使用更大的学习率
  • 对初始化不那么敏感

问题三:gamma 和 beta 参数的作用是什么?

归一化会将数据转换为固定分布(均值 0、方差 1),这可能限制网络的表达能力。gamma 和 beta 允许网络学习恢复原始分布的任意均值和方差,保持模型的表达能力。

没有归一化会发生什么?

  • 深层网络训练困难,容易出现梯度消失
  • 对学习率和初始化敏感
  • 收敛速度慢

本节小结

  • 归一化:将激活值转换为稳定分布
  • 仿射变换:gamma 和 beta 允许恢复表达能力
  • 作用:缓解梯度问题,加速训练

二、BatchNorm 批标准化

What — BatchNorm 是什么?

BatchNorm 由 Sergey Ioffe 和 Christian Szegedy 于 2015 年在论文《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》中提出。它在 mini-batch 上对特征维度进行归一化。

BatchNorm 的计算范围:对 batch 维度和空间维度计算均值和方差,对特征维度进行归一化。

# BatchNorm2d 的输入形状:(N, C, H, W)
# 归一化维度:在 N, H, W 上计算均值和方差
# 输出:对每个通道 C 独立归一化

# 例如输入 (32, 64, 7, 7):
# - 计算 32*7*7 = 1568 个位置的均值和方差(每个通道独立)
# - 每个通道 C 有独立的 gamma 和 beta

Why — BatchNorm 的工作原理

问题一:训练时和推理时有什么不同?

训练时,BatchNorm 使用当前 batch 的均值和方差进行归一化,同时更新 running_mean 和 running_var。推理时,使用训练时统计的 running_mean 和 running_var,不依赖当前 batch。

# 训练时
running_mean = (1 - momentum) * running_mean + momentum * batch_mean
running_var = (1 - momentum) * running_var + momentum * batch_var

# 推理时
# 直接使用 running_mean 和 running_var,不再计算当前 batch 的统计量

问题二:BatchNorm 的 momentum 参数是什么?

momentum 用于控制 running 统计量的更新速度。默认值为 0.1,表示新的 batch 统计量占 10% 权重。较大的 momentum 使 running 统计量更新更快,但可能不够平滑。

问题三:BatchNorm 的主要参数有哪些?

参数类型默认值说明
num_features int 通道数(C)
eps float 1e-5 防止除零的常数
momentum float 0.1 running 统计量的动量
affine bool True 是否使用可学习的 gamma 和 beta
track_running_stats bool True 是否追踪 running 统计量

没有 BatchNorm 会发生什么?

  • 深层网络训练困难,梯度消失问题
  • 对学习率选择敏感
  • 收敛到局部最优的风险更高
标准写法:使用 BatchNorm2d
import torch
import torch.nn as nn

# 创建带 BatchNorm 的卷积网络
class ConvNetWithBN(nn.Module):
    def __init__(self):
        super().__init__()
        self.conv1 = nn.Conv2d(3, 64, kernel_size=3, padding=1)
        self.bn1 = nn.BatchNorm2d(64)  # num_features=64
        self.relu = nn.ReLU()
        self.conv2 = nn.Conv2d(64, 128, kernel_size=3, padding=1)
        self.bn2 = nn.BatchNorm2d(128)
        self.pool = nn.MaxPool2d(2, 2)

    def forward(self, x):
        x = self.conv1(x)
        x = self.bn1(x)        # BatchNorm 在激活函数之前
        x = self.relu(x)
        x = self.conv2(x)
        x = self.bn2(x)
        x = self.relu(x)
        x = self.pool(x)
        return x

# 使用模型
model = ConvNetWithBN()
model.train()  # 训练模式:使用 batch 统计量
output = model(batch_input)

model.eval()   # 推理模式:使用 running 统计量
with torch.no_grad():
    output = model(batch_input)

BatchNorm 的位置

  • 通常放在卷积/线性层之后、激活函数之前
  • 不要放在 ReLU 之后(归一化负值也会被截断)
  • BatchNorm 的 bias 会被 gamma 替代,可以省略卷积层的 bias

本节小结

  • BatchNorm:对 batch 维度计算均值方差
  • 训练时:使用当前 batch 统计量
  • 推理时:使用 running 统计量
  • 适用场景:batch size 较大的图像分类

三、LayerNorm 层标准化

What — LayerNorm 是什么?

LayerNorm 由 Jimmy Lei Ba 等人于 2016 年在论文《Layer Normalization》中提出。它对单个样本的所有特征维度计算均值和方差,不依赖 batch 维度。

# LayerNorm 的输入形状:(N, *, F)
# 其中 N 是 batch 维度,* 是任意数量的空间维度,F 是特征维度
# 归一化维度:对每个样本 N,在所有 * 和 F 上计算均值和方差

# 例如输入 (32, 768) 或 (32, 12, 64):
# LayerNorm 对每个样本独立计算均值和方差
# 不依赖 batch 统计量

Why — LayerNorm 的特点

问题一:LayerNorm 和 BatchNorm 的核心区别是什么?

BatchNorm 对 batch 维度计算统计量,LayerNorm 对单个样本的所有特征计算统计量。这意味着:

  • LayerNorm 不依赖 batch size,batch size 为 1 时也能正常工作
  • LayerNorm 在推理时和训练时行为完全一致
  • LayerNorm 更适合 RNN 和 Transformer

问题二:LayerNorm 的主要参数有哪些?

参数类型默认值说明
normalized_shape int 或 list 要归一化的维度
eps float 1e-5 防止除零的常数
elementwise_affine bool True 是否使用可学习的 gamma 和 beta
# normalized_shape 的用法
ln1 = nn.LayerNorm(768)              # 归一化最后一个维度
ln2 = nn.LayerNorm([12, 64])        # 归一化最后两个维度
ln3 = nn.LayerNorm([4, 12, 64])      # 归一化最后三个维度
标准写法:使用 LayerNorm
import torch
import torch.nn as nn

# Transformer 中的 LayerNorm 使用方式
class TransformerLayer(nn.Module):
    def __init__(self, d_model=512):
        super().__init__()
        self.attention = nn.MultiheadAttention(d_model, num_heads=8)
        self.norm1 = nn.LayerNorm(d_model)
        self.ffn = nn.Sequential(
            nn.Linear(d_model, d_model * 4),
            nn.ReLU(),
            nn.Linear(d_model * 4, d_model)
        )
        self.norm2 = nn.LayerNorm(d_model)

    def forward(self, x):
        # Self-attention 后接 LayerNorm(Post-LN 方式,BERT 风格)
        attn_output, _ = self.attention(x, x, x)
        x = self.norm1(x + attn_output)  # 残差连接 + LayerNorm

        # FFN 后接 LayerNorm
        ffn_output = self.ffn(x)
        x = self.norm2(x + ffn_output)   # 残差连接 + LayerNorm
        return x

# NLP 中的 LayerNorm 使用方式
class NLPClassifier(nn.Module):
    def __init__(self, vocab_size=50000, d_model=512):
        super().__init__()
        self.embedding = nn.Embedding(vocab_size, d_model)
        self.norm = nn.LayerNorm(d_model)  # 归一化词嵌入维度
        self.classifier = nn.Linear(d_model, 2)

    def forward(self, input_ids):
        # input_ids: (batch_size, seq_len)
        x = self.embedding(input_ids)      # (batch_size, seq_len, d_model)
        x = self.norm(x)                    # 在最后两维上归一化
        # 取最后一个 token 的表示进行分类
        x = x[:, -1, :]                     # (batch_size, d_model)
        return self.classifier(x)

LayerNorm 的适用场景

  • Transformer:BERT、GPT 等都使用 LayerNorm
  • RNN:LSTM、GRU 等循环网络
  • 小 batch:batch size 很小时效果比 BatchNorm 好
  • 变长序列:不依赖 batch 统计量

本节小结

  • LayerNorm:对单个样本的所有特征归一化
  • 不依赖 batch:batch size 为 1 也能正常工作
  • 训练推理一致:无需切换模式
  • 适用场景:Transformer、RNN、NLP 任务

四、GroupNorm 组标准化

What — GroupNorm 是什么?

GroupNorm 由 Yuxin Wu 和 Kaiming He 于 2018 年在论文《Group Normalization》中提出。它是 BatchNorm 和 LayerNorm 之间的折中方案,将通道分成若干组,在每组内计算均值和方差。

# GroupNorm 的输入形状:(N, C, H, W)
# 将 C 个通道分成 G 组,每组有 C/G 个通道
# 对每个样本、每组通道、每个空间位置计算均值和方差

# GroupNorm 与 batch size 无关,不依赖 batch 统计量

# 例如输入 (32, 64, 7, 7),num_groups=32:
# - 每组 2 个通道(64/32=2)
# - 每个样本有 32 组,每组独立归一化

Why — GroupNorm 的优势

问题一:GroupNorm 如何解决 BatchNorm 的问题?

BatchNorm 的问题:当 batch size 很小时(如 1-4),每个 batch 的均值和方差波动很大,导致训练不稳定。GroupNorm 完全不依赖 batch 维度,因此不受 batch size 影响。

问题二:GroupNorm 和 LayerNorm 有什么关系?

LayerNorm 是 GroupNorm 的特例:

  • 当 num_groups = 1 时,GroupNorm = LayerNorm(对所有通道归一化)
  • 当 num_groups = C 时,GroupNorm = InstanceNorm(对每个通道独立归一化)

问题三:GroupNorm 的主要参数有哪些?

参数类型默认值说明
num_groups int 通道分组数
num_channels int 通道总数(C)
eps float 1e-5 防止除零的常数
affine bool True 是否使用可学习的 gamma 和 beta
标准写法:使用 GroupNorm
import torch
import torch.nn as nn

# GroupNorm 用于目标检测等需要小 batch 的任务
class DetectionBackbone(nn.Module):
    def __init__(self, num_groups=32):
        super().__init__()
        # 例如 ResNet 的特征图有 2048 个通道
        self.norm = nn.GroupNorm(
            num_groups=num_groups,     # 分成 32 组
            num_channels=2048,        # 总通道数
            affine=True                # 使用 gamma 和 beta
        )
        self.conv = nn.Conv2d(2048, 512, 1)

    def forward(self, x):
        x = self.norm(x)      # GroupNorm 不依赖 batch 统计量
        x = self.conv(x)
        return x

# 不同的 GroupNorm 配置
gn_full = nn.GroupNorm(num_groups=1, num_channels=64)   # = LayerNorm
gn_8 = nn.GroupNorm(num_groups=8, num_channels=64)     # 每组 8 通道
gn_32 = nn.GroupNorm(num_groups=32, num_channels=64)    # 每组 2 通道
gn_per_channel = nn.GroupNorm(num_groups=64, num_channels=64)  # = InstanceNorm

# 推荐配置:num_groups=32(论文建议)
gn = nn.GroupNorm(num_groups=32, num_channels=64)

GroupNorm 的推荐设置

  • 对于通道数较多(如 64, 128, 256),推荐 num_groups = 32
  • num_groups 应该是 num_channels 的约数
  • 当 num_channels 较小时,可以减小 num_groups

本节小结

  • GroupNorm:将通道分组,在组内归一化
  • 不依赖 batch:适合小 batch 场景
  • 灵活:num_groups 控制组数
  • 适用场景:目标检测、实例分割、视频任务

五、InstanceNorm 实例标准化

What — InstanceNorm 是什么?

InstanceNorm 对每个样本的每个通道独立计算均值和方差,是 GroupNorm 的极端情况(num_groups = num_channels)。

# InstanceNorm2d 的输入形状:(N, C, H, W)
# 对每个样本 N、每个通道 C,在 H*W 空间上计算均值和方差
# 相当于 GroupNorm 的 num_groups = C

# 例如输入 (32, 64, 7, 7):
# - 对每个样本的每个通道(共 32*64=2048 个)独立计算均值和方差
# - 每个通道有独立的 gamma 和 beta

Why — InstanceNorm 的特点

问题一:InstanceNorm 和 BatchNorm 的区别是什么?

BatchNorm 对 batch 维度求均值方差,InstanceNorm 对空间维度求均值方差。这意味着 InstanceNorm:

  • 完全独立于 batch size
  • 保留每个样本的独特风格(不进行 batch 统计)
  • 更关注局部特征而非全局统计

问题二:InstanceNorm 适合什么任务?

InstanceNorm 特别适合需要保留样本独特风格的任务:

  • 风格迁移:InstanceNorm 可以保留内容图像的风格特征
  • 超分辨率:保留局部纹理特征
  • 纹理生成:不进行跨样本统计
标准写法:使用 InstanceNorm
import torch
import torch.nn as nn

# 风格迁移网络中的 InstanceNorm
class StyleTransferNet(nn.Module):
    def __init__(self):
        super().__init__()
        # 下采样层
        self.downsample = nn.Sequential(
            nn.Conv2d(3, 32, 3, stride=2, padding=1),
            nn.InstanceNorm2d(32),
            nn.ReLU(),
            nn.Conv2d(32, 64, 3, stride=2, padding=1),
            nn.InstanceNorm2d(64),
            nn.ReLU(),
        )
        # 残差层
        self.residual = nn.Sequential(
            nn.Conv2d(64, 64, 3, padding=1),
            nn.InstanceNorm2d(64),
            nn.Conv2d(64, 64, 3, padding=1),
            nn.InstanceNorm2d(64),
        )
        # 上采样层
        self.upsample = nn.Sequential(
            nn.ConvTranspose2d(64, 32, 3, stride=2, padding=1, output_padding=1),
            nn.InstanceNorm2d(32),
            nn.ReLU(),
            nn.ConvTranspose2d(32, 3, 3, stride=2, padding=1, output_padding=1),
            nn.Tanh(),
        )

    def forward(self, x):
        x = self.downsample(x)
        x = x + self.residual(x)  # 残差连接
        x = self.upsample(x)
        return x

# InstanceNorm vs BatchNorm 的效果对比
class ComparisonNet(nn.Module):
    def __init__(self, use_instance_norm=True):
        super().__init__()
        norm = nn.InstanceNorm2d(64) if use_instance_norm else nn.BatchNorm2d(64)
        self.block = nn.Sequential(
            nn.Conv2d(3, 64, 3, padding=1),
            norm,
            nn.ReLU(),
        )

    def forward(self, x):
        return self.block(x)

本节小结

  • InstanceNorm:对每个通道独立归一化
  • 保留风格:适合风格迁移任务
  • 不依赖 batch:batch size 为 1 也能正常工作
  • 适用场景:风格迁移、纹理生成、超分辨率

六、四种归一化方法对比

四种归一化方法的对比

让我们从计算维度、batch 依赖、适用场景等方面对比四种归一化方法:

方法计算维度batch 依赖适用场景
BatchNorm batch, spatial batch size 较大的图像分类
LayerNorm 所有特征 Transformer、RNN、NLP
GroupNorm group, spatial 目标检测、小 batch
InstanceNorm spatial 风格迁移、纹理生成

如何选择归一化方法?

问题一:batch size 较大时选哪个?

batch size ≥ 16 时,推荐使用 BatchNorm。它的归一化范围最广,可以利用 batch 统计信息提供更好的正则化效果。

问题二:batch size 较小时选哪个?

batch size < 16 时,推荐使用 GroupNorm(num_groups=32)。它不依赖 batch 统计量,在小 batch 场景下更稳定。

问题三:Transformer 类模型选哪个?

Transformer 类模型(如 BERT、ViT)推荐使用 LayerNorm。LayerNorm 是这些模型的标配,与自注意力机制配合良好。

问题四:风格迁移任务选哪个?

风格迁移推荐使用 InstanceNorm。InstanceNorm 可以保留内容图像的独特风格,是风格迁移网络的标准配置。

归一化方法与 batch size 的关系

  • BatchNorm:batch size 越大越稳定
  • LayerNorm:与 batch size 无关
  • GroupNorm:与 batch size 无关,推荐 num_groups=32
  • InstanceNorm:与 batch size 无关

本节小结

  • BatchNorm:大 batch、图像分类
  • LayerNorm:Transformer、RNN
  • GroupNorm:小 batch、目标检测
  • InstanceNorm:风格迁移

七、FAQ(20 组)

FAQ — 精选 20 问,深入理解结构正则化

Q1. BatchNorm 和 LayerNorm 的核心区别是什么?

BatchNorm 对 batch 维度计算均值和方差,LayerNorm 对单个样本的所有特征计算均值和方差。 BatchNorm 依赖 batch 统计量,训练和推理行为不同;LayerNorm 不依赖 batch,训练和推理行为一致。

Q2. 为什么 Transformer 使用 LayerNorm 而不是 BatchNorm?

Transformer 的输入序列长度可能变化,且通常 batch size 较小。 LayerNorm 不依赖 batch 统计量,可以处理变长序列,且在训练和推理时行为完全一致,更适合 Transformer 的架构。

Q3. BatchNorm 的训练和推理行为有什么不同?

训练时使用当前 batch 的均值和方差,推理时使用训练时统计的 running_mean 和 running_var。 切换模式需要调用 model.train() 和 model.eval()。

model.eval()   # 切换到推理模式
with torch.no_grad():
    output = model(input)

Q4. BatchNorm 需要放在激活函数之前还是之后?

通常放在激活函数之前。 如果放在 ReLU 之后,归一化会作用于被截断的负值,可能丢失信息。标准做法是:Conv/Linear -> BatchNorm -> Activation。

Q5. GroupNorm 的 num_groups 如何选择?

推荐 num_groups = 32。 论文《Group Normalization》建议使用 32 作为默认值。如果通道数较少,可以适当减小。num_groups 必须是 num_channels 的约数。

Q6. LayerNorm 的 normalized_shape 如何设置?

设置为要归一化的维度。 对于序列模型,通常设置为最后一个维度(如 512, 768);对于图像 patch,可以设置为 [H, W, C]。

ln1 = nn.LayerNorm(512)              # 归一化最后一个维度
ln2 = nn.LayerNorm([12, 64])        # 归一化最后两个维度

Q7. 为什么 BatchNorm 在小 batch 时效果不好?

小 batch 的均值和方差波动大,导致归一化不稳定。 当 batch size = 1 时,BatchNorm 等价于 InstanceNorm,失去了 batch 统计的意义。

Q8. InstanceNorm 为什么适合风格迁移?

InstanceNorm 保留每个样本的独特风格,不进行跨样本统计。 风格迁移需要保留内容图像的独特风格,InstanceNorm 的逐样本、逐通道归一化正好满足这一需求。

Q9. 可以同时使用多种归一化吗?

可以,但通常没必要。 某些架构会组合使用,如 PreLN Transformer 中每个子层使用 LayerNorm。混合使用会增加复杂度和计算量。

Q10. BatchNorm 的 bias 是否多余?

是的,如果后续有 BatchNorm,可以省略卷积层的 bias。 BatchNorm 的 gamma 和 beta 会替代 bias 的作用。在卷积层中设置 bias=False 可以减少参数量。

# 推荐写法:卷积层不使用 bias
conv = nn.Conv2d(3, 64, 3, padding=1, bias=False)
bn = nn.BatchNorm2d(64)

Q11. GroupNorm 和 LayerNorm 哪个更好?

取决于任务和数据。 GroupNorm 在小 batch 目标检测中表现更好,LayerNorm 在 Transformer 中是标准配置。两者都不依赖 batch 统计量,但归一化范围不同。

Q12. 为什么 BatchNorm 需要 momentum 参数?

momentum 控制 running 统计量的更新速度。 running_mean = (1 - momentum) * running_mean + momentum * batch_mean。较小的 momentum(如 0.1)使统计量更平滑,较大的 momentum 使更新更快。

Q13. 归一化层的 gamma 和 beta 可以被省略吗?

可以,设置 affine=False 即可。 这会减少参数量,但也会限制网络的表达能力。归一化将数据转换为固定分布,gamma 和 beta 允许网络恢复任意分布。

Q14. BatchNorm 对 batch size 的最小要求是多少?

没有硬性要求,但 batch size 越大越稳定。 通常建议 batch size ≥ 16。当 batch size < 8 时,建议使用 GroupNorm 替代。

Q15. LayerNorm 和 GroupNorm 有什么关系?

LayerNorm 是 GroupNorm 的特例。 当 num_groups = 1 时,GroupNorm = LayerNorm;当 num_groups = C 时,GroupNorm = InstanceNorm。

Q16. 归一化可以放在残差连接内部吗?

可以,PostLN 和 PreLN 是两种常见做法。 PostLN 在 sublayer 之前归一化(BERT 的做法),PreLN 在残差连接之后归一化(LLaMA、GPT-J 的做法)。PreLN 更稳定且训练时可并行,PostLN 通常效果略好但训练更困难。

# PostLN(BERT 风格):先归一化,再计算 sublayer
x = x + attention(norm(x))
x = x + ffn(norm(x))

# PreLN(LLaMA、GPT-J 风格):先计算 sublayer,再归一化
x = norm(x + attention(x))
x = norm(x + ffn(x))

Q17. 为什么 GroupNorm 比 BatchNorm 更适合目标检测?

目标检测的 batch size 通常很小(如 1-4)。 小 batch 下 BatchNorm 的统计量不稳定,GroupNorm 不依赖 batch 统计量,在小 batch 场景下更可靠。

Q18. BatchNorm 可以用于 1D 输入吗?

可以,使用 BatchNorm1d。 BatchNorm1d 对 batch 维度和最后一个维度计算均值和方差,常用于 NLP 任务中对词嵌入的归一化。

# BatchNorm1d 用于 NLP
bn1d = nn.BatchNorm1d(768)  # 对词嵌入维度归一化

Q19. 为什么 ViT 使用 LayerNorm 而不是 BatchNorm?

ViT 是基于 Transformer 的模型,使用 Patch Embedding 将图像分成固定大小的 patch。 LayerNorm 更适合处理这种结构化的序列数据,与自注意力机制配合良好。

Q20. 如何从 BatchNorm 迁移到 GroupNorm?

只需替换归一化层类型,参数需要适当调整。 GroupNorm 不需要 running 统计量,直接替换即可。

# 从 BatchNorm 迁移到 GroupNorm
# 之前
bn = nn.BatchNorm2d(64)

# 之后
gn = nn.GroupNorm(num_groups=32, num_channels=64)

FAQ 总结

  • BatchNorm:大 batch、图像分类
  • LayerNorm:Transformer、RNN、NLP
  • GroupNorm:小 batch、目标检测
  • InstanceNorm:风格迁移
  • 选择原则:根据 batch size 和任务类型选择

八、Roadmap 预告

下篇预告:《学习率调度器详解:从 StepLR 到 CosineAnnealing》

归一化技术解决了梯度传播的问题,而学习率调度器则决定了学习率如何随时间变化。在下一篇中,我们将学习:

  • 学习率调度的重要性
  • StepLR、MultiStepLR、ExponentialLR 的原理
  • CosineAnnealing 和 Warmup 的使用
  • OneCycleLR 和 ReduceLROnPlateau

敬请期待!


posted @ 2026-07-18 17:27  左扬  阅读(20)  评论(0)    收藏  举报