个人主页: https://zhangxiaoshu.blog.csdn.net 欢迎大家:关注+点赞+评论+收藏⭐️,如有错误敬请指正! 未来很长,值得我们全力奔赴更美好的生活!

前言

神经网络中的归一化和正则化是为了提高训练稳定性、加速收敛、减少过拟合等目的而采取的一系列技术手段,本文对常见的归一化方法如,批归一化BN、层归一化LN、实例归一化IN、组归一化GN进行介绍。有关常见的正则化方法L1正则化、L2正则化、dropout 和 Early Stopping的介绍参见我写的这篇文章:神经网络常用归一化和正则化方法解析(二)

文章目录

前言一、归一化和正则化1. 归一化(Normalization)2. 正则化(Regularization)

二、常用归一化方法1. 批归一化(Batch Normalization)2. 层归一化(Layer Normalization)3. 实例归一化(Instance Normalization)4. 组归一化(Group Normalization)5. PyTorch演示

总结

一、归一化和正则化

1. 归一化(Normalization)

归一化是一组技术,用于调整神经网络中输入数据的分布,以帮助网络更有效地学习。主要包括批归一化、层归一化、实例归一化和组归一化等。归一化的目标是使输入数据的分布更稳定,有助于缓解梯度消失或爆炸的问题,并提高网络的训练速度和泛化性能。

加速收敛: 归一化可以帮助加速神经网络的收敛过程。在训练过程中,各层输入的分布可能会发生变化,导致训练过程不稳定。通过归一化,可以保持每层输入的分布相对稳定,有助于梯度的传播和权重的更新。 缓解梯度消失/爆炸问题: 在深层网络中,梯度消失或爆炸是常见的问题。通过在每层输入上进行归一化,可以避免梯度在反向传播时变得非常小或非常大。 更好的泛化能力: 归一化有助于提高模型的泛化能力,使其在未见过的数据上表现更好。

常见的归一化技术包括批归一化(Batch Normalization)、层归一化(Layer Normalization)实例归一化(Instance Normalization)、组归一化(Group Normalization)。

2. 正则化(Regularization)

正则化是一种用于控制模型复杂度、防止过拟合的技术。过拟合指的是模型在训练数据上表现很好,但在测试数据上表现较差,因为模型过度适应了训练数据的噪声和细节。

防止过拟合: 正则化是一种减少模型在训练数据上过拟合的技术。 控制权重的大小: 正则化通过在损失函数中添加额外的惩罚项,如L1正则化和L2正则化,可以控制模型参数的大小,防止其变得过于复杂。 提高泛化能力: 正则化有助于提高模型在未见过的数据上的泛化能力,使其更好地适应新的输入。

常见的正则化技术包括L1正则化、L2正则化、dropout和Early Stopping。

综合来说,归一化和正则化在神经网络中的使用可以使模型更稳定、更容易训练,同时提高其泛化能力,从而更好地适应未见过的数据。归一化是一种数据处理的方法,旨在将数据缩放到相对一致的尺度,以便更好地进行比较和分析。归一化通常用于预处理数据,使得不同特征或不同样本的数值范围相对一致。 正则化是一种用于控制模型复杂度、防止过拟合的技术。正则化通过在模型的损失函数中添加额外的项,对模型参数进行惩罚,从而限制模型的复杂性。

归一化适用于数据预处理,正则化适用于模型训练。 如果你的数据具有不同的尺度,可能需要进行归一化;如果你的模型在训练集上表现良好但在测试集上泛化能力差,可能需要考虑正则化。 归一化通常是标准的数据预处理步骤,而正则化是训练模型时的一种策略。 在训练模型之前,你通常会对数据进行归一化,以便更好地训练模型。正则化则是在训练过程中使用的手段,用于控制模型的复杂度。 具体选择取决于任务和模型。 在实际应用中,选择归一化和正则化的方法需要考虑具体任务、数据的特性以及所使用的模型。不同的场景可能需要不同的策略。

二、常用归一化方法

1. 批归一化(Batch Normalization)

Batch Normalization(BN)的基本思想:

对每个特征维度上的输入进行标准化,使其均值接近0,方差接近1。即,BN为一个batch内,在所有图像对应的相同通道上做归一化。

BN的计算过程如下:

对于每个特征维度,计算该维度上的均值和方差。对输入进行标准化,即减去均值并除以方差。将标准化后的数据乘以一个可学习的缩放参数(gamma)并加上一个可学习的平移参数(beta)。

这个过程可以用数学公式表示为:

B

N

(

x

i

)

=

γ

(

x

i

μ

σ

2

+

ϵ

)

+

β

\mathrm{BN}\left(x_{i}\right)=\gamma\left(\frac{x_{i}-\mu}{\sqrt{\sigma^{2}+\epsilon}}\right)+\beta

BN(xi​)=γ(σ2+ϵ

​xi​−μ​)+β

其中:

x

i

x_{i}

