深度学习笔记:归一化问题总结(代码片段)

AI菌 AI菌     2022-12-09     119

关键词:


理论系列:

    深度学习笔记(一):卷积层+激活函数+池化层+全连接层

    深度学习笔记(二):激活函数的前世今生

    深度学习笔记(三):BatchNorm(BN)层

    深度学习笔记(四):梯度下降法与局部最优解

    深度学习笔记(五):欠拟合、过拟合

    防止过拟合(5.1):正则化

    防止过拟合(5.2):Dropout

    防止过拟合(5.3):数据增强

    深度学习笔记(六):激活函数常见问题总结

实战系列:

    《TensorFlow2 入门指南》专栏

    《CV实战项目:图像分类+目标检测+语义分割》专栏


1、归一化和标准化的联系与区别

  • 联系:都能取消由于量纲不同引起的误差;都是一种线性变换;都是对向量按照比例压缩再进行平移。
  • 区别:归一化是将样本的特征值转换到同一量纲下,把数据映射到 [0, 1] 或 [-1, 1] 区间内,区间放缩法是归一化的一种。标准化是将样本转换成标准正太分布,使其和整体样本分布相关,每个样本点都能对标准化产生影响。

2、归一化的作用

归一化是深度学习神经网络训练中常用的技巧,它的作用主要在于:

  • 统一量纲,因为样本数据的评价标准不一样,需要统一评价标准
  • 加快梯度下降的求解速度,加快模型的收敛速度
  • 在一定程度上缓解了深层网络中梯度弥散的问题,从而使训练深层网络模型更加容易(原因是:比如tanh、sigmoid等激活函数,在输入较大或较小时,梯度会出现弥散。而归一化将输入限幅在了0-1之间)

3、常见的归一化类型

(1)线性归一化

比较适用于在数值比较集中的情况。缺点是如果 max 和 min 不稳定,很容易使得归一化结果不稳定,使得后续使用效果也不稳定。线性归一化公式如下:
x ′ = x − m i n ( x ) m a x ( x ) − m i n ( x ) x^\\prime = \\fracx-min(x)max(x) - min(x) x=max(x)min(x)xmin(x)

(2)标准差标准化

使经过处理的数据符合标准正太分布,即均值为 0,标准差为 1。其中 μ \\mu μ 为所有样本数据的均值, σ \\sigma σ 为所有样本数据的标准差。标准差标准化公式如下:
x ′ = x − μ σ x^\\prime = \\fracx-\\mu\\sigma x=σxμ

(3)局部响应归一化

LRN (Local Response Normalization)是一种提高深度学习准确度的技术方法。在 ALexNet 中,提出了 LRN 层,对局部神经元的活动创建竞争机制,使其中响应比较大对值变得相对更大,并抑制其他反馈较小的神经元,增强了模型的泛化能力。LRN 一般是在激活、池化函数后使用。

局部响应归一化原理是仿造生物学上活跃的神经元对相邻神经元的抑制现象(侧抑制),其公式如下:
b x , y i = a x , y i / ( k + α ∑ j = m a x ( 0 , i − n / 2 ) m i n ( N − 1 , i + n / 2 ) ( a x , y j ) 2 ) β b_x,y^i = a_x,y^i / (k + \\alpha \\sum_j=max(0, i-n/2)^min(N-1, i+n/2)(a_x,y^j)^2 )^\\beta bx,yi=ax,yi/(k+αj=max(0,in/2)min(N1,i+n/2)(ax,yj)2)β

(4)非线性归一化

非线性归一化经常用在数据分化比较大的场景,有些数值很大,有些很小。通过一些数学函数,将原始值进行映射。该方法包括 l o g log log、指数,正切等。

4、批归一化BN

以前在神经网络训练中,只是对输入层数据进行归一化处理,却没有在中间层进行归一化处理。要知道,虽然我们对输入数据进行了归一化处理,但是输入数据经过 σ ( W X + b ) \\sigma(WX+b) σ(WX+b) 这样的矩阵乘法以及非线性运算之后,其数据分布很可能被改变,而随着深度网络的多层运算之后,数据分布的变化将越来越大。

