深度学习基础之归一化

2023-05-16


文章目录

  • 一、归一化的含义
  • 二、归一化的作用
  • 三、归一化的类型
    • 1、线性归一化
    • 2、零-均值规范化(z-score标准化
    • 3、小数定标规范化
    • 4、非线性归一化
  • 四、归一化理解
    • 1、归一化能提高求解最优解速度
    • 2、3D 图解未归一化
  • 五、局部响应归一化
  • 六、批归一化(BatchNormalization)
    • 1、引入
    • 2、BN算法的优点
    • 3、批归一化(BN)算法流程


数据归一化是深度学习数据预处理非常关键的步骤,可以起到统一量纲,防止小数据被吞噬等作用。

归一化:把所有数据都转化为[0,1]或者[-1,1]之间的数,其目的是取消各维数据间数量级差别,避免因为输入输出数据数量级差别较大而造成网络预测误差较大。

一、归一化的含义

归一化的具体作用是归纳统一样本的统计分布性。归一化在 0 − 1 0-1 01 之间是统计的概率分布, 归一化在-1~ +1 之间是统计的坐标分布。

归一化有同一、统一和合一的意思。无论是为了建模还是为了计算,首先基本度量单位要同一,神经网络是以样本在事件中的统计分别几率来进行训练(概率计算)和预测的,且 sigmoid 函数的取值是 0 到 1 之间的,网络最后一个节点的输出也是如此,所以经常要对样本的输出归一化处理。

归一化是统一在 0 − 1 0-1 01 之间的统计概率分布, 当所有样本的输入信号都为正值时,与第一隐含层神经元相连的权值只能同时增加或减小,从 而导致学习速度很慢。另外在数据中常存在奇异样本数据,奇异样本数据存在所引起的网络训练时间增加,并可能引起网络无法收敛。为了避免出现这种情况及后面数据处理的方便,加快网络学习速度,可以对输入信号进行归一化,使得所有样本的输入信号其均值接近于 0 或与其均方差相比很小。

二、归一化的作用

  • 1、为了后面数据处理的方便,归一化的确可以避免一些不必要的数值问题。
  • 2、为了程序运行时收敛加快。
  • 3、同一量纲。样本数据的评价标准不一样,需要对其量纲化,统一评价标准。这算是应用层面的需求。
  • 4、避免神经元饱和。什么意思?就是当神经元的激活在接近 0 或者 1 时会饱和,在这些区域,梯度几乎为 0,这样,在反向传播过程中,局部梯度就会接近 0,这会有效地“杀死” 梯度。
  • 5、保证输出数据中数值小的不被吞食。

三、归一化的类型

1、线性归一化

也称为最小-最大规范化离散标准化,是对原始数据的线性变换,将数据值映射到 [ 0 , 1 ] [0, 1] [0,1]之间。

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)

离差标准化保留了原来数据中存在的关系,是消除量纲和数据取值范围影响的最简单方法。

适用范围:比较适用在数值比较集中的情况。

缺点

  • 1)如果 max 和 min 不稳定,很容易使得归一化结果不稳定,使得后续使用效果也不稳定。如遇到超过目前属性 [ m i n , m a x ] [min,max] [min,max]取值范围的时候,会引起系统报错,需要重新确定min和max。
  • 2)如果数值集中且某个数值很大,则规范化后各值接近于0,并且将会相差不大。(如 1, 1.2, 1.3, 1.4, 1.5, 1.6,10)这组数据。

