批量归一化(Batch Normalization)-程序员宅基地

技术标签: 机器学习  数据挖掘  

对输入数据进行标准化处理的原因?

使输入数据各个特征的分布相近:

  1. 神经网络学习的本质就是学习数据的分布,如果训练数据与测试数据的分布不同,那么网络的泛化能力也大大降低;
  2. 在使用小批量数据对神经网络进行训练时,若每批训练数据的分布各不相同,网络在每次迭代都去学习适应不同的分布,这会大大降低网络的训练速度;

为什么要使用批量归一化?

使用浅层模型时,随着模型训练的进行,当每层中参数更新时,靠近输出层的输出较难出现剧烈变化。对深层神经网络来说,随着网络训练的进行,前一层参数的调整使得后一层输入数据的分布发生变化,各层在训练的过程中就需要不断的改变以适应学习这种新的数据分布。所以即使输入数据已做标准化,训练中模型参数的更新依然很容易导致后面层输入数据分布的变化,只要网络的前面几层发生微小的改变,那么后面几层就会被累积放大下去。最终造成靠近输出层输出的剧烈变化。这种计算数值的不稳定性通常令我们难以训练出有效的深度模型。如果训练过程中,训练数据的分布一直在发生变化,那么将不仅会增大训练的复杂度,影响网络的训练速度而且增加了过拟合的风险。

在模型训练时,在应用激活函数之前,先对一个层的输出进行归一化,将所有批数据强制在统一的数据分布下,然后再将其输入到下一层,使整个神经网络在各层的中间输出的数值更稳定。从而使深层神经网络更容易收敛而且降低模型过拟合的风险。

批量归一化的优势:

  1. 不加批量归一化的网络需要慢慢的调整学习率时,网络中加入批量归一化时,可以采用初始化很大的学习率,然后学习率衰减速度也很大,因此这个算法收敛很快。
  2. BN可以大大提高模型训练速度,提高网络泛化性能。
  3. 数据批量归一化后相当于只使用了S型激活函数的线性部分,可以缓解S型激活函数反向传播中的梯度消失的问题。

深层神经网络在做非线性变换前的激活输入值,随着网络深度加深或者在训练过程中,其分布逐渐发生偏移或者变动,整体分布逐渐往非线性函数的取值区间的上下限两端靠近,这会导致反向传播时低层神经网络的梯度消失,BN就是通过一定的规范化手段,把每层神经网络任意神经元这个输入值的分布强行拉回到均值为0方差为1的标准正态分布,使得激活输入值落在非线性函数对输入比较敏感的线性区域,其对应的导数远离导数饱和区 ,这样输入的小变化就会导致损失函数较大的变化,避免梯度消失问题产生,学习收敛速度快,能大大加快训练速度。

全连接层如何使用批量归一化?

将批量归一化层置于全连接层中的仿射变换和激活函数之间。设全连接层的输入为u,权重参数和偏差参数分别为W和b,激活函数为ϕ,批量归一化的运算符为BN。那么,使用批量归一化的全连接层输出为

训练阶段:对每一层,BN的计算过程如下:

其中,ϵ>0是一个很小的常数,保证分母大于0。批量归一化在标准化的基础上增加了变换重构,引入了两个可以学习拉伸(scale)参数γ和偏移(shift)参数β,如果批量归一化没有起到优化作用,可以通过这两个参数进行抵消,此时只需学出

批量归一化可以看作在每一层输入和上一层输出之间加入了一个新的计算层,对数据的分布进行额外的约束,从而增强模型的泛化能力。但是批量归一化同时也降低了模型的拟合能力,归一化之后的输入分布被强制拉到均值为0和标准差为1的正态分布上来。以Sigmoid激活函数为例,批量归一化之后数据整体处于函数的非饱和区域,只包含线性变换(多层的线性函数跟一层线性网络是等价的,网络的表达能力下降),破坏了之前学习到的特征分布。为了恢复原始数据分布,保证非线性的获得,引入了变换重构以及可学习参数γ和β,其对应于输入数据分布的方差和偏差。对于一般的网络,不采用批量归一化操作时,这两个参数高度依赖前面网络学习到的连接权重(对应复杂的非线性)。而在批量归一化操作中,γ和β变成了该层的学习参数,仅用两个参数就可以恢复最优的输入数据分布,与之前网络层的参数解耦,从而更加有利于优化的过程,提高模型的泛化能力。

