详解归一化、标准化、正则化以及batch normalization

文章目录

      • what(是什么)
      • where(用在哪)
      • How(如何用&&原理)
        • 归一化
          • 实现方式
          • 原理
          • 示例说明
        • 标准化
          • 实现方式
          • 原理
          • 示例说明
        • 正则化
          • 实现方式
          • 原理
          • 作用
        • Batch Normalization
          • pytorch中的batch normalization
          • 原理
          • BN的作用

归一化、标准化、正则化、以及深度学习种经常看到的Batch Normalization分别是什么?用在哪?怎么用,以及各自的原理分别是什么?本文针对这些问题,进行对比分析,整体解析。

what(是什么)

  • 归一化,是对数据进行归一处理,处理的结果,从数据上看,会使得数据全部落在[0,1]的范围;从应用角度看,能够消除量纲的影响,也就是说,归一化在不同的特征之间进行,但可能涉及到一些反归一化的操作。
  • 标准化,主要改变数据的分布,处理结果,从数据上看,会使得数据服从标准正态分布;从应用的角度看,这种标准的正态分布能够加速模型训练,主要用在同一特征的特征数据上。
  • 正则化,是在机器学习中的损失函数中添加惩罚项,从数据上看,这种惩罚项会减小模型权重,通过减小权重,在应用中,能够降低有效防止过拟合。
  • 而深度学习中常说的Batch Normalization层则是数据标准化的一个更高级的具体实现。具体地,在标准化的基础上,对数据进一步的进行一个缩放和拉伸,以达到学习数据真实分布的目的。从数据上看,经过Batch Normalization层的后的数据,会呈现正态分布;从应用角度,该分布可以有效加速模型模型、防止梯度消失、防止过拟合的作用。

where(用在哪)

  • 归一化,主要用在存在多个特征,且多个特征之间量纲不一致的情况下,需要对数据进行归一化,以消除量纲带来的影响,尤其,当特征的数值范围变化较大时,或者算法对输入数据的数值范围敏感时,可以考虑归一化。
  • 标准化,主要在模型训练阶段,尤其当特征的分布偏差大或者算法对数据的分布敏感时,可以考虑标准化。
  • 正则化,主要用在机器学习的损失函数上。通过在损失函数上施加惩罚项,来降低模型复杂度,特别是在数据量不足或者特征数目较多时。

How(如何用&&原理)

归一化
实现方式
  • 最大最小归一化
    将数据缩放到一个固定的范围,通常是[0, 1]或者[-1, 1]。
## 在 python 中实现最大最小归一化的操作import numpy as npdef min_max_normalize(data):min_val = np.min(data)max_val = np.max(data)normalized_data = (data - min_val) / (max_val - min_val)return normalized_data
原理

公式为: x ′ = x − m i n ( x ) m a x ( x ) − m i n ( x ) x'=\frac{x-min(x)}{max(x)-min(x)} x=max(x)min(x)xmin(x), 其中, ( x ) (x) (x) 是原始数据, ( x ′ ) (x') (x) 是归一化后的数据, m i n ( x ) min(x) min(x) m a x ( x ) max(x) max(x) 分别是数据集 X X X 的最小值和最大值。

示例说明

在许多机器学习算法中,如支持向量机(SVM)、k近邻(k-NN)等,距离度量是一个重要的因素。如果特征未经过归一化,具有较大范围值的特征可能会主导距离计算,导致模型偏向于某些特征而忽略其他特征。通过归一化,可以避免这种情况,确保每个特征对模型的贡献相对平等。
例子:

假设我们有一个数据集,包含两个特征:身高(单位:厘米)和体重(单位:千克)。身高的范围可能在150到190厘米之间,而体重的范围可能在50到100千克之间。如果我们不对这些特征进行归一化,身高和体重的值范围差异很大,可能导致机器学习模型在训练过程中对于体重的变化更为敏感,而对身高的变化不敏感。

通过归一化,我们可以将身高和体重都映射到 [0, 1] 的范围内,使得这两个特征的尺度相似。这样模型在训练时能够更平衡地考虑身高和体重对输出(比如预测健康状况)的影响,而不会被特征尺度的差异所影响。

标准化
实现方式
  • Z-score方法
    调整数据分布,将数据拉到均值为0,方差为1的标准正态分布。
import numpy as npdef calculate_z_scores(data):"""计算给定数据集的Z-Scores(标准化)。参数:data: numpy数组,包含要标准化的数据集。返回:Z-Scores的numpy数组,与输入数据形状相同。"""mean_data = np.mean(data)std_data = np.std(data)z_scores = (data - mean_data) / std_datareturn z_scores# 示例用法
X = np.array([1, 2, 3, 4, 5])
Z_scores = calculate_z_scores(X)
print("原始数据 X:", X)
print("Z-Scores:", Z_scores)
原理

公式为: x ′ = x − m e a n ( x ) s t d ( x ) x'=\frac{x-mean(x)}{std(x)} x=std(x)xmean(x),其中, x ′ x' x为处理后的数据, m e a n ( x ) mean(x) mean(x)为数据的均值, s t d ( x ) std(x) std(x)为数据方差。经过处理,数据服从标准正态分布。

示例说明

假设我们的数据集如下:

特征1特征2
10200
20800
30600
40400

标准化后的数据集如下(保留一位小数):

特征1特征2
-1.3-1.3
-0.51.3
0.50.5
1.3-0.5

通过这种标准化,我们可以看到原始数据的不同尺度被调整到了相似的范围内,这样在进一步的分析和建模中,特征的权重和贡献度更容易理解和比较

正则化
实现方式

在损失函数中添加正则项,其中L1正则添加 λ ∑ i = 1 n ∣ w i ∣ \lambda \sum_{i=1}^{n} |w_i| λi=1nwi,L2正则添加 λ ∑ i = 1 n w i 2 \lambda \sum_{i=1}^{n} w_i^2 λi=1nwi2

原理
  • L1正则化(Lasso正则化): 添加参数向量的L1范数作为惩罚项。它倾向于使得部分参数为零,从而实现特征选择的效果,减少不重要特征对模型的影响。
    Lossregularized = Lossoriginal + λ ∑ i = 1 n ∣ w i ∣ \text{Loss}{\text{regularized}} = \text{Loss}{\text{original}} + \lambda \sum_{i=1}^{n} |w_i| Lossregularized=Lossoriginal+λi=1nwi
    其中, ( λ ) ( \lambda ) (λ) 是正则化强度参数,控制正则化项对总损失的贡献程度。

  • L2正则化(Ridge正则化): 添加参数向量的L2范数平方作为惩罚项。它通过惩罚参数的大小来控制模型的复杂度,避免参数值过大。
    Lossregularized = Lossoriginal + λ ∑ i = 1 n w i 2 \text{Loss}{\text{regularized}} = \text{Loss}{\text{original}} + \lambda \sum_{i=1}^{n} w_i^2 Lossregularized=Lossoriginal+λi=1nwi2
    类似地, ( λ ) ( \lambda ) (λ) 是正则化强度参数。

作用

