神经网络中的归一化操作

2024-05-24 10:20

本文主要是介绍神经网络中的归一化操作,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

神经网络中的归一化

文章目录

  • 神经网络中的归一化
    • 概述
    • 最大最小归一化
    • 标准归一化
    • 批归一化
    • 层归一化
    • 实例归一化
    • 组归一化
    • 权重归一化

概述

由于样本不同特征的量纲或量纲单位不同,变化区间也处于不同数量级, 使用原始样本训练机器学习或深度学习模型,不同特征对模型的影响会不同,这也导致训练所得的模型缺乏鲁棒性。

归一化(Normalization)是一种常见的数据预处理方法,它将数据映射成 [0, 1]或者[-1, 1]之间的小数,是的模型更容易收敛到最优解。 因此,在构造机器学习或深度学习模型之前,需要将数据做归一化处理, 这不仅会加快求解的速度,还有可能提高模型的精度。

最大最小归一化

给定样本集合 X = { x i } , i = 1 , . . . , n , x m i n X=\{x_i\},i=1,...,n,x^{min} X={xi},i=1,...,n,xmin为样本的最小值, x m a x x^{max} xmax为样本的最大值。

最大最小归一化 (Max-min Normalization)将数据归一化到[0,1]之间,

计算公式如下:
x i m i n m a x = x i − x m i n x m a x − x m i n x_i^{minmax}=\frac{x_i-x^{min}}{x^{max}-x^{min}} ximinmax=xmaxxminxixmin
最大最小归一化可以很好地将数据归一化到[0, 1]之间,使数据具有相同的度量尺度。但是这种归一化方法容易受到离群点数据的影响,如果存在一个离群点数据的值过大或者过小,都会导致分母很大,这使得归一化后的数据失去意义。 另外,最大最小归一化后的数据值都为正数,这导致机器学习模型的参数只能同时增大或同时减小,参数的更新路线可能不是最优路线。

标准归一化

标准归一化(Standard Normalization)考虑所有样本数据,因此受离群点数据的影响要小一些,尤其在样本足够多的情况下表现比较稳定。

给定样本集合 X = { x i } , i = 1 , . . . , n , E ( X ) X=\{x_i\},i=1,...,n,E(X) X={xi},i=1,...,n,E(X)为样本均值, V a r ( X ) Var(X) Var(X)为样本方差,
标准归一化的计算公式如下:
x i s t a n d = x i − E ( X ) V a r ( X ) x_i^{stand}=\frac{x_i-E(X)}{\sqrt{Var(X)}} xistand=Var(X) xiE(X)
其中:
E ( X ) = 1 n ∑ i = 1 n x i V a r ( X ) = 1 n ∑ i = 1 n ( x i − E ( X ) ) 2 \begin{aligned} E(X)&=\frac1n\sum_{i=1}^nx_i\\ Var(X)&=\frac1n\sum_{i=1}^n(x_i-E(X))^2 \end{aligned} E(X)Var(X)=n1i=1nxi=n1i=1n(xiE(X))2
标准归一化的分子得到的值有正有负,可以让不同的参数朝着不同方向调 整直至到达最优解,减少迭代次数,使得更新尽可能沿着最优路径进行。 标准归一化的分母用到了方差,方差衡量的是数据的离散程度,因此可以减小离群点数据的影响。

批归一化

在神经网络装载数据时,通常将按批(Batch)输入,由于每批数据的分布并不相同,使模型训练起来比较困难。 并且在训练深层神经网络时,激活函数会改变各层数据的分布和量级,随着神经网络的加深,这种改变会越来越大,从而导致模型不够稳定、不容易收敛,甚至可能出现梯度消失的问题。 这些存在的问题可以通过批归一化(Batch Normalization,BN)来解决。

神经网络中传递的张量数据一般有四个维度,记为(𝑁, 𝐻, 𝑊, 𝐶),其中𝑁表示批大小,𝑊、𝐻分别表示特征图的宽和高,𝐶表示通道数量,𝑁, 𝐻, 𝑊, 𝐶 ∈ ℕ。 批归一化是让一个批次内的所有数据在某个通道维度上的均值为0,方差为1,即在𝑁、𝐻、𝑊维度上做归一化。这样不仅可以使数据分布一致,而且可以避免梯度消失的发生。

