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

news2024/7/4 5:12:42

文章目录

      • 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 np

def 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 np

def 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_data
    return 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 nn

class 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.coloradmin.cn/o/1884034.html

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

相关文章

Python 文件操作

文件编码 将文件的内容翻译为二进制 文件操作 打开文件 open函数 语法: open(name, mode, encoding)name:文件名的字符串,可以包含具体路径。若没有路径,则默认为与py文件位于同一层 mode:打开文件的模式&#xf…

tkinter实现进度条

tkinter实现进度条 效果代码解析导入需要的模块定义进度条 代码 效果 代码解析 导入需要的模块 import tkinter as tk from tkinter import ttk定义进度条 def start_progress():progress[value] 0max_value 100step 10for i in range(0, max_value, step):progress[valu…

职场新宠“禁止蕉绿”:解压新方式,健康新态度

近期,一种名为“禁止蕉绿”的带杆香蕉在职场人群中悄然走红,成为他们工位上的新宠。这一现象源于“蕉绿”与“焦虑”的谐音,寓意着职场人对远离焦虑、追求心理放松的渴望。在社交平台上,种植水培果蔬如香蕉、菠萝等已成为职场话题…

一文带您了解Fiddler的家族产品:Fiddler Classic、FiddlerCore、Fiddler和Cap、Fiddler Jam

最近更新了一下Fiddler(好久没更新了),然后浏览了一下官方网站,发现fillder的变化还是蛮大的,新出了好多产品,在这里我就把这些产品进行汇总比较,便于大家快速了解,快速选择自己需要…

为什么网络爬虫广泛使用HTTP代理?

一、引言 网络爬虫作为自动抓取互联网信息的重要工具,在现代社会中发挥着不可或缺的作用。然而随着网络环境的日益复杂,网站反爬虫技术的不断进步,网络爬虫在获取数据的过程中面临着越来越多的挑战。为了应对这些挑战,HTTP 代理成…

复制 pdf 的表格到 markdown 版本的Typora 或者 word 中

在 pdf 中选中复制表格内容,直接粘贴到 typora 中失败,可以使用 txt文件和 excel 做过渡。 准备一个空的 txt 文件,将 pdf 中表格的数据复制粘贴到txt文件中,文本内容会以空格分开,如下图的形式: 打开 exc…

【Excel、RStudio计算T检测的具体操作步骤】

目录 一、基础知识1.1 显著性检验1.2 等方差T检验、异方差T检验1.3 单尾p、双尾p1.3.1 检验目的不同1.3.2 用法不同1.3.3 如何选择 二、Excel2.1 统计分析工具2.1.1 添加统计分析工具2.1.2 数据分析 2.2 公式 -> 插入函数 -> T.TEST 三、RStudio 一、基础知识 参考: 1.…

Spring底层原理之bean的加载方式四 @import 注解

bean的加载方式四 import 第四种bean的导入方式 是import导入的方式 在配置类上面加上注解就行 package com.bigdata1421.config;import com.bigdata1421.bean.Dog; import org.springframework.context.annotation.Import;Import(Dog.class) public class SpringConfig4 {…

直播的js代码debug解析找到protobuf消息的定义

我们都知道直播的弹幕消息是通过websocket发送的,而且是通过protobuf传输的,那么这里面传输了哪些内容,这个proto文件又要怎么定义?每个消息叫什么,消息里面又包含有哪些字段,每个字段又是什么类型&#xf…

1-3.文本数据建模流程范例

文章最前: 我是Octopus,这个名字来源于我的中文名–章鱼;我热爱编程、热爱算法、热爱开源。所有源码在我的个人github ;这博客是记录我学习的点点滴滴,如果您对 Python、Java、AI、算法有兴趣,可以关注我的…

# [0701] Task05 策略梯度、Actor-critic 算法

easy-rl PDF版本 笔记整理 P4、P9 joyrl 比对 补充 P9 - P10 相关 代码 整理 最新版PDF下载 地址:https://github.com/datawhalechina/easy-rl/releases 国内地址(推荐国内读者使用): 链接: https://pan.baidu.com/s/1isqQnpVRWbb3yh83Vs0kbw 提取码: us…

LeetCode中MySQL题目 176.第二高的薪水

题目图片: 题目解答: SELECTIFNULL((SELECT DISTINCT SalaryFROM EmployeeORDER BY Salary DESCLIMIT 1 OFFSET 1),NULL) AS SecondHighestSalary解答解析: 就是用了一个叫做IFNULL的函数进行判断,如果查找出来的内容为空&…

信息系统的安全模型

1. 信息系统的安全目标 信息系统的安全目标是控制和管理主体(含用户和进程)对客体(含数据和程序)的访问。作为信息系统安全目标,就是要实现: 保护信息系统的可用性; 保护网络系统服务的…

第1章 人工智能的基础概念与应用导论

亲爱的读者朋友们,你们好!欢迎来到这个充满神奇与奥秘的人工智能世界。我知道,对于很多人来说,人工智能(AI)可能是个既神秘又高大上的词汇,仿佛遥不可及,只存在于科幻电影或者顶级科…

大数据学习之Clickhouse

Clickhouse-23.2.1.2537 学习 一、Clickhouse概述 clickhouse 官网网址:https://clickhouse.com/ ClickHouse是一个用于联机分析(OLAP)的列式数据库管理系统(DBMS)。 OLTP(联机事务处理系统)例如mysql等关系型数据库,在对于存储小数据量的时候&#xff…

Linux内核——Linux内核体系模式(二)

1 Linux系统的中断机制 Linux内核将中断分为两类:硬件中断和软件中断(异常)。每个中断是由0-255之间的一个数字进行标识。 中断int0-int31(0x00-0x1f)作为异常int32-int255由用户自己设定 int32-int47对应与8259A中断…

怎么永久禁止win10系统自动更新?一键屏蔽系统自动更新

现在 Windows 10 系统是很多办公用户的主力操作系统,可是 Windows 系统会自动更新,这会严重影响系统稳定性。因为微软虽然以提供更新为服务,但并不是每次更新它都是安全的。 接下来和我一起看看如何使用联想开发的小工具一键屏蔽系统自动更新…

数据库定义语言(DDL)

数据库定义语言(DDL) 一、数据库操作 1、 查询所有的数据库 SHOW DATABASES;效果截图: 2、使用指定的数据库 use 2403 2403javaee;效果截图: 3、创建数据库 CREATE DATABASE 2404javaee;效果截图: 4、删除数据…

Datax快速使用之牛刀小试

前言 一次我发现业务他们在用 datax数据同步工具,我尤记得曾经 19 年使用过,并且基于当时的版本还修复了个 BUG并且做了数据同步管道的集成开发。没想到时间过的飞快,业务方基于海豚调度 2.0.6 的版本中有在使用,由于业务方还没有…

光伏设计的原则和必备要素

光伏设计是一项复杂的工程任务,它涉及到将太阳能转换为电能的过程,并在各种环境条件下确保系统的稳定、高效运行。以下是光伏设计应遵循的原则和必备的要素。 一、光伏设计的原则 1、最大化能量产出:光伏设计的首要原则是通过合理的布局和选…