详解归一化、标准化、正则化以及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数组嵌套顺序可颠倒, 实际题目需要确定遍历顺序) 状…

天线 有源 无源 参数

无源测试驻波比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. 关闭并…

【鸿蒙学习笔记】基础组件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 …

技术派全局异常处理

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

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

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

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、通道统计 显示可用通道&…

Lipschitz 连续,绝对连续

1. Lipschitz 连续 经常听到这个名词&#xff0c; Lipschitz 连续比普通连续更强&#xff0c;不仅要求函数连续&#xff0c;还要求函数的梯度小于一个正实数。 在单变量实数函数上的定义可以是&#xff1a; 对于定义域内任意两个 x 1 x_1 x1​ and x 2 x_2 x2​, 存在一个…

云计算与生成式AI的技术盛宴!亚马逊云科技深圳 Community Day 社区活动流程抢先知道!

小李哥最近要给大家分享7月7日在深圳的即将举办的亚马逊云科技生成式AI社区活动Community Day &#xff0c;干货很多内容非常硬核&#xff0c;不仅有技术分享学习前沿AI技术&#xff0c;大家在现场还可以动手实践沉浸式体验大模型&#xff0c;另外参与现场活动还可以领取诸多精…

顺序表(C语言详细版)

1. 线性表 线性表(lina list)是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构&#xff0c;常见的线性表&#xff1a;顺序表、链表、栈、队列、字符串...... 线性表在逻辑上是线性结构&#xff0c;也就是说连续的一条直线。但是在物理结构上并…

一文汇总全球热门新闻API

新闻API通过提供快速、准确和全面的新闻内容&#xff0c;已经成为现代社会不可或缺的一部分&#xff0c;对人们的生活、工作环境和科技发展产生了深远的影响。新闻API使人们能够快速获取来自世界各地的实时新闻和信息&#xff0c;提高了信息的可访问性。通过新闻API&#xff0c…

C++算法学习心得八.动态规划算法(6)

1.最长递增子序列&#xff08;300题&#xff09; 题目描述&#xff1a; 给你一个整数数组 nums &#xff0c;找到其中最长严格递增子序列的长度。 子序列是由数组派生而来的序列&#xff0c;删除&#xff08;或不删除&#xff09;数组中的元素而不改变其余元素的顺序。例如&…

Redis分布式集群部署

目录 一. 原理简述 二. 集群配置​​​​​​​ 2.1 环境准备 2.2 编译安装一个redis 2.3 创建集群 2.4 写入数据测试 实验一&#xff1a; 实验二&#xff1a; 实验三&#xff1a; 实验四&#xff1a; 添加节点 自动分配槽位 提升节点为master&#xff1a; 实验…

关于电商平台分类||电商平台商品分类接口|电商平台商品数据

电商平台 做电商&#xff0c;则要有电商平台&#xff0c;一个为 企业 或 个人 提供网上交易洽谈的平台。. 企业电子商务平台是建立在 Internet 网上进行商务活动的虚拟网络空间和保障商务顺利运营的管理环境&#xff1b;是协调、整合 信息流 、货物流、 资金流 有序、关联、高效…