给定一个批大小为 N N N的样本集合 X ∈ R N × H × W × C X\in\mathbb{R}^N\times H\times W\times C XRN×H×W×C作为输入, E C [ X ] E_C[X] EC[X]为样本沿着通道方向计算得到的均值, V a r C [ X ] Var_C[X] VarC[X]为样本沿着通道方向计算得到的方差, ϵ \epsilon ϵ是一个很小的数,防止分母为零, γ ∈ R C \boldsymbol{\gamma}\in\mathbb{R}^C γRC为可学习放缩(Scale)向量,向量元素的初始值通常设置为1, β ∈ R C \boldsymbol{\beta}\in\mathbb{R}^C βRC为可学习平移(Shift)向量,向量元素的初始值通常设置为0。批归一化的计算公式:

E C [ X ] = 1 N × H × W ∑ n = 1 N ∑ h = 1 H ∑ w = 1 W X n , h , w , ⋅ V a r C [ X ] = 1 N × H × W ∑ n = 1 N ∑ h = 1 H ∑ w = 1 W ( X n , h , w , ⋅ − E c [ X ] ) 2 Y n , h , w , ⋅ = X n , h , w , ⋅ − E C [ X ] V a r C [ X ] + ϵ × γ + β \begin{aligned} E_C[X]&=\frac1{N\times H\times W}\sum_{n=1}^N\sum_{h=1}^H\sum_{w=1}^W\boldsymbol{X}_{n,h,w,\cdot}\\ Var_C[X]&=\frac1{N\times H\times W}\sum_{n=1}^N\sum_{h=1}^H\sum_{w=1}^W(X_{n,h,w,\cdot}-E_c[X])^2\\ Y_{n,h,w,\cdot}&=\frac{X_{n,h,w,\cdot}-E_C[X]}{\sqrt{Var_C[X]+\epsilon}}\times\gamma+\beta\\ \end{aligned} EC[X]VarC[X]Yn,h,w,=N×H×W1n=1Nh=1Hw=1WXn,h,w,=N×H×W1n=1Nh=1Hw=1W(Xn,h,w,Ec[X])2=VarC[X]+ϵ Xn,h,w,EC[X]×γ+β

批归一化使网络中每层输入数据的分布相对稳定,减少梯度消失和梯度爆炸问题,提高模型的稳定性,也使得神经网络更快地收敛到最优解。 同时,它使模型对输入数据中的一些变化和扰动具有更好的鲁棒性,提高了模型的泛化能力。 但是批归一化受到批大小影响较大。如果批大小过小,计算的均值和方差 不足以代表整个样本数据的分布,批归一化的效果可能会下降;如果批大小过大,会超过内存容量,无法处理。 此外,批归一化并不适合所有神经网络,如循环神经网络等动态网络,使用批归一化的效果并不好。

层归一化

在自然语言处理等任务中,不同样本的长度往往是不同的,而批归一化很难满足 需求。为了解决这一问题 , 通常使用层归一化 ( Layer Normalization,LN)方法。 层归一化是指让一个数据样本在所有通道上的均值为0,方差为1,即在 𝐻、𝑊、𝐶维度上做归一化。

给定一个批大小为𝑁的样本集合 x ∈ R N × H × W × C x ∈ \mathbb{R}^{N×H×W×C} xRN×H×W×C作为输入, E n [ X ] E_n[X] En[X] 是沿着批方向计算得到的均值, V a r n [ X ] Var_n [X] Varn[X] 是沿着批方向计算得到的方差,ϵ是一个很小的数,防止分母为零, γ ∈ R c \gamma ∈ \mathbb R^c γRc为可学习放缩向量,向量元素的初始值通常设置为1, β ∈ R c \beta \in \mathbb R^c βRc为可学习平移向量,向量元素的初始值通常设置为0。层归 一化的计算公式:
E n [ X ] = 1 H × W × C ∑ h = 1 H ∑ w = 1 W ∑ c = 1 C X ⋅ , h , w , c V a r n [ X ] = 1 H × W × C ∑ h = 1 H ∑ w = 1 W ∑ c = 1 C ( X ⋅ , h , w , c − E n [ X ] ) 2 Y ⋅ , h , w , c = X ⋅ , h , w , c − E n [ X ] V a r n [ X ] + ϵ Z ⋅ , h , w , c = Y ⋅ , h , w , c × γ + β \begin{aligned} E_{n}[\boldsymbol{X}]&=\frac{1}{H\times W\times C}\sum_{h=1}^{H}\sum_{w=1}^{W}\sum_{c=1}^{C}\boldsymbol{X}_{\cdot,h,w,c}\\ Var_{n}[\boldsymbol{X}]&=\frac{1}{H\times W\times C}\sum_{h=1}^{H}\sum_{w=1}^{W}\sum_{c=1}^{C}(\boldsymbol{X}_{\cdot,h,w,c}-E_{n}[\boldsymbol{X}])^{2}\\ \boldsymbol{Y}_{\cdot,h,w,c}&=\frac{\boldsymbol{X}_{\cdot,h,w,c}-E_{n}[\boldsymbol{X}]}{\sqrt{Var_{n}[X]+\epsilon}}\\ \boldsymbol{Z}_{\cdot,h,w,c}&=\boldsymbol{Y}_{\cdot,h,w,c}\times\boldsymbol{\gamma}+\boldsymbol{\beta} \end{aligned} En[X]Varn[X]Y,h,w,cZ,h,w,c=H×W×C1h=1Hw=1Wc=1CX,h,w,c=H×W×C1h=1Hw=1Wc=1C(X,h,w,cEn[X])2=Varn[X]+ϵ X,h,w,cEn[X]=Y,h,w,c×γ+β
层归一化的最大优点是不依赖于批量数据的大小,甚至可以在单个样本上应用,另外它也不需要保存批的均值和方差,节省了存储空间。此外,层归一化适用于循环神经网络。 但是,层归一化在批大小比较大时没有批归一化效果好

实例归一化

在图像风格变换任务中,生成图像的风格主要依赖于某个图像实例,因而实例归一化(Instance Normalization)提出只对H、W维度进行归一化, 即只让一个单独数据在H和W维度上求均值和方差。

给定一个批大小为 N N N的样本集合 X ∈ R N × H × W × C X\in\mathbb{R}^{N\times H\times W\times C} XRN×H×W×C作为输入, E n c [ X ] E_{nc}[X] Enc[X]是沿着批方向和通道方向计算得到的均值, V a r n c [ X ] Var_{nc}[X] Varnc[X]是沿着批方向和通道方向计算得到的方差, ϵ \epsilon ϵ是一个很小的数,防止分母为零, γ ∈ R C \boldsymbol{\gamma}\in\mathbb{R}^C γRC为可学习放缩向量, 向量的元素初始值通常设置为1, β ∈ R C \boldsymbol{\beta}\in\mathbb{R}^C βRC为可学习平移向量,向量元素的初始值通常设置为0。实例归一化的计算公式:
E n c [ X ] = 1 H × W ∑ h = 1 H ∑ w = 1 W X ⋅ , h , w , ⋅ V a r n c [ X ] = 1 H × W ∑ h = 1 H ∑ w = 1 W ( X ⋅ , h , w , ⋅ − E n c [ X ] ) 2 Y ⋅ , h , w , ⋅ = X ⋅ , h , w , ⋅ − E n c [ X ] V a r n c [ X ] + ϵ Z ⋅ , h , w , ⋅ = Y ⋅ , h , w , ⋅ × γ + β \begin{aligned} E_{nc}[X]&=\frac1{H\times W}\sum_{h=1}^H\sum_{w=1}^WX_{\cdot,h,w,\cdot}\\ Var_{nc}[X]&=\frac1{H\times W}\sum_{h=1}^H\sum_{w=1}^W(X_{\cdot,h,w,\cdot}-E_{nc}[X])^2\\ Y_{\cdot,h,w,\cdot}&=\frac{X_{\cdot,h,w,\cdot}-E_{nc}[X]}{\sqrt{Var_{nc}[X]+\epsilon}}\\ Z_{\cdot,h,w,\cdot}&=Y_{\cdot,h,w,\cdot}\times\gamma+\beta \end{aligned} Enc[X]Varnc[X]Y,h,w,Z,h,w,=H×W1h=1Hw=1WX,h,w,=H×W1h=1Hw=1W(X,h,w,Enc[X])2=Varnc[X]+ϵ X,h,w,Enc[X]=Y,h,w,×γ+β

组归一化

组归一化(Group Normalization)用来解决当批大小较小时批归一化效果较差的问题。层归一化虽然不依赖批大小,但是在卷积神经网络中直接对当前层所有通道数据进行规一化也并不理想。 组归一化将通道方向分组,然后在每个组内做归一化,使得一个数据样本在同一组内的所有通道的均值为0,方差为1。计算步骤与批归一化一样, 但是不考虑批大小,即与批大小无关。

给定一个批大小为 N N N的样本集合 X ∈ R N × H × W × C X\in\mathbb{R}^{N\times H\times W\times C} XRN×H×W×C作为输入, E n g [ X ] E_{ng}[X] Eng[X]是沿着批方向在每个通道组内计算得到的均值, V a r n g [ X ] Var_{ng}[X] Varng[X]是沿着批方向在每个通道组内计算得到的方差, ϵ \epsilon ϵ是一个很小的数,防止分母为零, γ ∈ R C \boldsymbol{\gamma}\in\mathbb{R}^C γRC为可学习放缩向量,向量元素的初始值通常设置为1, β ∈ R C \boldsymbol{\beta}\in\mathbb{R}^C βRC为可学习平移向量,向量元素的初始值通常设置为0,其中 G G G​为分组数。组归一化的计算公式:
E n g [ X ] = 1 ( C / G ) H W ∑ c = g C / G + 1 ( g + 1 ) C / G ∑ h = 1 H ∑ w = 1 W X ⋅ , h , w , c V a r n g [ X ] = 1 ( C / G ) H W ∑ c = g C / G + 1 ( g + 1 ) C / G ∑ h = 1 H ∑ w = 1 W ( X ⋅ , h , w , c − E n g [ X ] ) 2 Y ⋅ , h , w , ( g C / G + 1 ) : ( g + 1 ) C / G = X ⋅ , h , w , ( g C / G + 1 ) : ( g + 1 ) C / G − E n g [ X ] V a r n g [ X ] + ϵ Z ⋅ , h , w , ( g C / G + 1 ) : ( g + 1 ) C / G = Y ⋅ , h , w , ( g C / G + 1 ) : ( g + 1 ) C / G × γ + β \begin{aligned} E_{ng}[X]&=\frac1{(C/G)HW}\sum_{c=gC/G+1}^{(g+1)C/G}\sum_{h=1}^H\sum_{w=1}^WX_{\cdot,h,w,c}\\ Var_{ng}[X]&=\frac1{(C/G)HW}\sum_{c=gC/G+1}^{(g+1)C/G}\sum_{h=1}^H\sum_{w=1}^W(X_{\cdot,h,w,c}-E_{ng}[X])^2\\ \boldsymbol{Y}_{\cdot,h,w,(gC/G+1):(g+1)C/G}&=\frac{X_{\cdot,h,w,(gC/G+1):(g+1)C/G}-E_{ng}[X]}{\sqrt{Var_{ng}[X]+\epsilon}}\\ Z_{\cdot,h,w,(gC/G+1):(g+1)C/G}&=Y_{\cdot,h,w,(gC/G+1):(g+1)C/G}\times\gamma+\beta \end{aligned} Eng[X]Varng[X]Y,h,w,(gC/G+1):(g+1)C/GZ,h,w,(gC/G+1):(g+1)C/G=(C/G)HW1c=gC/G+1(g+1)C/Gh=1Hw=1WX,h,w,c=(C/G)HW1c=gC/G+1(g+1)C/Gh=1Hw=1W(X,h,w,cEng[X])2=Varng[X]+ϵ X,h,w,(gC/G+1):(g+1)C/GEng[X]=Y,h,w,(gC/G+1):(g+1)C/G×γ+β
其中, g ∈ N , g = 0 , . . . , G − 1 g\in\mathbb{N},g=0,...,G-1 gN,g=0,...,G1。可以发现,当 G G G等于1时,其等价于层归一化;当 G = C G=C G=C时,其等价于实例归一化。

权重归一化

权重归一化 (Weight Normalization) 将权值 w w w分为一个方向分量 v v v和一个范数分量 g g g,使用优化器分别优化这两个参数,如下所示:
w = g ∣ ∣ v ∣ ∣ v w=\frac g{||v||}\boldsymbol{v} w=∣∣v∣∣gv
其中 v v v是与 w w w同维度的向量, ∥ v ∥ \|v\| v是欧式范数,因此 v v v决定了 w w w的方向。 g g g是标量,决定了 w w w的长度。由于 ∥ w ∥ = ∣ g ∣ \|w\|=|g| w=g,因此这一权重分解的方式将权重向量的欧氏范数进行了固定,从而实现了正则化的效果。

