当前所有的深度学习网络,或多或少都用了批归一化操作
批归一化的思想不新,但是这个特定的层是16年左右出现的,在这之后,发现他对深度学习算法性能的提升非常有效
概念理解
这是一个网络的结构:
当数据很深的时候,可以发现数据在下面,损失在上面
在正向传播时,是数据从下面往上走;而反向传播时,是数据从上面往下传
这就存在问题,往下传的时候,梯度在上面比较大,越到下面越容易变小(一般是多个很小的数相乘,一直称道最后就变成很小的了)
上面梯度比较大,那么就会不断的更新,而下面的层因为权重比较小,对梯度的更新就比较小,那么上面层很快就会收敛,而下面的就会比较慢
这就导致,每次更新下面靠近数据的层的时候(会抽取底层的特征),上面的权重就需要重新训练,这就导致收敛会比较慢
- 对深层神经网络来说,训练中模型参数的更新很容易造成输出层输出的剧烈变化
- 解决:能不能再学习底部层的时候避免变化顶部层?
公式描述
核心思想:不稳定是因为方差和分布会在不同层变化,那么如果将方差和分布进行固定(每一层的输出,符合特定的分布),相对而言就会比较稳定
对每一个元素进行上面的标准化计算
批量归一化层
-
对全连接层做批量归一化:通常将批量归一化层置于全连接层中的仿射变换和激活函数之间
-
对卷积层做批量归一化:发生在卷积计算之后、应用激活函数之前
-
在每个批量里,1个像素时1个样本。与像素(样本)对应的通道维,就是特征维
-
所以不是对单个通道的特征图做均值方差,而是对单个像素的不同通道做均值方差
-
输入9个像素(3*3),输出3通道,以通道作为列向量,每个像素都对应3列(输出通道=3),可以列出表格,按列求均值和方差,其实和全连接层一样的(即像素为样本,通道为特征)
这个小批量数据是随机的,算出来的统计量也可以说是随机的
因为每个batch的均值和方差都不太一样
因为每次取的batch中的数据都是不同的,所以在batch中计算的均值和方差也是不同的,所以引入了随机性
- 作用
- 最初论文提出时想用它来减少内部协变量转移
- 后续有论文提出它可能是通过在每个小批量里加入噪音来控制模型复杂度
所以这个角度,没必要跟丢弃法混合使用
总结
- 当每一层的均值和方差都固定后,学习率太大的话,靠近loss上面的梯度太大,就会梯度爆炸;学习率太小的话,靠近数据的梯度太小了,就会算不动(梯度消失)
- 批量归一化固定小批量中的均值和方差,然后学习出合适的偏移和缩放
- 将每一层的输入放在一个差不多的分布里,就可以用一个比较大的精度了,就可以加速收敛
- 归一化不会影响数据分布(一点也不影响精度,变好变坏都不会)