如果我们能在网络的中间也进行归一化处理,是否对网络的训练起到改进作用呢?答案是肯定的。​ 这种在神经网络中间层也进行归一化处理,使训练效果更好的方法,就是批归一化Batch Normalization(BN)。

下面给出 BN 算法在训练时的过程:

输入:上一层输出结果 X = x 1 , x 2 , . . . , x m X = x_1, x_2, ..., x_m X=x1,x2,...,xm,学习参数 γ , β \\gamma, \\beta γ,β

算法流程

(1)计算上一层输出数据的均值:
μ β = 1 m ∑ i = 1 m ( x i ) \\mu_\\beta = \\frac1m \\sum_i=1^m(x_i) μβ=m1i=1m(xi)

其中, m m m 是此次训练样本 batch 的大小。

(2)计算上一层输出数据的标准差
σ β 2 = 1 m ∑ i = 1 m ( x i − μ β ) 2 \\sigma_\\beta^2 = \\frac1m \\sum_i=1^m (x_i - \\mu_\\beta)^2 σβ2=m1i=1m(xiμβ)2

(3)归一化处理,得到:
x ^ i = x i + μ β σ β 2 + ϵ \\hat x_i = \\fracx_i + \\mu_\\beta\\sqrt\\sigma_\\beta^2 + \\epsilon x^i=σβ2 +ϵxi+μβ
其中 ϵ \\epsilon ϵ 是为了避免分母为 0 而加进去的接近于 0 的很小值。

(4)重构,对经过上面归一化处理得到的数据进行重构,得到:
y i = γ x ^ i + β y_i = \\gamma \\hat x_i + \\beta yi=γx^i+β
其中, γ , β \\gamma, \\beta γ,β 为可学习参数。

5、批归一化BN的优点

总的来说,批归一化BN具如下一些优点:

  • 减少梯度消失,加快收敛速度,提高训练精度。
  • 重构了原始的数据分布,一定程度上缓解过拟合,防止每批训练中某一个样本经常被挑选到,有助于提高精度。
  • 减少了人为选择参数。在某些情况下可以取消 dropout 和 L2 正则项参数,或者采取更小的 L2 正则项约束参数。
  • 减少了对学习率的要求。现在我们可以使用初始很大的学习率或者选择了较小的学习率,算法也能够快速训练收敛。
  • 可以不再使用局部响应归一化。BN 本身就是归一化网络(局部响应归一化在 AlexNet 网络中存在)。

6、批归一化BN适用范围

(1) BN在激活函数之前

在CNN中,BN一般作用在激活函数之前(如下所示,是一个经典的例子)。个人觉得,这是由激活函数的性质决定的。由于像sigmoid、tanh等激活函数,当输入过大或过小时,梯度接近于0,会导致梯度弥散,所以要在激活函数输入之前将数值限制在0-1之间。而对于relu等激活函数几乎不受这种影响,但是在relu函数之前加入BN,经过relu之后输出的数值范围也在0-1之间,因此送入卷积层计算的数值也就在0-1范围之间。

相反,如果在卷积层之前添加BN时,虽然卷积层的输入数据能限制在 0-1 范围之间,但是经过卷积层之后的数据就不一定在0-1 范围之间,就达不到在激活函数之前限幅的目的。

self.listLayers = [self.bn1,
                   layers.Activation("relu"),
                   self.conv1,
                   self.bn2,
                   layers.Activation("relu"),
                   self.conv2,
                   self.dropout]

(2)BN适用场景

在神经网络训练时遇到收敛速度很慢,或梯度爆炸等无法训练的状况时可以尝试BN来解决。另外,在一般使用情况下也可以加入BN来加快训练速度,提高模型精度。

BN 在每个 mini-batch 比较大,数据分布比较接近的场景比较适用。在进行训练之前,要做好充分的shuffle,否则效果会差很多。另外,由于BN需要在运行过程中统计每个mini-batch的一阶统计量和二阶统计量,因此不适用于动态的网络结构和RNN网络。

7、BN、LN、IN与GN对比

深度学习中数据的维度一般是【N, H, W, C】格式,其中 N 是batch size,H、W是特征图的高和宽,C是特征图的通道数。如下图所示,是 BN、LN、IN 与 GN 作用方式的对比图。
在这里插入图片描述
下面分别来解释这四种不同的归一化方式:

  • 批归一化BN:对批次方向(N)做归一化
  • 层归一化LN:在通道方向(C)上做归一化,主要对RNN作用明显
  • 实例归一化IN:在一个图像像素内做归一化,主要用于风格化迁移
  • 组归一化GN:在通道方向上分组,然后再每个组内做归一化

组归一化的优点:组归一化将通道分成组,并在每组内计算归一化的均值和方差。组归一化的计算与批量大小无关,所以其准确度在各种批量大小都很稳定。

8、BN 和 WN 比较

WN(Weight Normalization)是权重归一化,它与BN都属于参数重写的方法,只是采用的方式不同。WN 是对网络权值 W W W 进行归一化, BN 是对网络某一层输入数据进行归一化。

WN 相比 BN 的优势在于:

  • 通过重写深度学习网络的权重W的方式来加速深度学习网络参数收敛,没有引入 minbatch 的依赖,适用于 RNN、LSTM网络;而 BN 不能直接用于RNN,原因在于:(1) RNN 处理的 Sequence 是变长的;2) RNN 是基于时间状态 计算,如果直接使用 Batch Normalization 处理,需要保存每个时间状态下mini btach 的均值和方差,效率低且占内存)。
  • Batch Normalization 基于一个 mini batch 的数据计算均值和方差,而不是基于整个 Training set 来做,相当于进行梯度计算式引入噪声。因此,Batch Normalization 不适用于对噪声敏感的强化学习、生成模型。相反,Weight Normalization 对通过标量 g g g 和向量 v v v 对权重 W W W 进行重写,重写向量 v v v 是固定的,因此,基于 Weight Normalization 的 Normalization 可以看做比 Batch Normalization 引入更少的噪声。
  • 不需要额外的存储空间来保存 mini batch 的均值和方差,同时实现 Weight Normalization 时,对深度学习网络进行正向信号传播和反向梯度计算带来的额外计算开销也很小。因此,要比采用 Batch Normalization 进行 normalization 操作时,速度快。

keras深度学习实战——批归一化详解(代码片段)

Keras深度学习实战(5)——批归一化详解0.前言1.批归一化基本概念2.在神经网络训练过程中使用批归一化小结系列链接0.前言批归一化是神经网络中关键性技术之一,使用批归一化可以大幅加快网络的收敛,同时... 查看详情

pytorch学习笔记——图像处理(transforms.normalize归一化)(代码片段)

