BN层

论文名字:Batch Normalization: Accelerating Deep Network Training by  Reducing Internal Covariate Shift

论文地址:https://arxiv.org/abs/1502.03167

 

BN被广泛应用于深度学习的各个地方,由于在实习过程中需要修改网络,修改的网络在训练过程中无法收敛,就添加了BN层进去来替换掉LRN层,网络可以收敛。现在就讲一下Batch Normalization的工作原理。

BN层和卷积层,池化层一样都是一个网络层。

 

首先我们根据论文来介绍一下BN层的优点

1)加快训练速度,这样我们就可以使用较大的学习率来训练网络。

2)提高网络的泛化能力。

3)BN层本质上是一个归一化网络层,可以替代局部响应归一化层(LRN层)。

4)可以打乱样本训练顺序(这样就不可能出现同一张照片被多次选择用来训练)论文中提到可以提高1%的精度。

 

前向计算和反向求导

在前向传播的时候:

从论文中给出的伪代码可以看出来BN层的计算流程是:

1.计算样本均值。

2.计算样本方差。

3.样本数据标准化处理。

4.进行平移和缩放处理。引入了γ和β两个参数。来训练γ和β两个参数。引入了这个可学习重构参数γ、β,让我们的网络可以学习恢复出原始网络所要学习的特征分布。

 

在反向传播的时候,通过链式求导方式,求出γ与β以及相关权值 
这里写图片描述

 

怎么使用BN层

先解释一下对于图片卷积是如何使用BN层。 
这里写图片描述 
这是文章卷积神经网络CNN(1)中5x5的图片通过valid卷积得到的3x3特征图(粉红色)。特征图里的值,作为BN的输入,也就是这9个数值通过BN计算并保存γ与β,通过γ与β使得输出与输入不变。假设输入的batch_size为m,那就有m*9个数值,计算这m*9个数据的γ与β并保存。正向传播过程如上述,对于反向传播就是根据求得的γ与β计算梯度。 
这里需要着重说明2个细节: 
1.网络训练中以batch_size为最小单位不断迭代,很显然,新的batch_size进入网络,即会有新的γ与β,因此,在BN层中,有总图片数/batch_size组γ与β被保存下来。 
2.图像卷积的过程中,通常是使用多个卷积核,得到多张特征图,对于多个的卷积核需要保存多个的γ与β。

结合论文中给出的使用过程进行解释 
这里写图片描述 
输入:待进入激活函数的变量 
输出: 
1.对于K维的输入,假设每一维包含m个变量,所以需要K个循环。每个循环中按照上面所介绍的方法计算γ与β。这里的K维,在卷积网络中可以看作是卷积核个数,如网络中第n层有64个卷积核,就需要计算64次。 
需要注意,在正向传播时,会使用γ与β使得BN层输出与输入一样。 
2.在反向传播时利用γ与β求得梯度从而改变训练权值(变量)。 
3.通过不断迭代直到训练结束,求得关于不同层的γ与β。如网络有n个BN层,每层根据batch_size决定有多少个变量,设定为m,这里的mini-batcherB指的是特征图大小*batch_size,即m=特征图大小*batch_size,因此,对于batch_size为1,这里的m就是每层特征图的大小。 
4.不断遍历训练集中的图片,取出每个batch_size中的γ与β,最后统计每层BN的γ与β各自的和除以图片数量得到平均直,并对其做无偏估计直作为每一层的E[x]与Var[x]。 
5.在预测的正向传播时,对测试数据求取γ与β,并使用该层的E[x]与Var[x],通过图中11:所表示的公式计算BN层输出。 
注意,在预测时,BN层的输出已经被改变,所以BN层在预测的作用体现在此处

 

 

BN层原理分析

1 训练数据为什么要和测试数据同分布?

看看下图,如果我们的网络在左上角的数据训练的,已经找到了两者的分隔面w,如果测试数据是右下角这样子,跟训练数据完全不在同一个分布上面,你觉得泛化能力能好吗? 
这里写图片描述

2 为什么白化训练数据能够加速训练进程

如下图,训练数据如果分布在右上角,我们在初始化网络参数w和b的时候,可能得到的分界面是左下角那些线,需要经过训练不断调整才能得到穿过数据点的分界面,这个就使训练过程变慢了;如果我们将数据白化后,均值为0,方差为1,各个维度数据去相关,得到的数据点就是坐标上的一个圆形分布,如下图中间的数据点,这时候随便初始化一个w,b设置为0,得到的分界面已经穿过数据了,因此训练调整,训练进程会加快 
这里写图片描述

3、为什么BN层可以改善梯度弥散

