Residual Net
参考: coursera-convolutional-neural-networks-resnets
网络结构
VGG-19:2014年ImageNet亚军,top-5错误率7.3%,19层神经网络。(那一年的冠军是InceptionNet,top-5错误率6.7%,22层神经网络)
plain:为了与ResNet区分,给中间的网络取名为“平坦”。
residual:残差网络。为2015年ImageNet冠军,top-5错误率3.57%,152层神经网络。
为什么使用残差网络?
原因,神经网络现在越来越深,但是简单的堆砌,使得网络深度增加,并不一定能使网络的精度增加。
图上56层的神经网络的精度反而比20层的神经网络精度低。
造成这个问题的原因有:
- 梯度消失、梯度爆炸。虽然这个问题很大程度上被
normalization
解决了,但是可能还是会带来一些影响。 - 随着网络深度的增加,网络精度达到饱和,这时再增加网络层数,会使得网络精度迅速下降。这不是由于过拟合而造成的,可能是由于更深的网络更加难训练造成的。
为此,引入残差网络的结构:
将前几层的输出加到后几层的输出之上,上面的X是经过激活函数之后的输出,F(X)还未经过激活函数, F(X)加上X之后再共同的经过激活函数。
这个结构的直接好处就是,如果网络精度已经饱和,中间新加入的层没有价值,残差网络将十分容易的将新加入层置为0(也就是F(X)=0,F(X)+X=X),这就不会影响到网络的精度。
上面左图中34层的plain
网络反而比18层的网络训练精度要低,而对于右图中的ResNet
不会存在这种情况,
对残差网络的另一种理解
通过下图可以表现出残差网络的另一种形式:
把左图变形一下就变成右图,那么这里注意到残差网络其实就相当于是多个网络的叠加,结果就相当于是这些网络一起投票投出来的,有一种Ensembling的意思在里面。
实现上的一些技巧
在实际的残差网络实现中,有一些技巧:
限制,进入block
的输入与出去block
的输出维度要一致,包括长、宽以及深度。那么图中的卷积使用的都是same
,也就是保持长宽不变的卷积。
技巧,假设这里输入长宽是64 x 64
,那么对于右图来说,如果没有前后的1 x 1 x 64
、1 x 1 x 256
的两个卷积,输入直接进行3 x 3 x 256
的卷积:
加上1 x 1 x 64
、1 x 1 x 256
两个卷积层:
通过这样的方法,计算量可以减少一个数量级,其中1 x 1 x 64
的卷积把它称为bottleneck
,它在这就类似于一个瓶颈。在实际中表明,这样的方法并不会对神经网络的精度造成损害,所以通常使用这样的方式来构建block,降低计算量。
Incepution Net
2014年ImageNet冠军,top-5错误率6.7%,22层神经网络。那么实际上Incepution Net
比residual net
要早。
论文:Going Deeper with Convolutions,2014
Rethinking the Inception Architecture for Computer Vision,2015
网络结构
在进行一次卷积操作时,不知道该选择1 x 1
还是3 x 3
还是5 x 5
,怎么办?答:那么就在一层里面把它们全部都用上。
在同一层里面使用1 x 1
、3 x 3
、5 x 5
以及max pooling
,它们都使用same
的卷积方式,
最后将它们的结果叠在一起就可以了。
同样的,这里也可以使用降维的思想(它的思想在ResNet之前):
中间加入了几个1 x 1
卷积,用于降低总的计算量。
比赛中使用的网络叫做GoogLeNet,整个网络的结构如下:
注意到中间有两个额外的输出,这是为了避免梯度消失,网络额外增加了2个辅助的softmax用于向前传导梯度。(博客上面看的,具体文章中还没看)
升级版本
在Rethinking the Inception Architecture for Computer Vision,2015
这篇文章中有新的思路,目前还没有看。
其中大概多了下面的操作: