神经网络常用归一化和正则化方法解析(一)

🎀个人主页: 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的计算过程如下

  1. 对于每个特征维度,计算该维度上的均值和方差。
  2. 对输入进行标准化,即减去均值并除以方差。
  3. 将标准化后的数据乘以一个可学习的缩放参数(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×W1i=1Hj=1Wxcij
σ 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×W1i=1Hj=1W(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^=σcxcijμc

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

y c i j = γ c x c i j ^ + β c {y}_{cij}=\gamma_c \hat{{x}_{cij}} +\beta_c ycij=γcxcij^+β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内,一个图像对应的所有通道的分组上做归一化。
  • 优点: 适用于小批量、样本数不同的情况,对卷积层效果较好。
  • 缺点: 对小数据集的效果可能较差,相对于批归一化在某些场景下可能计算开销较大。

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/198493.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Diary11-Word文字

Word文字 一.标尺与标记 1.标尺 1.1标尺的打开方式 标尺:视图->标尺(选中即可) 1.2标尺的相关操作 左边的倒三角:【首行缩进】->第一行与左边的间距 左边的正三角:【悬挂缩进】->除了第一行之外的行与左边的间距 右边的正三角…

Win环境中安装Jenkins指南

目录 安装Java环境 下载并安装Jenkins Jenkins版本 启动Jenkins 如何删除Jenkins 安装Java环境 访问 Oracle官方网站 下载并安装JDK 安装完成后,设置系统环境变量 JAVA_HOME 到你的 JDK 安装路径,并将 %JAVA_HOME%\bin 添加到系统 PATH 中。 下载…

Apollo新版本Beta技术沙龙参会感受:未来的自动驾驶之旅

Apollo新版本Beta技术沙龙参会感受:未来的自动驾驶之旅 🚗💡 文章目录 Apollo新版本Beta技术沙龙参会感受:未来的自动驾驶之旅 🚗💡摘要引言正文📍 参会流程介绍🌟 参会收获&#x1…

「Verilog学习笔记」任意小数分频

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点,刷题网站用的是牛客网 timescale 1ns/1nsmodule div_M_N(input wire clk_in,input wire rst,output wire clk_out );parameter M_N 8d87; parameter c89 8d24; // 8/9时钟切换点parameter di…

封装时间轴组件 timeline

要求时间轴的点展示进度百分比&#xff0c;线也根据进度不同展示不同长度的颜色 实现效果&#xff1a; 使用的组件库是vant的circle 子组件&#xff1a; <template><div class"m-timeline-area" :style"width: ${width}px"><div class&qu…

python读取txt,csv, 等不同格式的文件——(待完善)

python 读取txt文件 1.python读取txt文件&#xff08;多种方法&#xff09;

#名词区别篇:事件流事件委托addEventListener白屏时间首屏时间

事件流 事件捕获 —从外到内 到达目标 事件冒泡—从内到外 事件委托 定义&#xff1a;当有大量子元素触发事件时&#xff0c;将事件监听器绑定在父元素进行监听&#xff0c;此时数百个事件监听器变成一个监听器。 e.currentTarget 与 e.target 有何区别 Event 接口的只读…

前端利用JS获取最近1、3、5、n年的开始时间和结束时间

1.获取最近1年的开始时间和结束时间 function getLastYearStartAndEnd() {const currentDate new Date();const currentYear currentDate.getFullYear();const currentMonth currentDate.getMonth() 1;const lastYearStart new Date(currentYear - 1, currentMonth, 1);c…

聊聊 Jetpack Compose 的 “状态订阅自动刷新” -- 你真的了解重组吗?

Jekpack Compose “状态订阅&自动刷新” 系列&#xff1a; 【 聊聊 Jetpack Compose 的 “状态订阅&自动刷新” - - MutableState/mutableStateOf 】 【 聊聊 Jetpack Compose 的 “状态订阅&自动刷新” - - remember 和重组作用域 】 【 聊聊 Jetpack Compose 的 …

Spring Cloud 配置 Druid(二)

不废话&#xff0c;直接上代码&#xff0c; Nacos搭建的微服务&#xff0c;可以看Spring Cloud 配置 Nacos&#xff08;一&#xff09;-CSDN博客 一&#xff0c;pom文件 spring-cloud-starter-alibaba-nacos-discovery 和 spring-cloud-starter-openfeign 都是基于spring-cl…

Apollo新版本Beta技术沙龙的参会感受

Apollo新版本Beta技术沙龙的参会感受 Apollo新版本Beta技术沙龙的参会感受摘要 &#x1f697;&#x1f310;参会流程 &#x1f5d3;️展厅参观/展厅讲解 &#x1f3e2;进入百度Apollo未来驾驶汽车5G云代驾的神奇签到 &#x1f4dd;Apollo新版本Beta整体介绍 &#x1f680;技术分…

C语言:用递归的方法求斐波那契数列:1,1,2,3,5,8,……的前40个数

分析&#xff1a; 首先&#xff0c;在代码的起始部分&#xff0c;包含<stdio.h>头文件&#xff0c;这个头文件提供了输入和输出的函数。 然后&#xff0c;定义了四个变量&#xff1a;f、f1、f2和i。f1和f2是斐波那契数列的前两个数字&#xff0c;初始化为1。f是当前计…

qt使用wimlib-imagex,做windows系统备份还原

wimlib-imagex是个第三方工具&#xff0c;可对系统映像进行操作&#xff0c;下载地址&#xff1a; https://wimlib.net/downloads/index.html 程序主要用到以下这两个文件&#xff1a;libwim-15.dll和wimlib-imagex.exe wimlib-imagex.exe的调用命令参数&#xff0c;可以通过…

【Docker】资源配额及私有镜像仓库

资源配额及私有镜像仓库 一、Docker资源配额1.1、控制cpu1.1.1、cpu份额控制1.1.2、core核心控制1.1.3、配额控制参数的混合使用 1.2、控制内存1.3、控制IO1.4、资源释放 二、Docker私有镜像仓库Harbor2.1、Harbor简介2.2、为Harbor自签发证书【1】生成ca证书【2】生成域名的证…

输出完全二叉树中某个结点的双亲和所有子孙。假设完全二叉树的顺序存储在一维数组A[n]中。

思路&#xff1a; 首先定义两个函数&#xff0c;getParent函数用于获取指定结点的双亲结点的索引&#xff0c;printDescendants函数用于输出指定结点的所有子孙。然后在main函数中&#xff0c;创建表示完全二叉树的数组A&#xff0c;并针对指定结点索引进行相关操作&#xf…

HOST文件被挟持,无法上网,如何解决。

问题&#xff1a; 晚上开机&#xff0c;突然发现无法联网&#xff0c;提示网络异常 解决&#xff1a; 首先网络诊断&#xff0c;host文件被劫持&#xff0c;修复后&#xff0c;仍然不行。 然后测试手机热点&#xff0c;发现仍然无法联网 尝试用火绒修复&#xff0c;无果。 所有…

Python 解析JSON实现主机管理

JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0c;它以易于阅读和编写的文本形式表示数据。JSON 是一种独立于编程语言的数据格式&#xff0c;因此在不同的编程语言中都有对应的解析器和生成器。JSON 格式的设计目标是易于理解、…

【解决方案】环保设备用电与电网数据集中展示平台的应用与研究

摘 要&#xff1a;近年来&#xff0c;信息化不断推进&#xff0c;政府工作方式以及职能不断改革&#xff0c;许多省级环保部门开展环保与信息技术的融合&#xff0c;用于推进环保的发展。本文基于环境监测研究省级环保与电网数据集中展示平台的应用。环境监测是环保工作的重要组…

读书笔记-《数据结构与算法》-摘要1[数据结构]

文章目录 [数据结构]1. String - 字符串2. Linked List - 链表2.1 链表的基本操作2.1.1 反转链表单向链表双向链表 2.1.2 删除链表中的某个节点2.1.3 链表指针的鲁棒性2.1.4 快慢指针 3. Binary Tree - 二叉树3.1 树的遍历3.2 Binary Search Tree - 二叉查找树 4. Queue - 队列…

JSP入门+EL表达式+JSTL标签

1.JSP&#xff1a; 1.指令 2.注释 3.内置对象 2.MVC开发模式 3.EL表达式 4.JSTL标签 5.三层架构 ## JSP&#xff1a; 1.指令 *用于配置JSP页面&#xff0c;导入资源文件 *格式&#xff1a;<% 指令名称 属性名1属性值1 属性名2属性值2 .......%> *分类&#xff1…