Batch Normalization
目的
使每一层的输出都满足均值为0、单位方差,以在经过激活函数时,能够在更敏感的范围内激活。缓解梯度消失/爆炸。
但饱和未必是件坏事,因此在进行归一化的操作后,加入两个可学习参数(),进行缩放和平移,用来让网络自动地控制饱和的程度。如此以来解空间也涵盖了恒等函数。
综上,经过归一化、缩放/平移两个步骤后,网络的学习过程更加灵活,更快收敛、也更加鲁棒(网络可以在更广范围的学习率和不同初始值下工作)。
另一个角度理解:重参数化
这种观点认为,BN实际上是一个自适应的重参数化的方法。
非常深的网络模型会涉及多个函数或层组合,层与层之间的参数相互依赖,若同时更新所有层,由于这种依赖关系,可能会发生意想不到的结果。这是因为改变一个函数的参数时,我们假设其他函数保持不变。
BN剔除了均值和标准差,保证每一层的输入在训练过程中的分布不变(或者说相对稳定),削弱了层间参数的依赖关系。
有正则化效果
BN层的输出不仅依赖于单个输入,还(通过均值和方差)依赖于同一batch的其他样本。它不再对给定的训练样本提供确定性的值,就像在X中加入一些扰动,从而实现正则化的效果。
ResNet
图片.png
Pytorch ResNet代码
中心思想
- 提出残差学习框架,使网络能够更深。相比于之前直接学习函数,改为学习残差函数。
- 使网络更容易优化、能够加深网络、精度更高(精度的提高依赖于深度的增加)。
- 相当于引入这一先验:给较浅网络加入恒等层,使其变深,网络效果至少不会变差。
- 只有在需要升维的shortcut处引入了额外参数,没有增加算法复杂度。
背景问题:更深的网络是否一定提高精度?会带来哪些问题?
- 过深的网络引起梯度消失/爆炸,从一开始就阻碍收敛。(很大程度上,可以通过归一化预处理、BN层来解决。)
-
较深的网络有退化问题:网络加深,精度提高至饱和;再加深网络,则精度迅速降低。这不是由过拟合造成:因为网络越深,训练集上精度也越低。
图片.png
技术方案
利用右图所示结构,对channel进行控制,减少参数。
其他
- 数据增强的方法与AlexNet\VGG相同。
- 在每个卷积层后(激活层前),加入BN。
- SGD,batch_size设为256。
- 学习率初始为0.1,误差平稳时为0.01;0.9动量。
- 没有使用dropout
最终结构,以ResNet-50为例
ResNet V2
图片.png
shortcut的路径应该是clean的
恒等映射是最优的,前向、反向传播的信号能直接从一个残差块传递到其他任意一个残差块。一切多余操作(如relu、1x1卷积)都会阻碍信息的反向传播并且阻碍训练训练过程。
shortcut中,1x1卷积带来的问题
当残差单元有很多时,1x1卷积并不能起到好的效果,可能阻碍信号的传播。当使用1×1 的卷积shortcut时,110 层的ResNet的结果很差(12.22%), 训练误差变得很高。
1×1的卷积shortcut连接引入了更多的参数(且1×1的卷积涵盖了恒等捷径连接的解空间),本应该具有比恒等连接更强大的表达能力。然而,当网络变得更深时,它们的训练误差比恒等捷径连接的训练误差要高得多,这表明了这些模型退化问题的原因是优化问题,而不是表达能力的问题。
网友评论