CNN典型模型 —— ResNet

ResNet 网络模型于2015年 ImageNet 比赛中提出;

将网络层次提高到152层,错误率降低到了3.57%,主要解决网络退化问题;

为什么深层神经网络比浅层神经网络更有效?

  • 浅层结构对复杂函数的表示能力有限,深层神经网络可以通过学习一种深层非线性网路结构,实现复杂函数的逼近,可以从少数样本中学习数据集本质特征。

但是此前的实验表明,随着网络层次的增加效果会变差,例如,56层的网络结构和20层的网络结构的错误率的对比如下图:

CNN典型模型 —— ResNet

  • 梯度消失或梯度弥散问题可以通过加入正则化解决;
  • 训练集和测试集同时出现这种情况,表示也没有over fitting;

更深的网络模型随着迭代次数的加深,无论 training error 还是 test error 都表现得更差,这种结果与我们通常的认知不符;

那么,这是由什么原因导致的呢?(这就是下面要解决的问题)

原因:模型越深越难优化,即模型退化问题;(如果能解决这种模型退化问题,那么就可以单纯通过增加网络深度来获得更好的性能)

基于更深的网络模型的性能至少应该和更浅层的网络模型一样,而不应该更差的理解,设计了一个解决方案:如果深层网络后面几层是恒等映射(即输入与输出相同),那么就可以保证这个深层网络至少会有和浅层网络相同的表现。所以,建立一种将浅层网络学习到的特征copy到更深层的网络中的结构(即残差学习模块);

注意残差与误差的区别:

  • 残差:预测值与观测值之间的差距;
  • 误差:观测值与真实值之间的差距;

残差模块如下图:

CNN典型模型 —— ResNet

除了一般的连接之外,残差模块还加入了 shortcut(将输入直接传至输出端,实现单位映射的路线),这样输入信息就通过 shortcut 得到一定程度的保留,解决了退化问题;

假设前面层的参数已经训练到了很好的水平,通过 shorcut 可以使网络层次得到进一步的增加,同时不会使表现变差;


残差模块为什么有效?

CNN典型模型 —— ResNet

F(x) 即残差,通过上图可知 F(x)=0 等价于 H(x)=x,通过梯度下降法直接去学习 H(x)=x 比较难,但是通过残差模块,转化为学习 F(x)=0,这就容易得多了,因为残差对输出的变化更敏感。比如,若 x=10,映射后的结果由10.1变为10.2,那么 H(x) 由10.1变为10.2,变化幅度1%,残差 F(x) 由0.1变为0.2,变化幅度为100%,残差对输出的变化更敏感。

CNN典型模型 —— ResNet

  • ResNet 网络的整体结构含有很多的残差模块,每个残差模块包括两个3*3的卷积层;
  • 卷积层后采用池化层,降低数据量,减少计算的复杂度(池化后,使用的 filters 数量增加一倍);
  • 输出层前只保留了一个全连接层,使用softmax函数(输出1000维的分类的概率分布);

bottleneck

上述为原始的残差模块,在实际使用时,为了降低计算消耗,提出了瓶颈模块(bottleneck):

CNN典型模型 —— ResNet

这个想法和 Inception 一样,通过1*1的卷积进行数据的降维,后再通过3*3的卷积,最后通过1*1的卷积将维度恢复成与 shortcut 的维度相同(和原始模块的区别在于在残差模块的前后增加了1*1的卷积);

ResNet 网络的几种层数:ResNet-34、ResNet-50、ResNet-101、ResNet-152;