xi​是输入的第 i 个特征。

μ

\mu

μ是特征维度上的均值。

σ

\sigma

σ是特征维度上的标准差。

ϵ

\epsilon

ϵ是一个很小的常数,防止除法中的零。

γ

\gamma

γ是缩放参数、

β

\beta

β是平移参数,两者都是可学习得参数,这是因为归一化后数据为正态分布,使得表达能力下降,所以加入可学习得参数自己学习归一化分布。

BN的优势包括:

加速收敛: BN可以减少训练深度神经网络时的收敛时间,因为它缓解了梯度消失和爆炸的问题。 增强模型的泛化能力: BN有轻微的正则化效果,可以降低模型对参数初始化和超参数的敏感性,提高模型在未见过的数据上的泛化能力。 允许使用较大的学习率: BN的标准化效果使得可以使用更高的学习率,加速模型收敛。 独立性: BN对每个批次独立工作,使得模型在小批次上也能较好地进行训练。

BN通常被应用在卷积层和全连接层之间,以及激活函数之前。在实践中,BN已经成为训练深度神经网络时的标配技术之一。

2. 层归一化(Layer Normalization)

Layer Normalization(LN)的基本思想:

Layer Normalization是一种归一化技术,其基本思想是对每一层的输入进行标准化,使得每个神经元在同一层的输入具有相似的分布。相较于Batch Normalization(BN),它更关注对每个样本(实例)的独立性,而不是整个批次。即,LN为一个batch内,在一个图像对应的所有通道上做归一化。

Layer Normalization的计算过程:

给定输入

x

x

x,假设

x

x

x 的维度为

(

N

,

C

,

H

,

W

)

(N, C, H, W)

(N,C,H,W),其中

N

N

N 是批次大小,

C

C

C 是通道数,

H

H

H 和

W

W

W 是高度和宽度。Layer Normalization对每个样本(实例)在通道维度上进行标准化,计算过程如下:

对每个通道

c

c

c 计算均值

μ

c

\mu_c

μc​ 和标准差

σ

c

\sigma_c

σc​:

μ

c

=

1

H

×

W

i

=

1

H

j

=

1

W

x

c

i

j

\mu_{c}=\frac{1}{H \times W} \sum_{i=1}^{H} \sum_{j=1}^{W} x_{c i j}

μc​=H×W1​i=1∑H​j=1∑W​xcij​

σ

c

=

1

H

×

W

i

=

1

H

j

=

1

W

(

x

c

i

j

μ

c

)

2

+

ϵ

\sigma_{c}=\sqrt{\frac{1}{H \times W} \sum_{i=1}^{H} \sum_{j=1}^{W}\left(x_{c i j}-\mu_{c}\right)^{2}+\epsilon}

σc​=H×W1​i=1∑H​j=1∑W​(xcij​−μc​)2+ϵ

其中,

ϵ

\epsilon

ϵ 是一个很小的常数,防止除法中的零。

对每个通道

c

c

c 对输入

x

x

x 进行标准化:

x

c

i

j

^

=

x

c

i

j

μ

c

σ

c

\hat{{x}_{cij}} =\frac{{x}_{cij}-\mu_c }{\sigma_c }

xcij​^​=σc​xcij​−μc​​

对标准化后的结果进行缩放和平移,得到最终的输出:

y

c

i

j

=

γ

c

x

c

i

j

^

+

β

c

{y}_{cij}=\gamma_c \hat{{x}_{cij}} +\beta_c

ycij​=γc​xcij​^​+βc​

其中,

γ

c

\gamma_c

γc​ 和

β

c

\beta_c

βc​ 是可学习的缩放和平移参数。

Layer Normalization的优势:

不依赖于批次大小: LN 不像 BN 那样依赖于批次大小,因此在小批次的情况下表现更好。 适用于变长序列: LN 适用于变长序列数据,因为它是在通道维度上进行标准化,而不考虑序列的长度。 保持样本独立性: LN 更注重样本(实例)之间的独立性,适用于一些不同样本之间具有不同特性的情况。

总体而言,LN 在一些特定场景中可能比 BN 更适用,特别是在处理变长序列等情况下。然而,选择使用哪种归一化方法通常取决于具体的任务需求和实验结果。

3. 实例归一化(Instance Normalization)

实例归一化(Instance Normalization)的思想:

实例归一化是一种深度学习中的归一化技术,与批归一化(Batch Normalization)不同,实例归一化主要关注单个样本(实例)的数据分布,而不是整个批次。实例归一化的基本思想是对每个样本在每个通道上进行独立的标准化,使得每个样本在通道的分布接近标准正态分布。相对于批归一化,实例归一化在每个样本上进行独立的归一化,因此更适用于一些样本之间分布差异较大的情况,例如风格迁移等任务。即,IN为一个batch内,在每个图像对应的每个通道上做归一化。

实例归一化的优势:

