批量归一化 BN
在过往训练中,因为损失在最后面,后面的层训练和更新较快,但是数据在最底部,底部训练较慢,底部更新一遍之后后面的也需要重新更新一次,所以导致整体的收敛很慢。
问题:我们在学习底部的时候如何避免变化顶部层?
解决方法:批量归一化,固定小批量中的均值和方差再做一个额外调整
不同层的均值和方差不会有特别大的变化,这样相当于做了一个宏观的调整。
批量归一化层
作用原理:
可以学习的参数就是方差和均值。
一般作用再:全连接层和卷积层输出上,激活函数前(激活函数是非线性,BN是线性变化,只是拉一个比较好的均值和方差)。
如果作用在全连接层,那么是作用在特征维上;(每一行是样本,每一列是特征,对每一列特征计算标量的均值)
如果是作用在卷积层,是作用在通道维(以1×1卷积为例,每个像素是一个样本,不同的通道就是像素样本不同的特征,所以是在求通道的均值,作用在通道维上,也就是卷积层的特征维)。
作用:
最初是想要用来减少内部协变量转移(其实并没有),后面发现是通过在每个小批量里加入噪音来控制模型复杂度,相当于加入了随机偏移和随机缩放,同时使用每个批量的均值和方差来使得变化不太剧烈。
总结:
批量归一化固定小批量中的均值和方差,然后学习出适合的偏移和缩放(拟合均值和方差)。可以加速收敛速度,但一般不改变模型精度。
残差网络 ResNet
加入更多的层一定会改进精度吗?不一定,因为模型出现偏差的时候,学习的效果可能是偏了的。ResNet就是要解决这个问题,也就是网络退化的问题。
残差块
串联一个层其实就是改变函数类,所以我们希望可以可以扩大函数类。
残差块加入快速通道来得到
f
(
x
)
=
x
+
g
(
x
)
f(x) = x +g(x)
f(x)=x+g(x)的结构。这个作用相当于在复杂网络中嵌入了小网络,先去拟合小网络(先保证准星,再升缩小范围,升高维度),当第一个weight layer失效的时候,也可以作为一个小模型使用。
ResNet块细节:
通常使用方法:(主流都是5个stage)
- 第一块:高宽减半的ResNet块(步幅为2)
- 后面的块:后面接多个高宽不变的块
29.2 ResNet 为什么能训练出1000层的模型
因为梯度计算是做乘法,如果网络下面的层学习/拟合效果较好,就会导致梯度过小,那么学习率不管怎么调都没有用。所以ResNet相当于加入了一个加法,也就是有一个基准的导数。(大数+小数 = 大数,但是大数×小数就是小数了)