优化方向分量:
∇ g L = ∇ w L ⋅ v ∣ ∣ v ∣ ∣ \nabla_gL=\frac{\nabla_wL\cdot v}{||v||} gL=∣∣v∣∣wLv
优化范数分量:
∇ v L = g ∣ ∣ v ∣ ∣ ∇ w L − g ∇ g L ∣ ∣ v ∣ ∣ 2 v \nabla_vL=\frac g{||v||}\nabla_wL-\frac{g\nabla_gL}{||v||^2}v vL=∣∣v∣∣gwL∣∣v2ggLv
权重归一化的归一化操作作用在了权值矩阵上,它可以带来更快的收敛速度,更强的学习率鲁棒性,能应用在循环神经网络等动态网络中。并且它与样本量无关,所以可以使用较小的批大小。但是权重归一化并没有对得到的特征范围进行约束的功能,所以对参数的初始值非常敏感。

这篇关于神经网络中的归一化操作的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/998129

相关文章

Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单

《Springboot的ThreadPoolTaskScheduler线程池轻松搞定15分钟不操作自动取消订单》:本文主要介绍Springboot的ThreadPoolTaskScheduler线... 目录ThreadPoolTaskScheduler线程池实现15分钟不操作自动取消订单概要1,创建订单后

SpringBoot操作spark处理hdfs文件的操作方法

《SpringBoot操作spark处理hdfs文件的操作方法》本文介绍了如何使用SpringBoot操作Spark处理HDFS文件,包括导入依赖、配置Spark信息、编写Controller和Ser... 目录SpringBoot操作spark处理hdfs文件1、导入依赖2、配置spark信息3、cont

使用JavaScript操作本地存储

《使用JavaScript操作本地存储》这篇文章主要为大家详细介绍了JavaScript中操作本地存储的相关知识,文中的示例代码讲解详细,具有一定的借鉴价值,有需要的小伙伴可以参考一下... 目录本地存储:localStorage 和 sessionStorage基本使用方法1. localStorage

使用JavaScript将PDF页面中的标注扁平化的操作指南

《使用JavaScript将PDF页面中的标注扁平化的操作指南》扁平化(flatten)操作可以将标注作为矢量图形包含在PDF页面的内容中,使其不可编辑,DynamsoftDocumentViewer... 目录使用Dynamsoft Document Viewer打开一个PDF文件并启用标注添加功能扁平化

JavaScript DOM操作与事件处理方法

《JavaScriptDOM操作与事件处理方法》本文通过一系列代码片段,详细介绍了如何使用JavaScript进行DOM操作、事件处理、属性操作、内容操作、尺寸和位置获取,以及实现简单的动画效果,涵... 目录前言1. 类名操作代码片段代码解析2. 属性操作代码片段代码解析3. 内容操作代码片段代码解析4.

SpringBoot使用Apache POI库读取Excel文件的操作详解

《SpringBoot使用ApachePOI库读取Excel文件的操作详解》在日常开发中,我们经常需要处理Excel文件中的数据,无论是从数据库导入数据、处理数据报表,还是批量生成数据,都可能会遇到... 目录项目背景依赖导入读取Excel模板的实现代码实现代码解析ExcelDemoInfoDTO 数据传输

Python使用asyncio实现异步操作的示例

《Python使用asyncio实现异步操作的示例》本文主要介绍了Python使用asyncio实现异步操作的示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋... 目录1. 基础概念2. 实现异步 I/O 的步骤2.1 定义异步函数2.2 使用 await 等待异

MyBatis框架实现一个简单的数据查询操作

《MyBatis框架实现一个简单的数据查询操作》本文介绍了MyBatis框架下进行数据查询操作的详细步骤,括创建实体类、编写SQL标签、配置Mapper、开启驼峰命名映射以及执行SQL语句等,感兴趣的... 基于在前面几章我们已经学习了对MyBATis进行环境配置,并利用SqlSessionFactory核

Java操作xls替换文本或图片的功能实现

《Java操作xls替换文本或图片的功能实现》这篇文章主要给大家介绍了关于Java操作xls替换文本或图片功能实现的相关资料,文中通过示例代码讲解了文件上传、文件处理和Excel文件生成,需要的朋友可... 目录准备xls模板文件:template.xls准备需要替换的图片和数据功能实现包声明与导入类声明与

Qt实现文件的压缩和解压缩操作

《Qt实现文件的压缩和解压缩操作》这篇文章主要为大家详细介绍了如何使用Qt库中的QZipReader和QZipWriter实现文件的压缩和解压缩功能,文中的示例代码简洁易懂,需要的可以参考一下... 目录一、实现方式二、具体步骤1、在.pro文件中添加模块gui-private2、通过QObject方式创建