实训周报1-AlexNet论文全解读

Week Report 1—AlexNet

  • Week Report 1AlexNet
    • AlexNet的网络结构
      • 卷积层
      • ReLU这个不是层不过也放在这里讨论吧
      • 池化层
      • 全连接层
      • Dropout层
    • 数据预处理
      • 均值归零
      • crop采样
      • Fancy PCA采样

这一周,我们主要关注深度学习环境的搭配以及两篇重要的论文,分别是“Imagenet Classification with Deep Convolutional Neural Networks” 和 “DISC: Deep Image Saliency Computing via Progressive Representation Learning”。其中第一篇论文是大名鼎鼎的AlexNet产生的论文,因此在这篇周报中,我打算对第一篇论文做个总结。
AlexNet作为第一个出现在ILSVRC挑战赛中的深度卷级神经网络,成功地将人们的视野重新拉回到深度学习上。李飞飞教授曾经说过第一次物种大爆炸是发生在生物视觉的出现之后。我认为,AlexNet就像是一个计算机的视觉时代来临的里程碑,并且伴随着它,还会有更多的不可思议的新事物和新领域产生(这似乎是马后炮?不,这就是)。

AlexNet的网络结构:

AlexNet是一个非常简单的网络,仅由5个卷积层和3个全连接层构成。这里我就不罗嗦的讲每个层的细节了,而是肤浅的讲下自己对这些层的理解。

卷积层:

由于对于自然图像而言,像素之间具有空间的相关性,所以利用卷积核对图像进行卷积计算也是合情合理的,再其次就是卷积层会很省参数。做一个简单的计算,就拿我们的DISC作业作为例子,当时,为了测试,我自己写了一个非常简单的网络,就一个全连接层,把256*256*3的图像转成4096的向量,然后再用欧式距离的loss layer,结果参数的数量就有(256*256*3+1)*4096=805310464(8亿个参数),当时就爆内存了(我是在本机跑),然后问TA,TA说是内存原因,叫我直接到服务器上跑,结果在snapshot的时候出了错,我网上搜这个错误,只有一个人是跟我一样的,她的问题就是snapshot保存的solverstate超过了2G。而我一开始怎么都不愿意相信自己的如此简单的模型会超过2G,纠结了半天,结果TA又教我做人了(32GB)…然而如果使用的是卷积层,我们可以用两层实现,第一层使用一个卷积核尺寸为3的卷积核,那么就可以得到一个254*254*1的输出,这里使用的参数数量有3*3*3+1=28个,然后在下一层,我们再使用4096个kernelsize为254的卷积核就可以得到我们需要的4096维的向量,这里使用的参数数量有(254*254+1)*4096=264261632(2亿个),总体比单纯用全连接层少了3倍,这还是放在stride为1的情况下,如果stride为2,那数量又要再少一倍(?层数越多参数反而越少,如果没有卷积层,深度学习该如何谈深?)。并且还增加了网络的复杂度和非线性程度(毕竟使用activation function的话一般也是不需要参数的,因此如果用层多,使用的非线性转换次数也会多)。

ReLU(这个不是层,不过也放在这里讨论吧):

这里从一个反面例子Sigmoid入手来看看ReLU的好处。Sigmoid是早期一种比较常用的非线性化手段,但是这个方法具有三个缺点:

饱和区将扼杀梯度
输出并非以零为中心的
自然指数的运算开销大
具体细节可以参考我cs231n的学习笔记activation function部分:)

而ReLU的运算开销就非常小,只是一个简单的比较就可以了,然而对于饱和区问题,ReLU其实也有,不过就是只存在于负半轴(因此一般bias会设置为正数),然后ReLU其实也是非零为中心的,所以说ReLU也并不是就如我们想象中的那样好,因此也有了很多变种,比如PReLU、ELU、RReLU等等。

池化层:

