对于深度学习一直处于学过但不太懂的状态,这几天开始重新学一下。
先从CNN开始。本文简单记录下我对 LeNet-5、 AlexNet、 VGG、 GoogLeNet、 ResNet、 DenseNet的想法。
LeNet-5
LeNet-5的神经网络深度比较浅,有两个卷积层和三个池化层。使用的激活函数是sigmoid函数,这就导致了会有梯度弥散的问题,导致模型训练速度下降。我没弄错的话提出LeNet-5的时候,Relu还没有被提出,所以使用sigmoid也是没办法。不过网上很多LeNet-5代码都是用的Relu。
AlexNet
AlexNet网络层数变为8层。且采用了Relu作为激活函数,解决了LeNet-5的问题。并且为了避免过拟合,对全连接层还使用了dropout。总的来讲,我认为网络可以加深,就是因为有Relu和dropout,当然还有GPU并行处理。
VGG
VGG与前面两种的主要差异是网络更深。而网络可以更深是因为采用更小的卷积核来减少参数量。更小的卷积核可以保留更多的特征细节,这点的理解很简单,卷积实际上和boxfilter差不多,如果核很大,相当于对像素在很大范围内做了平滑,图像细节就丢失了。
GoogLeNet
GoogLeNet与前几个的区别大得多,其他模型基本上是一层一层加深,而GoogLeNet的加深方式比较特殊。应用了inception模块。即输入数据并不只是喂给一层网络,而是喂给四层,然后这四层再堆叠起来作为输出。这种方法使网络更加复杂并且更深,真的是佩服提出这个算法的大佬。
ResNet
前面的各种网络模型其实都有一个共同点,就是想把网络做得更深。但网络做得太深,就会出现梯度弥散/爆炸和退化问题。第一个问题可以通过BN或数据预处理解决,所以难点在第二个问题退化问题。退化问题的通俗理解就是当网络太深时,loss反而更大,而且是在traindata上就体现出来的,这明显不是过拟合问题。
ResNet的绝妙之处就是采用捷径连接和更深的瓶颈结构,分别对应上图的两个模块。这种把输入与输出相加作为最终输出的方法意义是什么?
当网络很深时,深层网络参数难以得到有效训练,但由于捷径的存在,可以跳过前面的网络使更深的网络得到训练。从而解决了退化问题。
ResNet可以达到1202层,足以体现它有多么成功。
DenseNet
DenseNet的最大特点是稠密链接引入了从任何层到后续层的直接连接,大大改善了信息流,并且减轻了梯度问题。
另一个特殊的地方是使用过渡层做下采样,因为每一个DenseBlock中各层的尺寸是一样的,所以需要过渡层来下采样。
总结感想
学习这些CNN模型后,我的第一感觉就是网络越来越深,这是因为深的网络可以提取到更高维的特征信息,而且计算机性能的提高允许对更深更复杂网络的科研探索。