适用于样本差异较大的任务: 实例归一化逐个样本地进行归一化,因此更适用于样本之间的分布差异较大的情况,例如风格迁移等任务。 减少内部协变量偏移: 实例归一化有助于减少内部协变量偏移,即在深度神经网络中,每一层的输入分布在训练过程中发生的变化。 不依赖于批次大小: 相对于批归一化,实例归一化对于批次大小的依赖较小,因此在小批次的情况下仍然表现良好。 保留样本的个体性: 实例归一化保留了每个样本的个体性,不同样本之间的特征分布更为独立,有助于保留样本之间的个性。

总体而言,实例归一化是一种在特定任务和场景下表现出色的归一化技术,特别适用于样本之间分布差异较大的情况。在一些生成模型、风格迁移等任务中,实例归一化已经得到广泛的应用。

4. 组归一化(Group Normalization)

组归一化(Group Normalization)的思想:

组归一化是一种深度学习中的归一化技术,它介于批归一化(Batch Normalization)和实例归一化(Instance Normalization)之间。与批归一化不同,组归一化将通道分为若干组,然后对每一组的特征进行独立的归一化。这样的归一化方式保留了通道之间的独立性,同时避免了对整个批次的依赖。组归一化在每一组内进行归一化,使得每组内的特征在训练过程中保持相对独立的分布。即,GN为一个batch内,一个图像对应的所有通道的分组上做归一化。

组归一化的优势:

适用于小批次和大批次: 与批归一化相比,组归一化对批次大小的依赖较小,因此在小批次和大批次的情况下都能表现良好。 减少内部协变量偏移: 组归一化有助于减少内部协变量偏移,使得每组内的特征在训练过程中保持相对独立的分布。 适用于高分辨率图像: 在处理高分辨率图像时,组归一化的性能通常比批归一化更好,因为它不依赖于批次大小,有助于保持特征之间的独立性。 灵活性: 由于组归一化对通道进行了分组,因此在某些场景下可以更灵活地控制每个分组的特征独立性,适应不同的模型结构和任务需求。

总体而言,组归一化在一些特定场景中表现出色,特别是在处理小批次和高分辨率图像的情况下。在一些最新的深度学习模型中,组归一化逐渐得到了广泛的应用。

5. PyTorch演示

下面是使用 PyTorch 随机生成张量并演示四种归一化的输出的代码:

import torch

import torch.nn as nn

# 随机生成张量

x = torch.rand((2, 3, 4, 4)) # 2个样本,3个通道,每个通道尺寸为4x4

# Batch Normalization

batch_norm = nn.BatchNorm2d(3)

x_batch_norm = batch_norm(x.clone())

# Layer Normalization

layer_norm = nn.LayerNorm(x.size()[1:])

x_layer_norm = layer_norm(x.clone())

# Instance Normalization

instance_norm = nn.InstanceNorm2d(3)

x_instance_norm = instance_norm(x.clone())

# Group Normalization

group_norm = nn.GroupNorm(1, 3) # 1 group for simplicity

x_group_norm = group_norm(x.clone())

# 打印结果

print("Original Tensor:")

print(x)

print("\nBatch Normalization:")

print(x_batch_norm)

print("\nLayer Normalization:")

print(x_layer_norm)

print("\nInstance Normalization:")

print(x_instance_norm)

print("\nGroup Normalization:")

print(x_group_norm)

总结

以下是对这四种归一化方法的简要总结:

批归一化(Batch Normalization):

思想: 一个batch内,在所有图像对应的相同通道上做归一化。优点: 提高训练稳定性,加速收敛,有轻微的正则化效果,对深度网络和各种激活函数都有效。缺点: 不太适用于小数据集,可能引入一些额外的计算开销。

层归一化(Layer Normalization):

思想: 一个batch内,在一个图像对应的所有通道上做归一化。优点: 在不同大小的小批量上效果更为稳定,适用于循环神经网络(RNN)等场景。缺点: 对小数据集和卷积神经网络(CNN)的效果可能不如批归一化。

实例归一化(Instance Normalization):

思想: 一个batch内,在每个图像对应的每个通道上做归一化。优点: 对于样本维度较大的情况效果较好,适用于图像生成等任务。缺点: 在其他任务上的效果可能不如批归一化。

组归一化(Group Normalization):

思想: 一个batch内,一个图像对应的所有通道的分组上做归一化。优点: 适用于小批量、样本数不同的情况,对卷积层效果较好。缺点: 对小数据集的效果可能较差,相对于批归一化在某些场景下可能计算开销较大。

综合而言,选择归一化方法需要考虑具体的任务和网络结构,不同的方法在不同的场景下表现更为优越。在实践中,根据具体问题进行实验和验证,选择最适合的归一化方法。

文中图片大多来自论文和网络,如有侵权,联系删除,文中有不对的地方欢迎指正。

精彩内容

评论可见,请评论后查看内容,谢谢!!!
 您阅读本篇文章共花了: