BN层相关理论

批量归一化(BN)用于解决深度学习训练中内部协变量偏移问题,加速训练并防止梯度消失或梯度爆炸。BN通过在每一层添加归一化层,使网络能更快适应数据分布变化,减少对初始化和正则化的依赖。BN还允许使用更大的学习率,提高训练效率,并可以替代局部响应归一化。
摘要由CSDN通过智能技术生成

BN----Batch Normalization(批量归一化):解决在训练过程中,中间层数据分布发生改变的问题,以防止梯度消失或梯度爆炸、加快训练速度(什么叫中间层数据分布发生改变??

1、为什么输入数据需要归一化

归一化有什么好处呢?原因在于神经网络学习过程本质就是为了学习数据分布,一旦训练数据与测试数据的分布不同,那么网络的泛化能力也大大降低;另一方面,一旦每批训练数据的分布各不相同,那么网络就要在每次迭代都去学习适应不同的分布,这样将会大大降低网络的训练速度,这也正是为什么我们需要对数据都做一个归一化预处理的原因。

深度网络的训练是一个复杂的过程,只要网络的前面几层发生微小的改变,那么后面几层就会被累积放大下去。一旦网络某一层的输入数据的分布发生改变,那么这一层网络就需要去适应学习这个新的数据分布,所以如果训练过程中,训练数据的分布一直在发生变化,那么将会影响网络的训练速度。

2、BN训练

(1)随机梯度下降法(SGD)对于训练深度网络简单高效,但是有个问题,就是需要我们人为的去选择参数,比如学习率、参数初始化、权重衰减系数、Drop out比例等。这些参数的选择对训练结果至关重要,以至于我们很多时间都浪费这些调参上面。那么使用BN之后,你可以不需要那么刻意的慢慢调整参数。

(2)神经网络一旦训练起来,那么参数就要发生更新,除了输入层的数据外(因为输入层数据,我们已经认为的为每个样本归一化),后面网络每一层的输入数据分布是一直在发生变化的,因为在训练的时候,前面层训练参数的更新将导致后面层输入数据分布的变化。以网络第二层为例:网络第二层输入,是由第一层的参数和input计算得到的,而第一层的参数在整个训练过程中一直在发生变化,因此必然会引起后面每一层输入数据分布的改变。我们把网络中间层在训练过程中,数据分布的改变称之为“Internal Covariate Shift”。文章所提出的算法,就是要解决在训练过程中,中间层数据分布发生改变的情况,于是就有了Batch Normalization的诞生。

(3)BN的本质原理:在网络的每一层输入的时候,又插入了一个归一化层,也就是先做一个归一化处理(归一化至:均值0,方差为1),然后再进入网络的下一层。不过这个归一化层,可不像我们像的那么简单,它是一个可学习、有参数(γ、β)的网络层。(它和激活层的区别是什么,为什么需要参数,并且是可学习的???

3、BN的作用

(1)改善流经网络的梯度(有没有具体的实例让我的脑力有个回路??

(2)允许更大的学习率,大幅提高训练速度:(为什么可以有更大的学习率

你可以选择比较大的初始学习率,让你的训练速度飙涨。以前还需要慢慢调整学习率,甚至在网络训练到一半的时候,还需要想着学习率进一步调小的比例选择多少比较合适,现在我们可以采用初始很大的学习率,然后学习率衰减速度也很大,因为这个算法收敛很快。当然这个算法即使你选择了较小的学习率,也比以前的收敛速度快,因为它具有快速训练收敛的特性;

(3)减少对初始化的强烈依赖

(4)改善正则化策略:作为正则化的一种形式,轻微减少了对dropout的需求

你再也不用去理会过拟合中drop out、L2正则项参数的选择问题,采用BN算法后,你可以移除这两项参数,或者可以选择更小的L2正则约束参数了,因为BN具有提高网络泛化能力的特性;

(5)再也不需要使用局部响应归一化层了(局部响应归一化是Alexnet网络用到的方法,搞视觉的估计比较熟悉),因为BN本身就是一个归一化网络层;

(6)可以把训练数据彻底打乱(防止每批训练的时候,某一个样本都经常被挑选到,文献说这个可以提高1%的精度)(什么叫打乱???为什么不打乱,就会有某一个样本被经常挑选到???

4、BN层的计算方法

(1)先求出此次批量数据x的均值

(2)求出此批量的方差

(3)接下来就是对本次批量的x做归一化:(x_{i} - 均值)/ 根号下(方差+极小值),防止分母为0

这个极小值eps是浮点类型的最小值常量。

(4)最后最重要,引入应以变量γ和β。

如果γ和β分别等于此batch的方差和均值,那么y_{i}就还原到了归一化前的x,β 和γ分别称之为 平移参数和缩放参数 。这样就保证了每一次数据经过归一化后还保留的有学习来的特征,同时又能完成归一化这个操作,加速训练。

  

关于这里的梯度计算:

把前项传播上的每一个变量都当做输入x的中间函数,用多元微分的算法进行计算,在正向前推的时候理清楚谁推出了谁,在反向传播的时候把每一项相关的都计算入偏微分内,也就是在反向传播的时候沿着反箭头的方向寻找所有通道所求变量的通路,就可以计算出准确的导数。

5、什么是梯度爆炸

如果网络使用sigmoid激活函数,误差在向前传递的时候,经过sigmoid单元,需要乘sigmoid的梯度,而sigmoid的梯度最大是0.25,因此越向前传递,误差就越小了,这就是梯度消散。那梯度爆炸是什么呢?误差在经过全连接或者卷积层时,也要乘以权重w,如果w比较大,大过sigmoid造成的及那小,这样越往前误差就越来越大,就梯度爆炸了。 

这部分没写完,下次连同上面的公式还有一些其他原理一起理清楚了

6、 对缩放因子的理解(连同BN剪枝)

对神经网络参数更新的理解有些出入导致那时候想的时候有点转不过弯,损失函数是人为对网络学习的一种限制,每个参数包括缩放因子都有损失函数关于参数的偏导数,根据这个偏导数和学习率每次训练对所有参数进行更新。增加了缩放因子之后神经网络可以自动对batch的数据进行中心归一化和缩放偏移。而BN剪枝在损失函数中增加了缩放因子正则化项,逼着缩放因子往0的方向逼近,所以有些不重要的通道就在损失函数的压迫下缩放因子变得很小,也就是说在损失函数的山坡上,这个正则化逼着网络走了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值