下面xhat到x的梯度公式,可以表示为正常梯度乘一个系数a,再加b,这里加了个b,整体给梯度一个提升,补偿sigmod上的损失,改善了梯度弥散问题。 
这里写图片描述

4、为什么BN层一般用在线性层和卷积层后面,而不是放在非线性单元后

原文中是这样解释的,因为非线性单元的输出分布形状会在训练过程中变化,归一化无法消除他的方差偏移,相反的,全连接和卷积层的输出一般是一个对称,非稀疏的一个分布,更加类似高斯分布,对他们进行归一化会产生更加稳定的分布。其实想想也是的,像relu这样的激活函数,如果你输入的数据是一个高斯分布,经过他变换出来的数据能是一个什么形状?小于0的被抑制了,也就是分布小于0的部分直接变成0了,这样不是很高斯了。

5、BN起作用的原因

通过使得批量数据归一化具有0均值1方差的统计分布,避免数据处于激活函数的饱和区,具有较大的梯度,从而加速网络的训练过程。

减少了网络输入变化过大的问题,使得网络的输入稳定,减弱了与前层参数关系之间的作用,使得当前层独立于整个网络

BN具有轻微正则化的效果,可以和dropout一起使用

主要是归一化激活值前的隐藏单元来加速训练,正则化是副作用

6、BN具有正则化效果的原因

每个批量的数据仅根据当前批量计算均值和标准差,然后缩放

这就为该批量的激活函数带来了一些噪音,类似于dropout向每一层的激活函数带来噪音

若使用了较大的batch_size如512,则减小了噪音,减少了正则化带来的效果

参考文献:

https://blog.csdn.net/donkey_1993/article/details/81871132

https://blog.csdn.net/qq_29573053/article/details/79878437

https://www.cnblogs.com/kk17/p/9693462.html

https://blog.csdn.net/u012151283/article/details/78154917 

转载于:https://www.cnblogs.com/CJT-blog/p/10424058.html

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

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

相关文章

POJ 3613

1 //共T条路&#xff0c;求从S到E经过N条路径的最短路径 2 #include <iostream>3 #include <fstream>4 #include <string.h>5 #include <algorithm>6 using namespace std;7 8 #define CIR(n, m) for (int i0; i<n; i) for (int j0; j<m; j)9 co…

C语言中字符型和字符串型的对比

C语言中字符型和字符串型的对比字符型&#xff1a;C语言中字符用单引号括起来&#xff0c;存储方式以ASCII编码二进制形式存储&#xff0c;占用一个字节如&#xff1a;a,b,c,A等注意&#xff1a;在C语言中将字符型看成特别短的整形&#xff0c;unsigned int 的长度刚好是0-256的…

深入浅出 Javascript API(二)--地图显示与基本操作 转

深入浅出 Javascript API&#xff08;二&#xff09;--地图显示与基本操作 地图显示与基本操作&#xff08;放大、缩小、移动、坐标显示&#xff09;是JavascriptAPI的基本功能&#xff0c;也是一个WebGIS应用的基本内容&#xff0c;Javascript提供了非常便捷的开发方法&#x…

「PKUSC2018」神仙的游戏 - 题解

「PKUSC2018」神仙的游戏 题意&#xff1a;给出一个01?串&#xff0c;其中?可以代替成为0或1&#xff0c;令 $ F(i) $ 表示是否存在长度为 $ i $ 的border&#xff0c;求 $ (F(1) \times 1 \times 1) \bigoplus (F(2) \times 2 \times 2) \bigoplus (F(3) \times 3 \times 3)…

常用哈希函数的比较及其实现

基本概念 所谓完美哈希函数。就是指没有冲突的哈希函数。即对随意的 key1 ! key2 有h(key1) ! h(key2)。 设定义域为X&#xff0c;值域为Y, n|X|,m|Y|。那么肯定有m>n,假设对于不同的key1,key2属于X,有h(key1)!h(key2)&#xff0c;那么称h为完美哈希函数&#xff0c;当mn时&…

C语言 ,嵌入式 ,c++,数据结构 面试题目(4)

sizeof是C/C中的一个操作符&#xff08;operator&#xff09;&#xff0c;简单的说其作用就是返回一个对象或者类型所占的内存字节数。与strlen的区别&#xff1a;一、sizeof是运算符&#xff0c;确切的说是一个编译时运算符&#xff0c;参数可以是数组、指针、类型、对象、函数…

把链接伪装成按钮

<input type"button" οnclick"location.hrefhttp://www.lemongtree.net/;" value"GO">转载于:https://www.cnblogs.com/xiaoman_890/archive/2009/07/07/1518471.html

c语言中char *name 与char name 的区别