PyTorch学习笔记——图像处理transforms.Normalize归一化回顾torchvision.ToTensor归一化transforms.Normalize公式回顾torchvision.ToTensor在看这一片博客之前,需要先浏览以下我的上一篇博客PyTorch学习笔记——图像处理(torchvision.ToTensorÿ... 查看详情

深度学习原理与框架-batch_normalize(归一化操作)(代码片段)

1.batch_normalize(归一化操作),公式:传统的归一化公式(number-mean)/std,mean表示均值,std表示标准差而此时的公式是scale*(num-mean)/std+beta #scale和beta在计算的过程中会进行不断的更新,以使得数据可以产生多样性的分步即经过一次... 查看详情

《南溪的目标检测学习笔记》——特征归一化(mead&std)(代码片段)

keywords:FeatureNormalization,特征归一化1介绍在这篇博文中,我们将介绍特征归一化(FeatureNormalization)方法;特征归一化FN一般用于图像预处理中,使用T.Normalize(mean,std)来实现;所以在进行归一化操作时,... 查看详情

batchnormalization(代码片段)

...因某一个特征数值大造成的模型过拟合或欠拟合问题。但深度学习因为模型深度深,常常会出现梯度爆炸或梯度消失问题,如果对每一层输入都进行特征的归一化,可以有效地解决这个问题。BatchNormalization,即批归一化,因为在... 查看详情

深度学习从lenet-5识别手写数字入门深度学习(代码片段)

​活动地址:CSDN21天学习挑战赛目录LeNet模型卷积神经网络(CNN)搭建环境安装需要的包创建工程数据集相关代码可以设置GPU训练(默认CPU)通过TensorFlow下载数据集对数据进行归一化处理最值归一化(normalization)均值方差... 查看详情

第十八节,tensorflow中使用批量归一化(代码片段)

在深度学习章节里,已经介绍了批量归一化的概念,详情请点击这里:第九节,改善深层神经网络:超参数调试、正则化以优化(下)由于在深层网络中,不同层的分布都不一样,会导致训练时出现饱和的问题。而批量归一化就是... 查看详情

「深度学习一遍过」必修12:激活函数池化归一化泛化正则化

本专栏用于记录关于深度学习的笔记,不光方便自己复习与查阅,同时也希望能给您解决一些关于深度学习的相关问题,并提供一些微不足道的人工神经网络模型设计思路。专栏地址:「深度学习一遍过」必修篇... 查看详情

深度学习批归一化(batchnormalization)

BN是由Google于2015年提出,这是一个深度神经网络训练的技巧,它不仅可以加快了模型的收敛速度,而且更重要的是在一定程度缓解了深层网络中“梯度弥散”的问题,从而使得训练深层网络模型更加容易和稳定。所以目前BN已经... 查看详情

批量归一化batchnormalization动手学深度学习v2

1.批量归一化BatchNormalization2016年左右出来的2.代码实现对比没有加BN之前的效果,收敛没那么好参考https://www.bilibili.com/video/BV1X44y1r77r?p=1 查看详情

深度学习:批归一化和层归一化batchnormalizationlayernormalization

    深度神经网络模型训练难,其中一个重要的现象就是InternalCovariateShift.BatchNorm自2015年由Google提出之后,LayerNorm/WeightNorm/CosineNorm等也横空出世。BN,BatchNormalization,就是在深度神经网络训练过程中使得每一层... 查看详情

归一化与标准化(代码片段)

本文选自:🔗365天深度学习训练营(免费辅导、免费咨询)🥂数据缩放归一化与标准化是特征缩放的两种形式,其作用是:使不同量纲的特征处于同一数值量级,减少方差大的特征的影响,使... 查看详情

归一化与标准化(代码片段)

本文选自:🔗365天深度学习训练营(免费辅导、免费咨询)🥂数据缩放归一化与标准化是特征缩放的两种形式,其作用是:使不同量纲的特征处于同一数值量级,减少方差大的特征的影响,使... 查看详情

sklearn笔记:数据归一化(standardscaler)(代码片段)

1 StandardScaler原理        去均值和方差归一化。且是针对每一个特征维度来做的,而不是针对样本。 ,其中μ为所有样本数据的均值,σ为所有样本数据的标准差。 2用sklearn实现数据归一化fromsklearn.preprocessingimpo... 查看详情

总结-初步理解归一化网络(代码片段)

...ionLayerNormBatchNormInstanceNormEvoNormEvoNorm-B0EvoNorm-S0浅显研究了归一化的内容和代码,想写个文章记录关键信息,及自己的理解先放个最直观的图(我只重点研究了LN)我用三维数据举例:N,C,H:batch_s 查看详情

机器学习特征预处理(代码片段)

目录1特征预处理2什么是特征预处理2.1包含内容2.2特征预处理API2.2.1为什么我们要进行归一化/标准化?2.2.2约会对象数据3归一化3.1定义3.2公式3.3API3.4数据计算3.5问题:如果数据中异常点较多,会有什么影响?3.6归... 查看详情

图像归一化(代码片段)

...1]),从而消除奇异样本数据导致的不良影响。在深度学习中,通常在模型训练前都会对图像进行归一化处理,而对图像进行归一化处理是将特征值大小调整到相近的范围,不归一化处理时,如果特征值较... 查看详情

slam学习笔记(代码片段)

...图像,计算图像间视差,以便估计每一个像素的深度。基线:两个光圈中心的距离。根据视差可以估计一个像素与相机之间的距离。视差与距离成反比:视差越大,距离越近。视差本身很难计算。而且只有在... 查看详情