池化层其实我还不是很理解为什么管用,但是简单的想的话,首先池化层能够缩小数据规模(而且零参数),并且,应该如果是使用Max pooling的话,对负数应该会有遏制的作用,这样可以一定程度帮助ReLU的输入比较多的正数,这其实是非常有利于后向传播的,因为如果ReLU的输入是负数,那么导数为零,从而导致梯度弥散。其次就是从仿生的角度来说,冲动大的神经元会对其周围的神经元有抑制作用,因此我想,Max pooling也正好起到了类似的效果。不过,个人认为池化层其实还是不怎么好,毕竟对于一个stride为2,kernelsize为2的核来说,池化层扔掉了四分之三的数据,而这么大的比例的数据,是极有可能存在一些非常重要的信息的。
局部响应归一化层(Local Response Normalization):
论文专门抽出了一部分讲了这个层,公式看起来倒是有点复杂,其实简单来看,就是就是接受前一层的输出,然后进行局部的放缩,即其放缩比例根据其周围的输入的大小而改变。很有趣的是这篇论文提到了这个也是有仿生的元素在的,跟我们上面提到的那样,冲动大的神经元会对周围的神经元有抑制作用。论文说这个层有一点的泛化作用,但是好像也没讲清楚为什么(或许是我智商还没能够get到),我自己的一个见解是,如果没有使用LRN,后面的网络如果需要某个神经元反应大些,模型就会学习到使得计算这个神经元的权重变得很大,而如果使用了LRN,在LRN前一个层输出的时候,LRN对其冲动大的输出进行了相对的放大,而对冲动小的输出进行了相对的收缩,这样一来,原本参数应该需要变大的那个神经元的参数就不需要那么大了,因为有LRN在帮它放大,从而导致了网络层的参数之前的数值区别不会太大,从而起到泛化的作用。

全连接层:

全连接层是比较经典的层了,其实是一个线性组合(线性回归),可以揉合所有的特征,并且可以在后面加一些非线性转换来达到不可思议的能力,只是参数很多,一般都塞在最后面。而且,就在码这篇report的时候,我发现了其实从一开始就只有卷积层,全连接层其实也是一个卷积层。(比如对于256*256*3的数据,使用一个kernelsize为256的卷积核,产生一个4096的向量的参数数量和连接方式与全连接层完全一致!)

Dropout层:

顾名思义,Drop方法就是在“训练过程”中将一定比例的神经元输出置零,从而起到泛化的作用,这里给出两种Dropout具有泛化的三种解释:

强迫网络拥有冗余的表示
Dropout在训练一个大规模的网络组合
模型复杂程度
细节可以参考我cs231n学习笔记的Dropout部分:)

到这里,我就不考虑后果的讲了对AlexNet里面各种层的理解。发现不知不觉竟然水了三页纸= =||希望TA看了不会太累,不过别担心,就快到尾声了:)。接下来浅浅的水过数据的预处理。

数据预处理:

嗯,其实我觉得最吸引我的就是这部分了 。这篇论文中,提到的对数据的预处理包含了三个部分,第一部分是图片的均值归零处理,第二部分是图片的crop采样,第三部分是对图片进行fancy PCA采样。

均值归零:

归零的操作可以使数据在输入的时候处于一个比较对称的分布,而不是正偏或者负偏,从而导致模型出错,比如说负偏的化可能会导致梯度弥散,而正偏与负偏其实就是一个符号的差别。

crop采样:

论文中提到说AlexNet对于其训练任务其实是过拟合的,因此它采取了一些列手段,其中就包含了crop采样。论文对256的图片进行224的随机crop采样,那么对于每一张图片,都可以产生2048种不同的样本,并且,论文还使用了镜像,直接导致数据集大小翻了2048*2=4096倍。虽然说大量的数据集之间存在相关性,但是也是一定程度降低了过拟合程度。

Fancy PCA采样:

论文通过求得每个像素点的协方差矩阵(3*3),从而求得特征值和特征向量,然后在对特征值进行一部分的波动,求出一个新的协方差矩阵,在加到原本的像素上,从而实现一种滤镜的效果。这种方法同样也可以产生大量的新样本。

最后废话也不多说了,抛出一个问题来结束这周的report。正如论文指出的,AlexNet其实已经过拟合了,为什么后面的网络对于相同的问题和数据集,网络却越来越深,参数越来越多?

你可能感兴趣的:(机器学习,深度学习,论文笔记,周报,深度学习,Alex-net,机器学习)