此处,引用大神深入理解L1、L2正则的博客中的图,进一步说明L1和L2正则。

  • L1正则
    在考虑二维特征的情况下,L1正则的图像应该为一个规则矩形,将正则项记为 J J J,若把正则项 J J J、原始损失函数 L o s s o r i g i n a l Lossoriginal Lossoriginal绘制在同一个坐标下,应该为:
    L1正则
    将带有正则的损失函数记为 L o s s r e g u l a r i z e d Lossregularized Lossregularized,那么 L o s s r e g u l a r i z e d Lossregularized Lossregularized在取到最小值时,应该在 L o s s o r i g i n a l Lossoriginal Lossoriginal J J J的交点处(原因以及具体推导,见大神的博客,主要是一个带约束的优化问题,使用KKT条件求解)。从图像直观理解,损失函数与正则项图像的交点,更容易落在坐标轴而非坐标平面上(高维特征空间会更加明显),在二维空间,就意味着有一维的特征数据为0,也就是说有一个维度的特征没有对损失函数起到作用。从而得出,L1正则具有使得模型更加稀疏的作用,也可以说,起到了一定的特征选择的作用。

  • L2正则
    同样的,将 L 2 L2 L2正则项 J J J以及原始损失函数 L o s s o r i g i n a l Lossoriginal Lossoriginal的等值线绘制在同一个坐标系下。
    在这里插入图片描述
    从图中可以看出,带正则的损失函数 L o s s r e g u l a r i z e d Lossregularized Lossregularized的最小值更多的出现在坐标平面中,因此L2正则是不具有使得模型更加稀疏的能力的。

Batch Normalization
pytorch中的batch normalization

BatchNorm层通常在激活函数之前应用。它会自动计算每个特征的均值和方差,并根据小批量数据的统计信息进行归一化处理,在使用时,需要注意训练与评估模式的切换,训练阶段,使用mini-batch的均值和方差,评估模式(推理模式)下,会默认使用整个批次的均值和方差

对于全连接层(线性层),可以使用 torch.nn.BatchNorm1d(num_features)
对于2维卷积层,可以使用 torch.nn.BatchNorm2d(num_features)
对于3维卷积层(如视频处理),可以使用 torch.nn.BatchNorm3d(num_features)

import torch
import torch.nn as nnclass MyModel(nn.Module):def __init__(self):super(MyModel, self).__init__()self.fc1 = nn.Linear(784, 256)self.bn1 = nn.BatchNorm1d(256)  # BatchNorm1d应用于全连接层输出self.fc2 = nn.Linear(256, 10)def forward(self, x):x = torch.flatten(x, 1)x = self.fc1(x)x = self.bn1(x)x = torch.relu(x)x = self.fc2(x)return x
原理

Batch Normalization由google在2015年提出,主要是为了解决深度神经网络训练过程中的内部协变量偏移(Internal Covariate Shift,在深度神经网络中,每一层的输入数据分布随着网络的训练而发生变化,这被称为内部协变量偏移。这种变化可能导致每层需要不断适应前一层输出的分布变化,使得网络训练过程变得复杂和缓慢)问题,同时有助于加速网络的收敛过程。

  • 算法步骤
    摘自于Batch Normalization论文
    在这里插入图片描述
    BN在减均值除方差后,将数据分布调整为标准的正态分布。此外,额外增加一个缩放和平移的操作,也即增加两个需要学习的参数,分别为 β \beta β γ \gamma γ。这两个参数的引入是为了恢复数据本身的表达能力,对规范化后的数据进行线性变换。
BN的作用

主要有三个作用,首先,通过将特征数据的分布调整到标准正态分布,而在这分布下,激活函数的梯度比较大,能够完美解决梯度消失的问题;其次,由于存在较大的梯度,能够加速模型的训练;最后,由于数据被调整为比较标准的正态分布,模型能够学习到比较通用化的特征,屏蔽了距离正态分布中心较远的特征,避免了对离群特征点的使用,能够在一定程度上减弱过拟合。

附上对BN非常详细的一个解读,有需要的同学可以仔细研读。BN论文的详细解读,该文章通过作图,详细的说明了,在标准正态分布中,激活函数的梯度变化。

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

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

相关文章

代理设计模式和装饰器设计模式的区别

