深度学习_经典网络_ResNet详解及常见问题总结( 二 )


进一步理解:如果 F 1 ( x ) = 5.1 F_{1} (x)= 5.1 F1?(x)=5.1 , 现在继续训练模型 , 使得映射函数 F 1 ( x ) = 5 F_{1} (x)= 5 F1?(x)=5 。变化率为: ( 5.1 ? 5 ) / 5.1 = 0.02 (5.1 - 5) / 5.1 = 0.02 (5.1?5)/5.1=0.02 , 如果不用残差模块的话可能要把学习率从0.01设置为0. 。层数少还能对付 , 一旦层数加深的话可能就不太好使了 。
这时如果使用残差模块 , 也就是 F 1 ( x ) = 0.1 F_{1} (x)= 0.1 F1?(x)=0.1变化为 F 1 ( x ) = 0 F_{1} (x)= 0 F1?(x)=0 。这个变化率增加了100% 。明显这样的话对参数权重的调整作用更大 。
进一步拓展残差结构:
接下来我们详细解释一下上图的两个结构设计 。左边的结构针对于 , 一般称整个结构为一个“ block” 。右边的结构针对/101/152 , 一般称为“ ” , 这个结构的设计是为了降低参数的数目 , 第一个 1 × 1 1\ 1×1的卷积把256维降到64维 , 然后再最后通过 1 × 1 1\ 1×1卷积恢复 , 整体上用的参数数目: 1 × 1 × 256 × 64 + 3 × 3 × 64 × 256 + 1 × 1 × 64 × 256 = 69632 1\\times 256\times 64 + 3\times 3\times 64\times 256 + 1\times 1\times 64\times 256 = 69632 1×1×256×64+3×3×64×256+1×1×64×256=69632 , 而不使用的话就是两个 3 × 3 × 256 3\times 3\times 256 3×3×256的卷积 , 参数数目:3 × 3 × 256 × 256 × 2 =3\times 3\times 256\times 256\times 2 =3×3×256×256×2= , 差了16.94倍 。
对于常规的 , 可以用于34层或者更少的网络中 , 对于 的通常用于更深的如101这样的网络中 , 目的是减少计算和参数量 。
二.网络结构
我们先看一看VGG网络、Plain网络和残差网络的结构比较:
由上图可知 , 有一些 是实线的 , 有一些是虚线的 , 为什么要这样呢?
因为可能会有F(x)和x的个数不同的情况 , 所以要分两种情况讨论 。
实线的情况是两者的数目相同 , 采用的计算方式是 H ( x ) = y = F ( x ) + x H(x) = y = F(x) + x H(x)=y=F(x)+x 。
虚线的情况是两者的数目不同 , 比如(64和128) , 所以采用的计算方式是 H ( x ) = y = F ( x ) + W x H(x) = y = F(x) + Wx H(x)=y=F(x)+Wx 。其中W是卷积操作 , 用来调整的维度 。
论文中的网络结构:
比较经典的是 , 和 。下图给出详细的结构:
我们举上图为例子计算其层数:
首先有一个输入 7 × 7 × 152 7\times 7\times 152 7×7×152的卷积 , 然后经过 ( 3 + 4 + 23 + 3 ) = 33 (3 + 4 + 23 + 3)=33 (3+4+23+3)=33个  , 每一个有三层卷积 , 所以有 33 × 3 = 99 33\times 3 = 99 33×3=99层 , 99 + 最后的全连接层 + 一开始的输入卷积 = 101 。
注意: 101层网络仅仅指卷积或者全连接层 , 而激活层或者层并没有计算在内 。

深度学习_经典网络_ResNet详解及常见问题总结

文章插图
我们还可以发现和唯一的区别是 , 差了6个 , 正好是51层 。
三.相关公式理顺与梯度计算
首先根据上一节的介绍 , 残差单元可以表示为:
其中Xl和Xl+1分别表示的是第l个残差单元的输入和输出 。F是残差函数 , 表示学习到的残差 , 而h(Xl) = Xl表示恒等映射 , f是ReLU激活函数 。基于上式 , 我们求得从浅层l到深层L的学习特征为:
利用链式规则 , 可以求得反向过程的梯度:
式子的第一个因式:loss/xL表示的是损失函数到达L的梯度 , 小括号中的1表明可以避免梯度消失问题 , 而另一项残差梯度需要经过带有W的层 , 梯度不是直接传递过来的 。