将数据从标准正态分布左移或者右移一点并长胖一点或者变瘦一点,每个实例挪动的程度不一样,这样等价于非线性函数的值从正中心周围的线性区往非线性区动了动。核心思想应该是想找到一个线性和非线性的较好平衡点,既能享受非线性的较强表达能力的好处,又避免太靠非线性区两头使得网络收敛速度太慢。

首先,BN 算法在每一次 iteration 中的每一层输入都进行了归一化,将输入数据的分布归一化为均值为 0,方差为 1 的分布。最后在全体训练集上求取均值和方差(无偏估计),去取代模型 BN 变换层的对应均值和方差。训练完成后的均值方差还只是最后一个 banch 的均值方差,我们最后的模型是基于训练集的,所以最后还需要增加一步替换操作。

预测时的批量归一化

使用批量归一化训练时,我们可以将批量大小设得大一点,从而使批量内样本的均值和方差的计算都较为准确。将训练好的模型用于预测时,我们希望模型对于任意输入都有确定的输出。因此,单个样本的输出不应取决于批量归一化所需要的随机小批量中的均值和方差。一种常用的方法是通过移动平均估算整个训练数据集的样本均值和方差,并在预测时使用它们得到确定的输出。可见,和丢弃层一样,批量归一化层在训练模式和预测模式下的计算结果也是不一样的。

预测阶段

测试阶段一般是输入一个测试样本,得到一个结果。因此测试样本,前向传导的时候,上面的均值u、标准差σ 要哪里来?其实网络一旦训练完毕,参数都是固定的,这个时候即使是每批训练样本进入网络,那么BN层计算的均值u、和标准差都是固定不变的。
在预测阶段,对于均值来说直接计算所有训练batch u值的平均值;然后对于标准偏差采用训练阶段每个batch σB的无偏估计,过程如下:

卷积神经网络中如何使用批量归一化?

对卷积层来说,批量归一化发生在卷积计算之后、应用激活函数之前。如果卷积计算输出多个通道,我们需要对这些通道的输出分别做批量归一化,且每个通道都拥有独立的拉伸和偏移参数,并均为标量。设小批量中有mm个样本。在单个通道上,假设卷积计算输出的高和宽分别为p和q。我们需要对该通道中m×p×q个元素同时做批量归一化。对这些元素做标准化计算时,我们使用相同的均值和方差,即该通道中m×p×q个元素的均值和方差。

批量归一化在卷积神经网络中应用时,需要注意卷积神经网络的参数共享机制。每一个卷积核的参数在不同位置的神经元当中是共享的,因此也应该被一起归一化。具体实现中,假设网络训练中每一批包含b个样本,由一个卷积核生成的特征图的宽高分别为w和h,则每个特征图所对应的全部神经元个数为b×w×h;利用这些神经元对应的所有输入数据,我们根据一组待学习的参数γ和β对每个输入数据进行批量归一化操作。如果有f个卷积核,就对应f个特征图和f组不同的γ和β参数。

BN 层是对于每个神经元做归一化处理,甚至只需要对某一个神经元进行归一化,而不是对一整层网络的神经元进行归一化。既然 BN 是对单个神经元的运算,那么在 CNN 中卷积层上要怎么搞?假如某一层卷积层有 6 个特征图,每个特征图的大小是 100*100,这样就相当
于这一层网络有 6*100*100 个神经元,如果采用 BN,就会有 6*100*100 个参数 γ、β,这样岂不是太恐怖了。因此卷积层上的 BN 使用,其实也是使用了类似权值共享的策略,把一整张特征图当做一个神经元进行处理。
卷积神经网络经过卷积后得到的是一系列的特征图,如果 min-batch sizes 为 m,那么网络某一层输入数据可以表示为四维矩阵(m,f,w,h),m 为 min-batch sizes,f 为特征图个数,w、h 分别为特征图的宽高。在 CNN 中我们可以把每个特征图看成是一个特征处理(一个神
经元),因此在使用 Batch Normalization,mini-batch size 的大小就是:m*w*h,于是对于每个特征图都只有一对可学习参数:γ、β。说白了吧,这就是相当于求取所有样本所对应的一个特征图的所有神经元的平均值、方差,然后对这个特征图神经元做归一化。

对比添加批量归一化和不添加的网络,激活函数的输入分布集中在敏感区域,对应激活函数的导数也比较大,非常有利于网络的学习。

经过激活函数后,激活函数输出分布

经过batch normalization之后,激活函数的输出比较平缓,在饱和阶段和激活阶段都有很多值。对于后面每一层都做这样的操作,那么每一层的输出都会有这样一个分布,更有效的利用tanh的非线性变换,更有利于神经网络的学习。没有使用BN的话,激活函数的输出基本上只有两端最极端的值,都处于饱和阶段,要么为+1,要么为-1,这样的神经网络基本上已经学不到东西了。

训练阶段是每个 batch 的平均值;测试阶段是采用移动平均值,移动平均值是在训练阶段不断更新的(移动平均值计算公式:mean = 0.1 * 当前 mean + 0.9 * 以前的 mean)

 BN  为什么能防止过拟合BN的归一化取决 batch 中的数据,所以相当于做了数据增强。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Yasin0/article/details/93379629

智能推荐

最全面的AI学习路线和资源整理-程序员宅基地

文章浏览阅读1.2k次,点赞2次,收藏18次。目录大纲基础知识1.数学2 统计学3 编程数据分析/挖掘1数据分析的基础书籍2特征工程3 数据挖掘项目机器学习公开课 吴恩达《Machine Learning》公开课 吴恩达 CS229公开课 林轩田《机器学习基石》公开课 林轩田《机器学习技法》书籍《机器学习》书籍《统计学习方法》书籍《Scikit-Learn 与 TensorFlow 机器学习实用指南》实战 Kaggle 比赛工具 Sciki...

SpringBoot-2.3.4集成MybatisPlus-3.4.0(gradle)_spring 2.3.4.release用哪个版本的mybatis-程序员宅基地

文章浏览阅读446次。SpringBoot-2.3.4集成MybatisPlus-3.4.0MybatisPlus官方文档版本环境IntelliJ IDEA:2020.1.2java:jdk-14.0.1springboot:v2.3.4.RELEASEgradle:gradle-6.7-rc-4springfox(swagger):version: '3.0.0'swagger-bootstrap-ui:version: '1.9.6'mysql-connector-java:version: '8.0.16_spring 2.3.4.release用哪个版本的mybatis

人工机器:基于视觉的机械手控制_机器视觉控制机械手的具体过程-程序员宅基地

文章浏览阅读5k次。 《机器人学、机器视觉与控制》一书中,第五部分开始,第15章之前——基于视觉的控制,第442页这样写到。 第二个问题:确保机器人能达到一个期望的位姿,也不是一个简单的事情。正如我们在第七章讨论的那样,机器人末端执行器要通过计算要求的关节角度才能向一个位姿运动。这就要求机器人的运动模型是准确的,它反过来就要要求机器人的加工精度必须非常高:连杆长度必须准确,关节轴之间..._机器视觉控制机械手的具体过程

Android 上自定义的复式折线图(一)_andriod 自定义折线图多条-程序员宅基地

文章浏览阅读1.6k次,点赞3次,收藏5次。最近公司想做一个表格统计图,而且要符合可以多条折线的那种,自己也是翻阅了好多资料也没有找到很合适的一种,后来果断决定还是自己定义一个咯,下面先附上效果图.这里有三条折线,其实里面是有两个列表:一个是管颜色的,另一个是管折线上的数据.同时这里的控件外面也包了一个HorizontalScrollView,当超过屏幕时就可以进行水平滚动.而且这里的控件LineView也提供了很过设置属性的方法._andriod 自定义折线图多条

在vue项目中使用codemirror插件实现代码编辑器功能(代码高亮显示及自动提示)...-程序员宅基地

文章浏览阅读3k次。在vue项目中使用codemirror插件实现代码编辑器功能(代码高亮显示及自动提示)1、使用npm安装依赖npm install --save codemirror;2、在页面中放入如下代码<template> <div> <textarea ref="mycode" class="codesql" v-model="c..._codemirror自定义代码提示

27. NXP官方SDK使用实验_nxp cdc虚拟串口的sdk例程-程序员宅基地

文章浏览阅读1.8k次。1、安装I.MX6ULL SDK包SDK_2.2_MCIM6ULL_RFP_Win.exe2、新建cc.h文件SDK包里面会用到很多数据类型,所以我们需要在cc.h里面定义一些常用的数据类型。3、移植文件nxp\SDK_2.2_MCIM6ULL\devices\MCIMX6Y2需要移植的文件fsl_common.h、fsl_iomuxc.h、MCIMX6Y2.h。设备为MCIMX6Y24、实际代码//main.c#include "fsl_common.h"#include "fsl_i_nxp cdc虚拟串口的sdk例程

随便推点

单体计算机对网络安全,网络信息安全知识:网吧营业场所至少应有三类人员要取得从业资格:经营管理人员、安全管理人员、专业技术人员,至少对获有资格的人数则无规定。()...-程序员宅基地

文章浏览阅读131次。相关题目与解析互联网上网服务营业场所经营者,应当履行下列义务:()。A、落实网络信息安全管理措施;制止、举报在申请办理网吧安全审核手续时,应具备的条件有:()。A:有与开展营业活动相适应的营业场所,营业《互联网上网服务营业场所管理条例》第三章“经营”规定了互联网上网服务营业场所经营单位和上网电信部门负责对互联网上网服务营业场所经营单位信息网络安全的监督管理。()公安机关负责对互联网上网服务营业场所...

android Fragment 内使用scrollview,当fragment显示隐藏时,显示scrollview底部_android fragment 记录scrollview位置-程序员宅基地

文章浏览阅读1.3k次。切换Fragment时,ScrollView会跳转到底部,应该返回到上次停留的位置。思路就是切换fragment时,记录离开时的位置,切换回来以后,滚到到上次的位置@Overridepublic void onHiddenChanged(boolean hidden) { super.onHiddenChanged(hidden); if (scroll_view != null){ ..._android fragment 记录scrollview位置

Excel数据透视表经典教程六《报表布局》_已压缩形式显示-程序员宅基地

文章浏览阅读2.1k次。设置报表布局分类汇总、设置空行、总计一、以压缩形式显示以压缩的形式显示:如上图压缩显示的形式将父字段与子字段在一行进行进行显示,汇总值放在了最上方。压缩显示节省了横向的空间。二、以大纲形式显示2.1快速填充汇总字段下的空格以大纲形式显示数据:特点与压缩形式显示相似,大纲布局同样将汇总值放在最上方。三、以表格形式显示(常用)3.1 表格形式下填充总字段下空值以表格形式显示,对数据的布局比较明了,汇总值放在每以汇总项的下面,方便观看。因此,最常用的显示方式为表格形式显示。注:重复所有_已压缩形式显示

发布失败_没有错误 发布失败-程序员宅基地

文章浏览阅读229次。发布失败_没有错误 发布失败

android studio导入其他项目工程报错解决方法_as 导入别人的源码错误警告很多-程序员宅基地

文章浏览阅读1.4k次。Android studio(简称as),谷歌的亲儿子,基本是目前编写Android软件的最好的开发工具,之前用习惯了eclipse,刚开始使用as怎么都不习惯,但是,能坚持使用as一个月,你会发现,eclipse真不好用,as各种爽。个人推荐还在用eclipse的可以选择as试试 好了,闲话不多说,相信很多刚开始使用as时,会遇到各种各样的问题,比如我之前最头疼的就是导入别人的dem_as 导入别人的源码错误警告很多

LeetCodeWithPython 168. Excel表列名称_leetcode python 168-程序员宅基地

文章浏览阅读120次。题目链接https://leetcode-cn.com/problems/excel-sheet-column-title/题目描述代码初步class Solution(object): def convertToTitle(self, n): """ :type n: int :rtype: str """ ..._leetcode python 168