2、零-均值规范化(z-score标准化

零-均值规范化也称标准差标准化,经过处理的数据的均值为0,标准差为1。转化公式为:

x ′ = x − μ δ x'=\frac{x-\mu}{\delta} x=δxμ

其中 μ \mu μ为原始数据的均值, δ \delta δ为原始数据的标准差,是当前用得最多的数据标准化方式。

标准差分数可以回答这样一个问题:"给定数据距离其均值多少个标准差"的问题,在均值之上的数据会得到一个正的标准化分数,反之会得到一个负的标准化分数。

3、小数定标规范化

通过移动属性值的小数位数,将属性值映射到[-1, 1]之间,移动的小数位数取决于属性值绝对值的最大值。转化公式为:

x ′ = x 1 0 k x'=\frac{x}{10^k} x=10kx

4、非线性归一化

该方法包括 log、指数,正切等。

适用范围:经常用在数据分化比较大的场景,有些数值很大,有些很小。通过一些数学函 数,将原始值进行映射。

四、归一化理解

1、归一化能提高求解最优解速度

在这里插入图片描述
两张图代表数据是否均一化的最优解寻解过程(圆圈可以理解为等高线)。左图表示未经归一化操作的寻解过程,右图表示经过归一化后的寻解过程。

当使用梯度下降法寻求最优解时,很有可能走“之字型”路线(垂直等高线走),从而导致需要迭代很多次才能收敛;而右图对两个原始特征进行了归一化,其对应的等高线显得很圆, 在梯度下降进行求解时能较快的收敛。

因此如果机器学习模型使用梯度下降法求最优解时,归一化往往非常有必要,否则很难收 敛甚至不能收敛。

2、3D 图解未归一化

例子:

假设 w 1 w_1 w1 的范围在 [ − 10 , 10 ] [-10,10] [1010],而 w 2 w_2 w2 的范围在 [ − 100 , 100 ] [-100,100] [100100],梯度每次都前进 1 单位,那 么在 w 1 w_1 w1 方向上每次相当于前进了 1 / 20 1/20 1/20,而在 w 2 w_2 w2 上只相当于 1/200!某种意义上来说,在 w 2 w_2 w2 上前进的步长更小一些,而 w 1 w_1 w1 在搜索过程中会比 w 2 w_2 w2“走”得更快。

这样会导致,在搜索过程中更偏向于 w 1 w_1 w1 的方向。走出了“L”形状,或者成为“之”字 形。

在这里插入图片描述

五、局部响应归一化

局部响应归一化LRN 是一种提高深度学习准确度的技术方法。LRN 一般是在激活、池化函数后的一种方法。该方法是由AlexNet网络提出,对局部神经元的活动创建竞争机制,使得其中响应比较大的值变得相对更大,并抑制其他反馈较小的神经元,增强了模型的泛化能力。

LRN层模仿了生物神经系统的“侧抑制”机制,对局部神经元的活动创建竞争环境,使得其中响应比较大的值变得相对更大,并抑制其他反馈较小的神经元,增强模型的泛化能力。

LRN对于ReLU这种没有上限边界的激活函数会比较有用,因为它会从附近的多个卷积核的响应中挑选比较大的反馈,但不适合Sigmoid之中有固定边界并且能抑制过大值的激活函数。

公式如下:
在这里插入图片描述
其中:

  • a:表示卷积层(包括卷积操作和池化操作)后的输出结果,是一个四维数组[batch,height,width,channel]。

  • batch:批次数(每一批为一张图片)。
    height:图片高度。
    width:图片宽度。
    channel:通道数。可以理解成一批图片中的某一个图片经过卷积操作后输出的神经元个数, 或理解为处理后的图片深度。

  • b x , y i b_{x,y}^i bx,yi是归一化后的值。

  • a x , y i a_{x,y}^i ax,yi表示在这个输出结构中的一个位置[a,b,c,d],可以理解成在某一张图中的某一个通道下的某个高度和某个宽度位置的点,即第 a 张图的第 d 个通道下的高度为 b 宽度为 c 的点。

该层还需要参数:

  • n: 临近的feature map 数目,用于表示局部区域的大小,注意,这里的区域指的是一维区域,区别于图像中某像素点的临近像素。
  • N:通道(featrure map)总数(这里的通道不是图像的通道,而是指不同的kernal生成的featuremap)
  • α : 缩放因子
  • β :指数项
  • ∑:∑叠加的方向是沿着通道方向的,即每个点值的平方和是沿着 a 中的第 3 维 channel 方向的,也就是一个点同方向的前面 n / 2 n/2 n/2 个通道(最小为第 0 个通道)和后 n / 2 n/2 n/2 个通道(最大为第 d − 1 d-1 d1 个通道)的点的平方和(共 n + 1 n+1 n+1 个点)。而函数的英文注解中也说明了把 input 当成是 d d d 个 3 维的矩阵,说白了就是把 input 的通道数当作 3 维矩阵的个数,叠加的方向也是在通道方向。

例如:
i = 10 , N = 96 , n = 4 i = 10, N= 96, n = 4 i=10,N=96,n=4.
当求第10个卷积核在位置 x , y x,y x,y处特征为a,那么该处的局部响应为 a a a除以第8,9,10,11,12个卷积核在 x , y x,y xy处特征平方和。

tesorflow代码

import tensorflow as tf
import numpy as np
x = np.array([i for i in range(1,33)]).reshape([2,2,2,4])
y = tf.nn.lrn(input=x,depth_radius=2,bias=0,alpha=1,beta=1) 

with tf.Session() as sess:    
     print(x)    
     print('#############')    
     print(y.eval())

运行结果如下:
在这里插入图片描述
结果解释:
这里要注意一下,如果把这个矩阵变成图片的格式是这样的
在这里插入图片描述
然后按照上面的叙述我们可以举个例子比如26对应的输出结果0.00923952计算如下

26 / ( 0 + 1 ∗ ( 2 5 2 + 2 6 2 + 2 7 2 + 2 8 2 ) ) 1 26/(0+1*(25^2+26^2+27^2+28^2))^1 26/(0+1(252+262+272+282))1

六、批归一化(BatchNormalization)

1、引入

以前在神经网络训练中,只是对输入层数据进行归一化处理,却没有在中间层进行归一化处理。要知道,虽然我们对输入数据进行了归一化处理,但是输入数据经过 δ \delta δ 这样的矩阵乘法以及非线性运算之后,其数据分布很可能被改变,而随着深度网络的多层运算之后,数据分布的变化将越来越大。如果我们能在网络的中间也进行归一化处理,是否对网络的训练起到改进作用呢?答案是肯定的。

这种在神经网络中间层也进行归一化处理,使训练效果更好的方法,就是批归一化 Batch Normalization(BN)。

2、BN算法的优点

  • a) 减少了人为选择参数。在某些情况下可以取消 dropout 和 L2 正则项参数,或者采取更小的 L2 正则项约束参数;
  • b)减少了对学习率的要求。现在我们可以使用初始很大的学习率或者选择了较小的学习率,算法也能够快速训练收敛;
  • c)可以不再使用局部响应归一化。BN 本身就是归一化网络(局部响应归一化在 AlexNet 网络中存在)
  • d)破坏原来的数据分布,一定程度上缓解过拟合(防止每批训练中某一个样本经常被挑选到,文献说这个可以提高 1%的精度);
  • e)减少梯度消失,加快收敛速度,提高训练精度。

