归一化技术比较研究:Batch Norm, Layer Norm, Group Norm

本文涉及的产品
实时计算 Flink 版,1000CU*H 3个月
智能开放搜索 OpenSearch行业算法版,1GB 20LCU 1个月
实时数仓Hologres,5000CU*H 100GB 3个月
简介: 本文将使用合成数据集对三种归一化技术进行比较,并在每种配置下分别训练模型。记录训练损失,并比较模型的性能。

归一化层是深度神经网络体系结构中的关键,在训练过程中确保各层的输入分布一致,这对于高效和稳定的学习至关重要。归一化技术的选择(Batch, Layer, GroupNormalization)会显著影响训练动态和最终的模型性能。每种技术的相对优势并不总是明确的,随着网络体系结构、批处理大小和特定任务的不同而变化。

本文将使用合成数据集对三种归一化技术进行比较,并在每种配置下分别训练模型。记录训练损失,并比较模型的性能。

神经网络中的归一化层是用于标准化网络中某一层的输入的技术。这有助于加速训练过程并获得更好的表现。有几种类型的规范化层,其中 Batch Normalization, Layer Normalization, Group Normalization是最常见的。

常见的归一化技术

BatchNorm

BN应用于一批数据中的单个特征,通过计算批处理上特征的均值和方差来独立地归一化每个特征。它允许更高的学习率,并降低对网络初始化的敏感性。

这种规范化发生在每个特征通道上,并应用于整个批处理维度,它在大型批处理中最有效,因为统计数据是在批处理中计算的。

LayerNorm

与BN不同,LN计算用于归一化单个数据样本中所有特征的均值和方差。它应用于每一层的输出,独立地规范化每个样本的输入,因此不依赖于批大小。

LN有利于循环神经网络(rnn)以及批处理规模较小或动态的情况。

GroupNorm

GN将信道分成若干组,并计算每组内归一化的均值和方差。这对于通道数量可能很大的卷积神经网络很有用,将它们分成组有助于稳定训练。

GN不依赖于批大小,因此适用于小批大小的任务或批大小可以变化的任务。

每种规范化方法都有其优点,并且根据网络体系结构、批处理大小和训练过程的特定需求适合不同的场景:

BN对于具有稳定和大批大小的网络非常有效,LN对于序列模型和小批大小是首选,而GN提供了对批大小变化不太敏感的中间选项。

代码示例

我们演示了使用PyTorch在神经网络中使用三种规范化技术的代码,并且绘制运行的结果图。

首先是生成数据

 importtorch
 importtorch.nnasnn
 importtorch.optimasoptim
 importnumpyasnp
 importmatplotlib.pyplotasplt
 fromtorch.utils.dataimportDataLoader, TensorDataset

 # Generate a synthetic dataset
 np.random.seed(42)
 X=np.random.rand(1000, 10)
 y= (X.sum(axis=1) >5).astype(int)  # simple threshold sum function
 X_train, y_train=torch.tensor(X, dtype=torch.float32), torch.tensor(y, dtype=torch.int64)

 # Create a DataLoader
 dataset=TensorDataset(X_train, y_train)
 loader=DataLoader(dataset, batch_size=64, shuffle=True)

然后是创建模型,这里将三种方法写在一个模型中,初始化时只要传递不同的参数就可以使用不同的归一化方法

 # Define a model with Batch Normalization, Layer Normalization, and Group Normalization
 classNormalizationModel(nn.Module):
     def__init__(self, norm_type="batch"):
         super(NormalizationModel, self).__init__()
         self.fc1=nn.Linear(10, 50)

         ifnorm_type=="batch":
             self.norm=nn.BatchNorm1d(50)
         elifnorm_type=="layer":
             self.norm=nn.LayerNorm(50)
         elifnorm_type=="group":
             self.norm=nn.GroupNorm(5, 50)  # 5 groups

         self.fc2=nn.Linear(50, 2)

     defforward(self, x):
         x=self.fc1(x)
         x=self.norm(x)
         x=nn.ReLU()(x)
         x=self.fc2(x)
         returnx

然后是训练的代码,我们也简单的封装下,方便后面调用

 # Training function
 deftrain_model(norm_type):
     model=NormalizationModel(norm_type=norm_type)
     criterion=nn.CrossEntropyLoss()
     optimizer=optim.Adam(model.parameters(), lr=0.001)
     num_epochs=50
     losses= []

     forepochinrange(num_epochs):
         forinputs, targetsinloader:
             optimizer.zero_grad()
             outputs=model(inputs)
             loss=criterion(outputs, targets)
             loss.backward()
             optimizer.step()
             losses.append(loss.item())

     returnlosses

最后就是训练,经过上面的封装,我们直接循环调用即可

 # Train and plot results for each normalization
 norm_types= ["batch", "layer", "group"]
 results= {}

 fornorm_typeinnorm_types:
     losses=train_model(norm_type)
     results[norm_type] =losses
     plt.plot(losses, label=f"{norm_type} norm")

 plt.xlabel("Iteration")
 plt.ylabel("Loss")
 plt.title("Normalization Techniques Comparison")
 plt.legend()
 plt.show()

生成的图表将显示每种归一化技术如何影响有关减少损失的训练过程。我们可以解释哪种归一化技术对这个特定的合成数据集和训练设置更有效。我们的评判标准是通过适当的归一化实现更平滑和更快的收敛。