要点&#xff1a;char* name"abc"指的是常量字符串&#xff0c;不可以修改指针&#xff0c;是兼容老的写法&#xff1b;char[] name"abc"是指针&#xff0c;可以修改&#xff1b; 在学习过程中发现了一个以前一直默认的错误&#xff0c;同样char *c "…

Spring事务配置的五种方式

Spring事务配置的五种方式前段时间对Spring的事务配置做了比较深入的研究&#xff0c;在此之间对Spring的事务配置虽说也配置过&#xff0c;但是一直没有一个清楚的认识。通过这次的学习发觉Spring的事务配置只要把思路理清&#xff0c;还是比较好掌握的。总结如下&#xff1a;…

关于SQL数据库中cross join 和inner join用法上的区别?

使用mysql创建两张表 表a 表b 可以使用下面的脚本创建表&#xff0c;并且添加测试数据&#xff1a; CREATE TABLE a ( name varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, sex varchar(2) CHARACTER SET utf8 COLLATE utf8_general_ci NULL D…

CSS实现段落首行缩进、1.5倍行距、左右对齐

.text-content { font-size: 15px; text-indent: 30px; /*段落首行缩进&#xff0c;text-indent的值为font-size的2倍&#xff0c;相当于缩进2个汉字*/ line-height: 22px; /*line-height的值为font-size的1.5倍&#xff0c;即1.5倍行距&#xff0c;使用line-heig…

hash()函数的实现

输入参数都是字符串。 6种hash函数的实现以及使用方式&#xff1a; template<class T> size_t BKDRHash(const T * str) // 该效率最高 { register size_t hash 0; while (size_t ch (size_t)*str) { hash hash * 131 ch; // 也可以乘以31、1…

把数组排成最小的数

题目&#xff1a;输入一个正整数数组&#xff0c;将它们连接起来排成一个数&#xff0c;输出能排出的所有数字中最小的一个。 举例&#xff1a;输入数组{32, 321},则输出这两个能排成的最小数字32132。请给出解决问题的算法&#xff0c;并证明该算法。 答&#xff1a;算法如下&…

【转】 vi常用操作

linux vi命令使用 功能最强大的编辑器——vi vi是所有UNIX系统都会提供的屏幕编辑器&#xff0c;它提供了一个视窗设备&#xff0c;通过它可以编辑文件。当然&#xff0c;对UNIX系统略有所知的人&#xff0c;或多或少都觉得vi超级难用&#xff0c;但vi是最基本的编辑器&#x…

tail的使用

最近找了下tail命令的使用方式&#xff0c;先总结下&#xff1a; tail -f filename 等同于--followdescriptor&#xff0c;根据文件描述符进行追踪&#xff0c;当文件改名或被删除后或者执行ctrlc后&#xff0c;停止追踪 例如&#xff1a;tail -f log/filename.txt ---该…

VS 使用 :新建项目

1.文件位置不放C盘 转载于:https://www.cnblogs.com/duanshouchang/p/10431829.html

C++基础知识友元friend、友元函数和友元类

为了在类之间进行数据共享时&#xff0c;提高效率&#xff0c;C引入了友元的概念。友元主要有三个方面的应用&#xff1a; 将普通函数声明为类的友元函数&#xff1b;将一个类声明为其他类的友元类&#xff1b;将一个类中的成员函数声明为其他类的友元函数。 下面分别介绍。 1、…

Expression Studio 3在windows7下安装失败

Expression Studio 3在windows7下安装失败 Microsoft刚刚发布了Expression Studio 3&#xff0c;我也刚刚下载下来&#xff0c;不过安装就出了问题 双击ExpressionStudio_Trial_en.exe开始解压&#xff0c;开始后就没有了响应&#xff0c;再双击&#xff0c;再解压&#xff0c;…

搞定Linux Shell文本处理工具,看完这篇集锦就够了(转)

Linux Shell是一种基本功&#xff0c;由于怪异的语法加之较差的可读性&#xff0c;通常被Python等脚本代替。既然是基本功&#xff0c;那就需要掌握&#xff0c;毕竟学习Shell脚本的过程中&#xff0c;还是能了解到很多Linux系统的内容。 Linux脚本大师不是人人都可以达到的&a…

出考研初试成绩之后

再次诈尸更新 特殊时期,只憋出来了点压抑的东西来. 考研 考研成绩出来之后就一直没有时间也没有心情写些什么了, 成绩并不好, 可以说是很差了, 好处也有, 就是不用对哪个学校再抱有幻想, 可以专心找工作了.   据说今年的计算机考研人数猛增, 分数也给抬到很高的位置, 以我政治…