经典模型简介

来源:互联网 发布:淘宝裤子折叠方法图解 编辑:程序博客网 时间:2024/06/04 19:24

Lenet

下图是广为流传LeNet的网络结构,麻雀虽小,但五脏俱全,卷积层、pooling层、全连接层,这些都是现代CNN网络的基本组件。

这里写图片描述

可以看下caffe中lenet的配置文件(点我),可以试着理解每一层的大小,和各种参数。由两个卷积层,两个池化层,以及两个全连接层组成。 卷积都是5*5的模板,stride=1,池化都是MAX。上图是一个类似的结构,可以帮助理解层次结构(和caffe不完全一致,不过基本上差不多)

Alexnet

Imagenet比赛冠军的model——Alexnet (以第一作者alex命名)。caffe的model文件在这里。说实话,这个model的意义比后面那些model都大很多,首先它证明了CNN在复杂模型下的有效性,然后GPU实现使得训练在可接受的时间范围内得到结果,确实让CNN和GPU都大火了一把,顺便推动了有监督DL的发展。

AlexNet 之所以能够成功,深度学习之所以能够重回历史舞台,原因在于:

1) 非线性激活函数:ReLU

2) 防止过拟合的方法:Dropout,Data augmentation

3) 大数据训练:百万级ImageNet图像数据

4) 其他:GPU实现,LRN归一化层的使用

  • Data augmentation

    有一种观点认为神经网络是靠数据喂出来的,若增加训练数据,则能够提升算法的准确率,因为这样可以避免过拟合,而避免了过拟合你就可以增大你的网络结构了。当训练数据有限的时候,可以通过一些变换来从已有的训练数据集中生成一些新的数据,来扩大训练数据的size。

    其中,最简单、通用的图像数据变形的方式:

    1) 从原始图像(256,256)中,随机的crop出一些图像(224,224)。【平移变换,crop】

    2) 水平翻转图像。【反射变换,flip】

    3) 给图像增加一些随机的光照。【光照、彩色变换,color jittering】

    AlexNet 训练的时候,在data augmentation上处理的很好:

    随机crop。训练时候,对于256*256的图片进行随机crop到224*224,然后允许水平翻转,那么相当与将样本倍增到((256-224)^2)*2=2048。

    测试时候,对左上、右上、左下、右下、中间做了5次crop,然后翻转,共10个crop,之后对结果求平均。作者说,不做随机crop,大网络基本都过拟合(under substantial overfitting)。

    对RGB空间做PCA,然后对主成分做一个(0, 0.1)的高斯扰动。结果让错误率又下降了1%。

  • ReLU 激活函数

    Sigmoid 是常用的非线性的激活函数,它能够把输入的连续实值“压缩”到0和1之间。特别的,如果是非常大的负数,那么输出就是0;如果是非常大的正数,输出就是1.

    但是它有一些致命的 缺点:

    Sigmoids saturate and kill gradients. sigmoid 有一个非常致命的缺点,当输入非常大或者非常小的时候,会有饱和现象,这些神经元的梯度是接近于0的。如果你的初始值很大的话,梯度在反向传播的时候因为需要乘上一个sigmoid 的导数,所以会使得梯度越来越小,这会导致网络变的很难学习。

    Sigmoid 的 output 不是0均值. 这是不可取的,因为这会导致后一层的神经元将得到上一层输出的非0均值的信号作为输入。 产生的一个结果就是:如果数据进入神经元的时候是正的(e.g. x>0 elementwise in f=wTx+b),那么 w 计算出的梯度也会始终都是正的。

    当然了,如果你是按batch去训练,那么那个batch可能得到不同的信号,所以这个问题还是可以缓解一下的。因此,非0均值这个问题虽然会产生一些不好的影响,不过跟上面提到的 kill gradients 问题相比还是要好很多的。

    ReLU 的数学表达式:

        f(x)=max(0,x)

    很显然,从图左可以看出,输入信号<0时,输出都是0,>0 的情况下,输出等于输入。w 是二维的情况下,使用ReLU之后的效果如下:

    这里写图片描述

  • Dropout

    结合预先训练好的许多不同模型,来进行预测是一种非常成功的减少测试误差的方式(Ensemble)。但因为每个模型的训练都需要花了好几天时间,因此这种做法对于大型神经网络来说太过昂贵。

    然而,AlexNet 提出了一个非常有效的模型组合版本,它在训练中只需要花费两倍于单模型的时间。这种技术叫做Dropout,它做的就是以0.5的概率,将每个隐层神经元的输出设置为零。以这种方式“dropped out”的神经元既不参与前向传播,也不参与反向传播。

    所以每次输入一个样本,就相当于该神经网络就尝试了一个新的结构,但是所有这些结构之间共享权重。因为神经元不能依赖于其他特定神经元而存在,所以这种技术降低了神经元复杂的互适应关系。

    正因如此,网络需要被迫学习更为鲁棒的特征,这些特征在结合其他神经元的一些不同随机子集时有用。在测试时,我们将所有神经元的输出都仅仅只乘以0.5,对于获取指数级dropout网络产生的预测分布的几何平均值,这是一个合理的近似方法。

  • Local Responce Normalization(LRN)

    它做的事是对当前层的输出结果做平滑处理。下面是我画的示意图:

    前后几层(对应位置的点)对中间这一层做一下平滑约束,计算方法是:

    一句话概括:本质上,这个层也是为了防止激活函数的饱和的。个人理解原理是通过正则化让激活函数的输入靠近“碗”的中间(避免饱和),从而获得比较大的导数值。所以从功能上说,跟ReLU是重复的。不过作者说,从试验结果看,LRN操作可以提高网络的泛化能力,将错误率降低了大约1个百分点。

    这里写图片描述

Googlenet

14年比赛冠军的model,这个model证明了一件事:用更多的卷积,更深的层次可以得到更好的结构。(当然,它并没有证明浅的层次不能达到这样的效果)

VGG

VGG有很多个版本,也算是比较稳定和经典的model。它的特点也是连续conv多,计算量巨大(比前面几个都大很多),这里给一个简图。基本上组成构建就是前面alexnet用到的。

vgg和googlenet是2014年imagenet竞赛的双雄,这两类模型结构有一个共同特点是Go deeper。跟googlenet不同的是,vgg继承了lenet以及alexnet的一些框架,尤其是跟alexnet框架非常像,vgg也是5个group的卷积、2层fc图像特征、一层fc分类特征,可以看做和alexnet一样总共8个part。根据前5个卷积group,每个group中的不同配置,vgg论文中给出了A~E这五种配置,卷积层数从8到16递增。从论文中可以看到从8到16随着卷积层的一步步加深,貌似通过加深卷积层数也已经到达准确率提升的瓶颈了。

Deep Residual Learning

这个model是2015年底最新给出的,也是15年的imagenet比赛冠军。可以说是进一步将conv进行到底,其特殊之处在于设计了“bottleneck”形式的block(有跨越几层的直连)。最深的model采用的152层!!

原创粉丝点击