前言
今日在刷机器学习相关论文与书籍,看到了BN层的一些事情,由此想到了在设计网络的时候我们为什么需要添加BN层,在这这里我浅聊下BN层的那些事。
BN层
解决梯度爆炸
在Train自己的网络中往往会遇到梯度爆炸这个问题,常见的解决思路中就有添加BN层。作用:BN层的作用主要是对数据做标准化处理,解决梯度爆炸。(梯度爆炸消失问题最好是直接拿梯度链式求解公式来分析)
究其原因:是由于对数据标准化后让梯度变化幅度变得平缓,在一定范围之内,标准化可以加快寻找到合适的梯度,因为标准化数据分布范围比较小了,这样子比零散分布的数据点,更容易计算梯度。标准化与归一化是有区别的,标准化的假设是数据服从正态分布,有的数据是不符合的。
:关于梯度爆炸:
反向传播中,经过每一层的梯度会乘以该层的权重。正向传播中f2=f1(wT∗x+b)f2=f1(wT∗x+b)带来的放大缩小的影响,进而解决梯度消失和爆炸的问题
关于BN层
在网络的训练中,BN的使用使得一个mini batch中所有样本都被关联在了一起,因此网络不会从某一个训练样本中生成确定的结果,即同样一个样本的输出不再仅仅取决于样本的本身,也取决于跟这个样本同属一个batch的其他样本,而每次网络都是随机取batch,这样就会使得整个网络不会朝这一个方向使劲学习。一定程度上避免了过拟合。
经过归一化再输入激活函数,得到的值大部分会落入非线性函数的线性区,导数远离导数饱和区,避免了梯度消失,这样来加速训练收敛过程。BatchNorm这类归一化技术,目的就是让每一层的分布稳定下来,让后面的层可以在前面层的基础上安心学习知识。
BN处理后,上一层原始输入的数据还是能保留原来的分布,因为有两个参数可以学习到让它保留,此外,让输入的参数处理后,落在非线性函数的线性区,可以避免落在非线性区求导输出很小的值接近0
总的来说BN处理后:1还能保留了原来数据的分布,因为有两个参数是可以学习的,这两可以学习到合适的参数,让数据保留原来的分布,2是处理后数据落在线性区,求导后梯度不会过小,线性区那个斜率就s函数来说看起来也不小
个人觉得BN的两个参数βγ作用是让每层输入数据被BN算法做标准化处理后,在输入到激活函数之前,βγ让数据有个自适应的过程,可能达到接近真实原始数据的分布效果,此外还实现了处理后的数据落在激活函数的线性区,避免落在饱和区导致求导接近于0。
如下图d其实是我们BN想要的那么一种状态,引入了这个可学习重构参数 γ 和β,让我们的网络可以学习恢复出原始网络所要学习的特征分布,而使被正则化的特征图保持一定的数据范围。
如果打印这两个参数,他们其实Bx1x1xC的向量,每一个输出通道都会有一个这样的参数
用了BN但是激活函数还是用sigmoid,还会发生梯度消失吗?
不能说用了BN就一定不会发生梯度消失或者爆炸,包括过拟合也是,不能百分之百解决 只能说,不容易炸 如果打印Bn前后的feature map值,会看到效果很明显。因为不加BN层,网络输出会逐渐向激活函数上下限靠近,造成爆炸消失;
BN层能否改变数据分布
原始输入为X,没有BN层的神经网络学习到的函数是f,输出Y,加入BN后,X分布被映射成了X'分布,此时加入BN的神经网络学习到的函数是f',输出还是Y,中途改变X的分布好像没有影响,取决于原始输入和输出,学习到的f还是f'拟合准确就好,但是没有BN的神经网络,其实f学习不到的,因为梯度消失,前面层的权重参数一直没变化,只是根据后面的结果倒推几层就得到了所有的权重,就不准确。
没有BN,如果发生了梯度消失,前面层权重参数没变化,虽然喂入的数据在不断变化,其实也就是用后面几层训练这些数据,神经元就少了很多,可能会欠拟合,不知还会导致有哪些问题?