代理设计模式: 作用:为目标(原始对象)增加功能(额外功能,拓展功能) 三种经典应用场景: 1:给原始对象增加额外功能(spring添加事务,Mybatis通过代理实现缓存功能等等) 2:远程代理(网络通信,输出传输(RPC,D…

【TB作品】智能台灯,ATMEGA16单片机,Proteus仿真

智能台灯 1 adc检测光强光敏电阻 显示电压 2 光强太高 也就是高于临界值 就关闭小灯 3 光强太低 也就是低于临界值 就打开小灯 3 按键修改临界值 显示 实验报告:基于ATMEGA16单片机的智能台灯设计与Proteus仿真 1. 实验背景 智能台灯是一种能够根据环境光强自动调…

代码随想录第40天|动态规划

完全背包 完全背包物品可以无限使用 01背包核心代码 01背包中的二维dp数组的两个for遍历可颠倒, 而一维dp数组的一定先遍历物品再遍历背包容量状态转移方程(背包容量一定为递减) 完全背包核心代码 (只在完全背包中一维dp数组嵌套顺序可颠倒, 实际题目需要确定遍历顺序) 状…

【高考志愿】建筑学

目录 一、专业介绍 1.1 专业定义 1.2 专业培养目标 1.3 核心课程 二、就业方向和前景 2.1 就业方向 2.2 专业前景 三、报考注意 四、行业趋势与未来展望 五、建筑学专业排名 一、专业介绍 1.1 专业定义 建筑学,这一充满艺术与科技魅力的学科,…

天线 有源 无源 参数

无源测试驻波比VSWR/回波损耗(Return Loss)≤2效率≥50%输入阻抗50R10%增益天线方向图3D场强图方向性 有源测试 OTA 传导测试:发射功率传导测试:接收灵敏度总辐射功率TRP(Total Radiated Power)≥发射功率减3dB总接收灵敏度TIS(Total Isotrop…

JDBC1(JDBC相关类与接口 ​连接mysql数据库​ 测试 不同数据库厂商实现-MySQL和Oracle)

目录 一、JDBC 1. JDBC相关类与接口 1.1 DriverManager 1.2 Connection 1.3 Statement 4.ResultSet 2. JDBC工作原理 二、连接mysql数据库 1. 导入jar包 2. 使用DriverManager加载驱动类 3. Connection接口 4. Statement接口 5. ResultSet接口 ​编辑 6. 关闭并…

显卡简介

显卡是计算机系统中一个重要的组成部分,它负责处理图形和视频输出。显卡的性能直接影响到计算机的图形处理能力,因此在游戏、视频编辑、3D渲染等需要高性能图形处理的应用中,显卡的选择至关重要。本文将从显卡的基本概念、性能指标、市场现状…

【Node.JS】入门

文章目录 Node.js的入门涉及对其基本概念、特点、安装、以及基本使用方法的了解。以下是对Node.js入门的详细介绍: 一、Node.js基本概念和特点 定义:Node.js是一个基于Chrome V8引擎的JavaScript运行环境,它使得JavaScript能够运行在服务器…

【鸿蒙学习笔记】基础组件Progress:进度条组件

官方文档:Progress 目录标题 作用最全属性迭代追加进度赋值风格样式 作用 进度条组件 最全属性迭代追加 Progress({ value: 20, total: 100, type: ProgressType.Linear }).color(Color.Green)// 颜色.width(200)// 大小.height(50)// 高度.value(50)// 进度可更…

视频转音频:怎样提取视频中的音频?6个提取音频的小技巧(建议收藏)

怎样提取视频中的音频?当我们想从视频中提取出声音时,通常会遇到很多问题。无论是想单独提取出视频里的音频,还是把它转成方便储存或者分享的音频格式,这都会涉及到视频转音频的一个需求。因此,在这篇指南里&#xff0…

Spring Cloud - 项目搭建

1、新建maven项目 新建maven项目,该项目为主项目 1、新建maven项目 2、设置项目类型 3、选择项目原型 4、设置参数 5、等着完成 2、设置项目信息 1、右键,项目属性 2、设置jdk版本 3、选择jdk17 4、修改编译版本 5、右键项目,选择maven->u…

【吊打面试官系列-MyBatis面试题】模糊查询 like 语句该怎么写?

大家好&#xff0c;我是锋哥。今天分享关于 【模糊查询 like 语句该怎么写?】面试题&#xff0c;希望对大家有帮助&#xff1b; 模糊查询 like 语句该怎么写? 第 1 种&#xff1a;在 Java 代码中添加 sql 通配符。 string wildcardname “%smi%”; list<name> names …

CDH安装和配置流程

这份文件是一份关于CDH&#xff08;Clouderas Distribution Including Apache Hadoop&#xff09;安装的详细手册&#xff0c;主要内容包括以下几个部分&#xff1a; 1. **前言**&#xff1a; - CDH是基于Apache Hadoop的发行版&#xff0c;由Cloudera公司开发。 - 相比…

技术派全局异常处理

前言 全局的异常处理是Java后端不可或缺的一部分&#xff0c;可以提高代码的健壮性和可维护性。 在我们的开发中&#xff0c;总是难免会碰到一些未经处理的异常&#xff0c;假如没有做全局异常处理&#xff0c;那么我们返回给用户的信息应该是不友好的&#xff0c;很抽象的&am…

【一篇文章带你搞懂--拉链表!!!拉链表的原理是什么!】

前言&#xff1a; &#x1f49e;&#x1f49e;大家好&#xff0c;我是书生♡&#xff0c;今天主要和大家分享一下拉链表的原理以及使用,希望对大家有所帮助。 大家可以关注我下方的链接更多优质文章供学习参考。 &#x1f49e;&#x1f49e;代码是你的画笔&#xff0c;创新是你…

深入解析:WebKit的JavaScript引擎与V8引擎的比较研究

在现代Web开发中&#xff0c;JavaScript引擎是浏览器的核心组件之一&#xff0c;它们负责解析和执行JavaScript代码。WebKit和V8是两个非常著名的JavaScript引擎&#xff0c;分别被用于不同的浏览器和环境中。WebKit的JavaScript引擎最初是Nitro&#xff0c;后来被JavaScriptCo…

【超简单-Java设计模式1】设计模式的定义、分类及七大设计原则

引言 Java设计模式从入门到精通-设计模式的定义、设计模式分类及七大设计原则 设计模式简介 在软件开发中&#xff0c;设计模式是解决常见设计问题的最佳实践。它们为开发者提供了一种通用的解决方案&#xff0c;使得代码更加灵活、可复用和可维护。在Java编程语言中&#x…

Flink 运行时架构

Flink 运行时的组件 作业管理器&#xff08;JobManager&#xff09;资源管理器&#xff08;ResourceManager&#xff09;任务管理器&#xff08;TaskManager&#xff09;分发器&#xff08;Dispatch&#xff09; JobManager 控制一个应用程序执行的主进程&#xff0c;也就是说…

LiveNVR监控流媒体Onvif/RTSP用户手册-概览:CPU使用、存储使用、带宽使用、负载、内存使用、通道统计

LiveNVR监控流媒体Onvif/RTSP用户手册-概览:CPU使用、存储使用、带宽使用、负载、内存使用、通道统计 1、概览1.1、通道统计1.2、负载1.3、CPU使用1.4、存储使用1.5、带宽使用1.6、内存使用 2、RTSP/HLS/FLV/RTMP拉流Onvif流媒体服务 1、概览 1.1、通道统计 显示可用通道&…

构建Kylin Cube的艺术:最佳实践指南

构建Kylin Cube的艺术&#xff1a;最佳实践指南 Apache Kylin是一个开源的大数据分析引擎&#xff0c;专为大规模数据集提供快速的查询能力。Kylin的核心是Cube&#xff0c;它是一种多维数据模型&#xff0c;能够显著提高查询性能。然而&#xff0c;设计一个高效的Cube需要考虑…