3、批归一化(BN)算法流程

输入:上一层输出结果 X = { x 1 , x 2 , … , x m } X=\{x_1,x_2,…,x_m\} X={x1,x2,,xm},学习参数 γ \gamma γ β \beta β

算法流程

(1)计算上一层输出数据的均值:

μ β = 1 m ∑ i = 1 m x i \mu_{\beta}=\frac{1}{m}\sum_{i=1}^{m}x_i μβ=m1i=1mxi

其中,m 是此次训练样本 batch 的大小。

(2)计算上一层输出数据的标准差:

δ β 2 = 1 m ∑ i = 1 m ( x i − μ β ) 2 \delta_{\beta}^2=\frac{1}{m}\sum_{i=1}^m(x_i-\mu_{\beta})^2 δβ2=m1i=1m(xiμβ)2

(3)归一化处理,得到:

x i ^ = x i + μ β δ β 2 + ε \hat{x_i}=\frac{x_i+\mu_{\beta}}{\sqrt{\delta_\beta^2}+\varepsilon } xi^=δβ2 +εxi+μβ

其中 ε \varepsilon ε 是为了避免分母为 0 而加进去的接近于 0 的很小值。

(4)重构,对经过上面归一化处理得到的数据进行重构,得到 :

y i = γ x i ^ + β y_i=\gamma\hat{x_i}+\beta yi=γxi^+β

其中, γ \gamma γ β \beta β, 为可学习参数。

注:上述是 BN 训练时的过程,但是当在投入使用时,往往只是输入一个样本,没有所谓的均值 μ β \mu_\beta μβ和标准差 δ β 2 \delta_\beta^2 δβ2 。此时,均值 μ β \mu_\beta μβ是计算所有 batch μ β \mu_\beta μβ 值的平均值得到,标准差 δ β 2 \delta_\beta^2 δβ2 采用每个 batch δ β 2 \delta_\beta^2 δβ2的无偏估计得到。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

深度学习基础之归一化 的相关文章

  • 驱动开发基础

    1 Hello驱动 我们应用程序使用open函数的时候 xff0c 会调用内核的sys open函数 xff0c 然后接下来 1 然后打开普通文件的话会使用文件系统操作硬件 xff0c 2 要是打开驱动文件 xff0c 会使用驱动程序对应的
  • ARM架构与编程 · 基于IMX6ULL

    一 嵌入式系统硬件介绍 cpu 43 RAM xff08 内存 xff09 43 FALSH 集成 xff08 flash存储设备 xff09 61 MCU 单片机 AP MPU 进化之后可以外接内存和存储设备 跑复杂的操作系统 xff0c
  • 嵌入式常用算法

    1 冒泡排序 1 两两之间对比 xff0c 要是顺序排 xff0c 一轮过后最大的就是最后一个 2 下一轮参加排序的数比上一轮少一个 include lt iostream gt using namespace std void paixu
  • 实习面试的总结

    2023 4 3 阿凡达机器人 驱动开发实习生 1 怎么注册一个字符设备 注销 1 注册一个设备号 2 设备号加载进内核 3 创建类 4 创建设备 注销 1 从内核中删除 2 删除设备 3 删除类 2 怎么将新加入的网络设备加入到内核中去
  • 字符设备结构体与probe函数

    1 设备结构体 设备结构体 struct ap3216c dev dev t devid 设备号 主设备号 43 次设备号 struct cdev cdev cdev 字符设备对象 xff0c 字符设备驱动的一种结构体类型 struct c
  • SLAM --- VIO 基于 EKF 开源

    1 VIO based on EKF 已知一致性的Visual Inertial EKF SLAM 实现添加链接描述
  • 暗夜精灵7 linux

    Ubuntu18 04 安装nvidia显卡驱动 distro non free 小乌坞的博客 CSDN博客 注意在关闭显示界面的时候需要输入密码 xff0c 不然会一直卡着 在验证是否屏蔽驱动的时候 xff0c 要先重启一下 cuda L
  • linux应用编程

    项目内容 开发板内部使用c语言调用硬件驱动实现各种测试功能 xff0c 保存测试结果 外部程序通过socket接口使用tcp协议与开发板通信进行信息传输 xff0c 最后使用python GUI构造一个界面按照测试顺序逐步显示出各个模块的测
  • NUC10快乐装机

    NUC10装机 由于为了RoboMaster比赛 xff0c 身为全队唯一一个视觉队员兼队长的我 xff0c 经过疫情期间的再三斟酌 xff0c 最后决定工控机选择为nuc10 为什么选择nuc10 作为第一年参赛的新队伍 xff0c 视觉
  • 什么是PID?讲个故事,通俗易懂

    什么是PID xff1f PID xff0c 就是 比例 xff08 proportional xff09 积分 xff08 integral xff09 微分 xff08 derivative xff09 xff0c 是一种很常见的控制算
  • C语言对寄存器的封装

    目录 1 封装总线和外设基地址 2 封装寄存器列表 3 修改寄存器的位操作的方法 把变量的某位清零 把变量的某几个连续位清零 对变量的某几位进行赋值 对变量的某位取反 1 封装总线和外设基地址 在编程上为了方便理解和记忆 xff0c 我们把
  • STM32——串口通信及实验

    目录 1 按照数据传送的方向 xff0c 分为 xff1a 2 按照通信方式 xff0c 分为 xff1a STM32串口通信基础 串口通信过程 UART xff08 USART xff09 框图 串口通信实验 编程要点 代码分析 通信接口
  • 【STM32】DMA原理,配置步骤超详细,一文搞懂DMA

    目录 DMA xff08 Direct Memory Access xff09 简介 DMA传输方式 DMA功能框图 DMA请求映像 DMA1控制器 DMA2控制器 通道 仲裁器 DMA主要特性 DMA处理 DMA数据配置 从哪里来到哪里去
  • [STM32学习]——一文搞懂I2C总线

    目录 I2C总线的概念 I2C最重要的功能包括 xff1a I2C的物理层 I2C主要特点 xff1a I2C的高阻态 I2C物理层总结 xff1a I2C的协议层 初始 xff08 空闲 xff09 状态 开始信号 xff1a 停止信号
  • STM32——ADC采集

    目录 ADC简介 ADC主要特征 ADC功能框图 ADC引脚 电压输入范围 通道选择 单次转换模式 连续转换模式 转换顺序 规则序列 注入序列 触发源 转换时间 中断 转换结束中断 模拟看门狗中断 DMA请求 代码讲解 宏定义 xff1a
  • STM32——MPU6050内部DMP固件移植,获取欧拉角

    MPU6050模块是什么东西 xff0c 我这里就不再赘述了 xff0c 围绕它可以做很多应用 xff0c 比如四翼飞行器 平衡车等等 当然要完全使用这块模块不是那么容易的 解释说明 其实我们主要是想通过MPU6050得到欧拉角和四元数 x
  • 树莓派---设置WIFI自动连接或者取消自动连接

    树莓派 设置WIFI自动连接或者取消自动连接 注意一 方案二 设置WIFI自动连接 2 1 远程连接 若树莓派本地操作则跳过 2 2 修改WIFI自动连接配置文件 三 取消WIFI自动连接 注意 系统 xff1a Ubuntu16 04 树
  • ROS——服务通信

    服务通信是ROS中一种及其常用的通信模式 xff0c 服务通信是基于请求响应模式的 xff0c 是一种应答机制 xff0c 也即一个节点A向另一个节点B发送请求 xff0c B接收处理请求并产生响应返回给A xff0c 比如如下场景 xff
  • ROS中的头文件和源文件

    目录 自定义头文件的调用 头文件 可执行文件 配置文件 自定义源文件的调用 头文件 源文件 可执行文件 配置文件 头文件与源文件相关配置 可执行文件配置 本文主要介绍ROS的C 43 43 实现 xff0c 如何使用头文件和源文件的方式封装

随机推荐

  • 一文搞懂——软件模拟SPI

    关于stm32通信协议 xff1a 软件模拟SPI 软件模拟I2C的总结 xff08 fishing 8 xff09 To be a fisher的博客 CSDN博客 stm32 软件spi 发现一篇写的软件模拟SPI的比较容易理解的博客
  • RT-Thread启动流程

    芯片启动到main函数之前的运行过程 不论是否有RTOS xff0c 芯片的启动过程是一致的 xff0c 均是要从复位向量处取得上电复位后要执行的第一个语句 xff0c 接下来进行系统时钟初始化等工作 xff0c 随后跳转到main处 寻找
  • FreeRTOS信号量

    前面介绍过 xff0c 队列 xff08 queue xff09 可以用于传输数据 xff1a 在任务之间 xff0c 任务和中断之间 消息队列用于传输多个数据 xff0c 但是有时候我们只需要传递一个状态 xff0c 这个状态值需要用一个
  • FreeRTOS优先级翻转

    优先级翻转 优先级翻转 xff1a 高优先级的任务反而慢执行 xff0c 低优先级的任务反而优先执行 优先级翻转在抢占式内核中是非常常见的 xff0c 但是在实时操作系统中是不允许出现优先级翻转的 xff0c 因为优先级翻转会破坏任务的预期
  • Git学习

    目录 初始化一个Git仓库 添加文件到Git仓库 xff0c 分为两步 小结 查看状态和文件的修改信息 小结 版本回退 git log查看修改和提交的日志信息 版本回退这里可以使用命令 小结 工作区和暂存区 小结 管理修改 小结 撤销修改
  • 数据的表示和存储——

    目录 浮点数的编码表示 浮点数类型 编辑 浮点数的表示 xff08 1 xff09 浮点数 xff08 Float Point xff09 的表示范围 xff08 2 xff09 规格化数形式 xff08 3 xff09 IEEE 754标
  • GDB Debug

    GDB调试教程 xff1a 1小时玩转Linux gdb命令 biancheng net 有一部分要付费 GDB使用详解 知乎 zhihu com GDB调试入门指南 知乎 zhihu com TUI Debugging with GDB
  • python字符串前加 f 的含义

    字符串前加 f 的含义 先看例子用法总结 副标题 xff1a f string 概述 官方文档 xff1a 点击这里 如果你今天将就而选择参考了我的文档 xff0c 总有一天你还是会去阅读官方文档 先看例子 list span class
  • px4的CMakelists.txt阅读

    Copyright c 2017 PX4 Development Team All rights reserved Redistribution and use in source and binary forms with or with
  • “sudo: aptitude:找不到命令”解决办法

    在Ubuntu上安装seagull先决条件 xff0c 输入如下代码 xff1a zk 64 zk virtual laptop sudo aptitude install build essential curl git libglib2
  • 图优化

    简介 图优化本质上是一个优化问题 xff0c 所以我们先来看优化问题是什么 优化问题有三个最重要的因素 xff1a 目标函数 优化变量 优化约束 一个简单的优化问题可以描述如下 其中x为优化变量 xff0c 而F x 为优化函数 此问题称为
  • Docker容器无法连接主机显示器

    当docker容器无法连接主机显示器时会报各种错误 xff0c 都会包含 couldn 39 t connect to display 34 unix 1 34 此时需要 xff0c 首先在主机终端输入 xhost 43 打开主机显示器连接
  • c++ setprecision用法详解

    c 43 43 setprecision用法详解 可以通过使用 setprecision 操作符来控制显示浮点数值的有效数字的数量 span class token macro property span class token direc
  • VScode+Remote-SSH 实现远程连接LINUX

    目录 VIM编辑器SSH 43 SFPT方法VScode 43 Remote SSH插件配置方法安装Remote SSH插件连接服务器免密登录效果展示 VIM编辑器 从VIM编辑器说起 xff0c 总所周知 xff0c vim编辑器是最难用
  • ubuntu docker配置cuda+anaconda+vscode+tensorflow环境的镜像

    ubuntu docker配置cuda 43 anaconda 43 vscode 43 tensorflow环境 docker 安装docker基本操作查看镜像删除镜像官方镜像 容器基本操作从镜像启动容器列出所有容器终止容器启动容器删除容
  • 查看linux节点gpu显存使用情况

    我们在使用公共节点时经常要看每个节点的使用情况 xff0c 本文可以解决逐个连接才能查看的问题 nvidia smi query gpu span class token operator 61 span memory free memor
  • vnc连接远程服务器中docker容器的桌面

    安装vnc 参考这个 通过VNC搭建Ubuntu 18 04和20 04图形界面 https help aliyun com document detail 59330 html 用下面这段话替换 vnc xstartup vim vnc
  • VNC连接远程主机中docker容器的桌面-转载

    启用新终端 xff0c 讲远程主机映射到本地主机 xff1a ssh L 5901 172 17 0 2 5901 zhl 64 192 168 2 104 进入容器 xff1a docker span class hljs built i
  • chatgpt-4生成代码,看这一篇就够了

    chatgpt 4生成代码 xff0c 看这一篇就够了 cursor示例pythondbscan 聚类voronoi 图像分割手写数字识别圆柱绕流 matlab表白程序常微分方程常微分方程组2048小游戏 C C 43 43 正则表达式匹配
  • 深度学习基础之归一化

    文章目录 一 归一化的含义二 归一化的作用三 归一化的类型1 线性归一化2 零 均值规范化 xff08 z score标准化3 小数定标规范化4 非线性归一化 四 归一化理解1 归一化能提高求解最优解速度2 3D 图解未归一化 五 局部响应