BN(蓝色)、LN(橙色)和GN(绿色)。

所有三种归一化方法都以相对较高的损失开始,并迅速减小。

可以看到BN的初始收敛速度非常的快,但是到了最后,损失出现了大幅度的波动,这可能是因为学习率、数据集或小批量选择的随机性质决定的,或者是模型遇到具有不同曲率的参数空间区域。我们的batch_size=64,如果加大这个参数,应该会减少波动。

LN和GN的下降平稳,并且收敛速度和表现都很类似,通过观察能够看到LN的方差更大一些,表明在这种情况下可能不太稳定

最后所有归一化技术都显著减少了损失,但是因为我们使用的是生成的数据,所以不确定否都完全收敛了。不过虽然该图表明,最终的损失值很接近,但是GN的表现可能更好一些。

总结

在这些规范化技术的实际应用中,必须考虑任务的具体要求和约束。BatchNorm在大规模批处理可行且需要稳定性时更可取。LayerNorm在rnn和具有动态或小批量大小的任务的背景下可以发挥作用。GroupNorm提供了一个中间选项,在不同的批处理大小上提供一致的性能,在cnn中特别有用。

归一化层是现代神经网络设计的基石,通过了解BatchNorm、LayerNorm和GroupNorm的操作特征和实际含义,根据任务需求选择特定的技术,可以在深度学习中实现最佳性能。

https://avoid.overfit.cn/post/e8ec905659e5446e84fb9617feb86e95

目录
相关文章
|
10月前
|
机器学习/深度学习 PyTorch 算法框架/工具
详解三种常用标准化Batch Norm & Layer Norm & RMSNorm
通过本文的介绍,希望您能够深入理解Batch Norm、Layer Norm和RMSNorm的原理和实现,并在实际应用中灵活选择和使用,提升深度学习模型的性能和稳定性。
2224 5
|
11月前
|
负载均衡 监控 Cloud Native
云原生架构下的微服务治理策略与实践####
在数字化转型浪潮中,企业纷纷拥抱云计算,而云原生架构作为其核心技术支撑,正引领着一场深刻的技术变革。本文聚焦于云原生环境下微服务架构的治理策略与实践,探讨如何通过精细化的服务管理、动态的流量调度、高效的故障恢复机制以及持续的监控优化,构建弹性、可靠且易于维护的分布式系统。我们将深入剖析微服务治理的核心要素,结合具体案例,揭示其在提升系统稳定性、扩展性和敏捷性方面的关键作用,为读者提供一套切实可行的云原生微服务治理指南。 ####
|
12月前
|
小程序 前端开发 JavaScript
微信小程序之简易计算器的制作
微信小程序之简易计算器的制作
238 0
微信小程序之简易计算器的制作
|
并行计算 数据挖掘 PyTorch
【YOLOv8改进 - 特征融合】DySample :超轻量级且高效的动态上采样器
【YOLOv8改进 - 特征融合】DySample :超轻量级且高效的动态上采样器
【YOLOv8改进 - 特征融合】DySample :超轻量级且高效的动态上采样器
|
机器学习/深度学习 数据采集 人工智能
一文看尽LLM对齐技术:RLHF、RLAIF、PPO、DPO……
【8月更文挑战第27天】本文全面回顾了近期大型语言模型(LLMs)领域内提升模型与人类价值观一致性的重要进展与挑战。尽管自监督学习及大规模预训练等技术推动了LLMs的快速发展,但如何避免生成不当内容仍是难题。文中系统地将现有研究分为奖励模型、反馈机制、强化学习策略及优化方法四大主题,并深入探讨各技术路径的创新点与局限性,如RLHF、RLAIF等方法。旨在为读者提供清晰的领域概览,促进未来研究发展。[论文链接](https://arxiv.org/pdf/2407.16216)
618 3
|
机器学习/深度学习 编解码 计算机视觉
【YOLOv8改进 - 特征融合NECK】 GIRAFFEDET之GFPN :广义特征金字塔网络,高效地融合多尺度特征
YOLOv8专栏探讨了目标检测的创新改进,提出了GiraffeDet,一种轻量级主干和深度颈部模块结合的高效检测网络。GiraffeDet使用S2D-chain和GFPN,优化多尺度信息交换,提升检测性能。代码和论文可在相关链接找到。GFPN通过跳跃和跨尺度连接增强信息融合。文章还展示了核心组件如SPPV4、Focus和CSPStage的代码实现。
|
JavaScript
VUE——自动打包并生成dist.zip压缩包
VUE——自动打包并生成dist.zip压缩包
215 0
VUE——自动打包并生成dist.zip压缩包
|
机器学习/深度学习 人工智能 大数据
未来操作系统的智能化发展趋势
随着技术的不断发展,操作系统正朝着智能化方向迈进。未来操作系统将更加注重人机交互、自主学习和智能决策,以提升用户体验和系统效率。本文将探讨未来操作系统智能化发展的趋势,并分析其对技术和社会的影响。
217 27
|
算法 计算机视觉
【YOLOv8训练结果评估】YOLOv8如何使用训练好的模型对验证集进行评估及评估参数详解
【YOLOv8训练结果评估】YOLOv8如何使用训练好的模型对验证集进行评估及评估参数详解
|
编译器 Linux C++
CMake 秘籍(六)(2)
CMake 秘籍(六)
368 0