在神经网络训练的时候经常会出现训练困难,很难在短时间收敛,这个时候我们通常会想到使用BN层,它能够加快网络的训练收敛速度。接下来我们介绍下什么是BN层,他的原理到底是什么?
一般我们在训练网络的时候损失函数都是用在网络的最后,所以后面的网络训练速度比较快,然而数据是在网络的最前端,导致网络最前端的部分训练比较慢,并且最前端的参数一变网络后面的参数都要变,以及后面的网络传到网络最前端的时候可能会出现梯度消失或者梯度爆炸。
BN层一般用在哪?
答:
全连接和卷积层输出,激活函数前面;全连接和卷积输出上
对于全连接层,作用在特征维度
对于卷积层,作用在通道层
先来看下原文给的公式:
在训练的时候对每个batch进行标准化,使之满足均值为零,方差为1,然后再在此基础上进行参数
γ
\gamma
γ和
β
\beta
β的学习。
BN层到底在做什么?
- 最初的思想是用BN来减少内部协变量转移
- 后面有论文指出他就是在每个小批量里面加入噪音来控制模型的复杂度
- 没必要跟Dropout一块使用
- 可以加快收敛速度,但是一般不改变模型的精度
个人觉得BN做的事情就是先对数据进行标准化,使网络训练简单,然后再加入噪音控制模型的复杂度。