经典论文阅读笔记——AlexNet、VGGNet、GoogLeNet、ResNet、DenseNet

  近期读了一些经典论文,本博客主要是基于CNN方面经典的网络做一下总结,基于自己对论文的理解和向他人博客的学习总结。

AlexNet

  AlexNet是2012年由深度学习之父Hinton的学生Alex提出的,其在图像处理方面优异的表现开创了一个新时代。这篇文章个人感觉偏重于工程性应用,尽管说许多idea放在今天已经不太实用了(现在有更好的方法和模型),但是在十年前能做出这样的成果确实是难能可贵的了。
经典论文阅读笔记——AlexNet、VGGNet、GoogLeNet、ResNet、DenseNet_第1张图片
  上图是AlexNet的网络结构,总共有8层,其中卷积层有5层,剩下的是3个全连接层。可以看出它的第一层、第二层用到的卷积核是比较大的(11×11和5×5的大小),其实现在已经不需要这么大了。AlexNet网络为什么效果好呢?

  1. 做了大量的数据增强(例如做图片颜色变换、随机截取区域、水平翻转等等)
  2. 采用了dropout防止过拟合
  3. 使用了非线性激活函数ReLU,代替了传统的Tanh或者Logistic。(第一,ReLU函数计算方便简单;第二,ReLU关闭了左侧,从而会使得很多的隐层输出为0,即网络变得稀疏,起到了类似正则化作用,缓解过拟合)
  4. 使用LRN,Local Response Normalization,局部响应归一化(对局部神经元的活动创建竞争机制,使其中响应比较大对值变得相对更大,并抑制其他反馈较小的神经元),现在这个归一化方法已经被淘汰了。
  5. 采用重叠的最大池化,即Pooling的步长比Pooling Kernel的对应边要小,只提高了0.3%(现在也很少用了)
  6. 使用CUDA加速神经网络的计算,采用多GPU并行运算的方法(如上图,将通道数一分为二,现在也很少用了)

VGGNet

  VGG模型是牛津大学VGG视觉组提出的,它比AlexNet有更深的网络结构,常见的有VGG-16和VGG-19,主要贡献归结为以下两点:

  1. 将大的感受野替换成了小的感受野。VGG全部使用了3×3的卷积核和2×2的最大池化核,通过不断加深网络结构来提神性能。
    采用堆积的小卷积核优于采用大的卷积核,因为多层非线性层可以增加网络深层来保证学习更复杂的模式,而且所需的参数还比较少。例如3个3×3的卷积层,通道数为C,参数是3*(3×3×C×C);而一个7×7的卷积核,参数是49×C×C。
  2. 提出了一种“块结构”,多次重复使用统一大小的卷积核来提取更复杂和更具有表达性的特征。
    经典论文阅读笔记——AlexNet、VGGNet、GoogLeNet、ResNet、DenseNet_第2张图片

GoogLeNet (又称 Inception)

  GoogLeNet是由谷歌公司提出的,它的命名很有意思,最后的L是大写的,这是因为要凑梗,致敬CNN的鼻祖LeNet,GoogLeNet的论文中反复提到了Inception,翻译成中文就是盗梦空间啦,就是一层包着一层,网中网结构,很形象啦。以下是该网络的结构图:
经典论文阅读笔记——AlexNet、VGGNet、GoogLeNet、ResNet、DenseNet_第3张图片
经典论文阅读笔记——AlexNet、VGGNet、GoogLeNet、ResNet、DenseNet_第4张图片
  Inception架构的主要思想是考虑怎样用容易获得密集组件近似覆盖卷积视觉网络的最优稀疏结构。 这句话乍一看可能很拗口,因为卷积就是一种稀疏结构,可防止过拟合,但是我们如何知道该选择何种大小的卷积核呢,所以我们能不能用多个不同大小、不同尺寸的卷积核去处理图片,然后contact在一起呢? 这就是这个架构的核心。GoogleNet采用9个Inception模块化的结构,共22层,现将该网络(Inception V1)的主要思想(优点)归结如下:

  1. 在多个不同尺寸的卷积核上同时进行卷积运算后再进行聚合,可以获取更多的信息(增加了网络对多尺度信息的适应性)
  2. 使用1*1的卷积进行降维减少计算成本,且1×1的卷积可以增加非线性
  3. 除了最后一层的输出外,将中间某一层的输出也用作分类,并按一个较小的权重加到最终分类结果中,这样相当于做了模型融合。同时给网络增加了反向传播的梯度信号,不会造成梯度消失,对于整个网络的训练大有益处。

Inception 后续又推出了V2、V3、V4等版本,简单叙述下不同版本的改进:
Inception V2 :用2个3×3的卷积代替了V1中的5×5卷积,并使用了Batch Normalization(简称BN)正则化方法。
Inception V3 :将较大的二维卷积拆分成两个较小的一维卷积(例如将3*3的卷积拆分成一个1×3的卷积核一个3×1的卷积,可减少运算量,且防止过拟合);优化了Inception Module结构
Inception V4 :将Inception Module与Residual connection相结合,加入了残差连接。

ResNet

  ResNet是由何凯明大神提出的,至今谷歌引用已超过11W次,是深度学习领域被引量最高的文章。
  随着网络的加深,出现了训练集准确率下降,错误率上升的现象,就是所谓的“退化”问题。按理说更深的模型不应当比它浅的模型产生更高的错误率,这是由于模型复杂时,SGD的优化变得更加困难,会出现梯度消失的现象,所以我们得想个办法去解决梯度消失的问题。
  如下图所示,用一条弯弯的曲线连接,输出变成了y=F(x)+x,如果我们对这个函数求导,那么 F(x) 的导数是前面好多的累计(fx中的x又是前面的fx的结果),是比较小的,但是X的导数的比较大的,因此这样就改善了梯度消失问题。
经典论文阅读笔记——AlexNet、VGGNet、GoogLeNet、ResNet、DenseNet_第5张图片
  当然,前面的说法是现在比较主流的,不过当年凯明在该论文中解释了另一种说法,虽然不一定对,但是感性上挺好理解的:因为前面一层的输出直接传到下一层的输入了,因此每一层网络只需要学习一点点东西,这样学起来就很容易,就能train起来。
经典论文阅读笔记——AlexNet、VGGNet、GoogLeNet、ResNet、DenseNet_第6张图片
  论文中使用了 bottleneck design (如上图的右边所示),一种瓶颈结构,增添1*1的卷积目的就是为了降低参数的数目,减少计算量。所以浅层次的网络,可使用“building block”(左图的形式),对于深层次的网络,为了减少计算量,可以使用右图的形式。

DenseNet

  相比ResNet,DenseNet提出了一个更激进的密集连接机制:即互相连接所有的层,具体来说就是每个层都会接受其前面所有层作为其额外的输入。
经典论文阅读笔记——AlexNet、VGGNet、GoogLeNet、ResNet、DenseNet_第7张图片
主要说一下它的优点:

  1. 相比ResNet,DenseNet拥有更少的参数数量,因为它都是旁路连接,直接连过去就行了,不需要参数。同时按照ResNet的感性解释,每一层学习的东西就可以更少了。
  2. 旁路加强了特征的重用,且网络更易于训练,并具有一定的正则效果。(和ResNet类似,但是DenseNet的特征重用的更多)
  3. 缓解了梯度消失和梯度爆炸问题。

  这么一看,DenseNet好像是优于ResNet的啊,确实DenseNet的准确率是高于ResNet的。但是ResNet更流行啊 ,为什么?因为ResNet提出的残差结构更加通用。DenseNet需要记住每个层的输出,放在显存里,造成了显存爆炸,所以实用性很差,虽然参数少,训练简单,但是占用的空间太大了。

你可能感兴趣的:(深度学习,深度学习)