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 会发生什么?
- 深层网络训练困难,梯度消失问题
- 对学习率选择敏感
- 收敛到局部最优的风险更高
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]) # 归一化最后三个维度
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 |
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 可以保留内容图像的风格特征
- 超分辨率:保留局部纹理特征
- 纹理生成:不进行跨样本统计
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
敬请期待!

浙公网安备 33010602011771号