深度学习OverFeat

对于分类问题而言,一个常用的增加训练样本的方法是将训练样本随机移动一个小的位移,或者,等价的,

在图像中随机取一些大的图像块。然后以这些图像块为输入训练分类模型。在测试阶段,可以采用滑窗的方法对

每一个图像块进行分类,然后组合这些分类结果,得到一个置信度更高的类别标签。这种技巧被广泛运用于机器

学习算法中,例如:

cuda-convnet库的wiki:https://code.google.com/p/cuda-convnet/wiki/TrainingNet

瑞士一个研究组的文章:Multi-column Deep Neural Networks for Image Classification. CVPR2012.

       对于检测和定位问题,最自然(也是最常用的方法)就是采用滑窗对每一个图像块进行检测,从而确定目标

物体的位置。

         

       以上解决分类、检测和定位的方法有一个共同的地方,就是需要一个滑窗对整幅图像进行密集采样,然后

处理每一个采样得到的图像块。传统的处理这些图像块的方法是一个接一个处理。但是,CNN有更便捷的做法。


文章内容:

CNN模型:

       与Hinton小组的经典论文:ImageNet Classification with Deep Convolutional Neural Networks. NIPS2012.

结构一致。区别在于:a) 训练时输入大小固定,测试时用多尺度输入(具体方法见下文);b) 没有对比度归

一化;c) 采用没有overlap的max pooling;d) 前面两层的feature map的个数比上述论文中多。


       模型结构如上图所示。其中,1-5层为feature extraction layers,为三个任务(recognition、localization

和detection)共用的部分,6-9层为classifier layers。训练过程的一些参数为:min-batch的大小为128,

momentum = 0.6,weight decay = 1.0e-5,weight初始化为从(μ, σ) = (0, 0.01)的随机采样,等等。

密集采样(滑窗)支持:

       对于一个训练好的CNN来说,CNN的结构(如CNN的层数、每一层feature map的个数,卷积层的kernel size

等等)是固定的,但是,每一层的feature map的大小是可以改变的。当测试样本和训练样本大小相同时,CNN

最后一层的每一个节点分别输出一个0~1的实数,代表测试样本属于某一类的概率;当测试样本比训练样本大时,

CNN最后一层每一个节点的输出为一个矩阵,矩阵中的每一个元素表示对应的图像块属于某一类的概率,其结果

相当于通过滑窗从图像中进行采样,然后分别对采样到的图像块进行操作:

                                                                 

       如上图所示,当输入图像为16x16时,output层的每一个节点输出为一个2x2的矩阵,相当于在原图像上

的四个角分别采样了一个14x14的图像块,然后分别对每一个图像块进行处理。

多尺度支持:

       传统的检测/定位算法是固定输入图像不变,采用不同大小的滑窗来支持不同尺度的物体。对于CNN来说,

滑窗的大小就是训练时输入图像的大小,是不可以改变的。那么,CNN支持多尺度的办法就是,固定滑窗的大

小,改变输入图像的大小。具体来说,对于一幅给定的待处理的图像,将图像分别resize到对应的尺度上,然

后,在每一个尺度上执行上述的密集采样的算法,最后,将所有尺度上的结果combine起来,得到最终的结果。

       然而,对于上文所述的密集采样算法来说,采样的间隔(也就是滑窗的stride)等于执行所有卷积和pooling

操作后图像缩小的倍数,也就是所有卷积层和pooling层的stride的乘积。如果这个值较大的话,采样就显得

sparse,图像中的某些位置就无法采样得到。这时,或者减小卷积层和pooling层的stride,或者干脆去掉某个

pooling层,或者采用某种方法替代某个pooling层。


       文章采用的方法如上图所示。对于stride=3的pooling层,先做常规的pooling(Δ=0),再往右移一格做

pooling(Δ=1),再往右移一格做pooling(Δ=2)。这样做的结果相当于,在相邻的两个滑窗的中间进行插值;也

可以理解为,将滑窗的stride减小了三分之一。这样,既实现了pooling操作,也减小了取样的间隔。

分类问题测试过程:

       训练一个CNN并确定图像的六个尺度。给定一幅待识别的图像,先将图像resize到这六个不同的尺度,然后,

将这六种尺度的图像以及对它们进行水平翻转后的图像(总共12幅图像)送到CNN中,产生12个CNN输出的结果。

然后,对每一个CNN输出的结果进行空间域的非极大值抑制。(例如,对于一个类别数为1000的CNN来说,其输

出为1000个矩阵。第m个矩阵的位于(x, y)位置的元素表示点(x, y)对应的图像块属于类别m的概率。对这个输出结果

进行非极大值抑制,即对矩阵中所有元素求最大值。)然后,对于所有的非极大值抑制的结果(总共12个)按类别

求平均值,然后取均值的Top-1或者Top-5。

定位问题的模型和测试过程:

       定位问题的模型也是一个CNN,1-5层作为特征提取层和分类问题完全一样,后面接两个全连接层,组成

regressor network。训练时,前面5层的参数由classification network给定,只需要训练后面的两个全连接层。这个

regressor network的输出就是一个bounding box,也就是说,如果将一幅图像或者一个图像块送到这个regressor

network中,那么,这个regressor network输出一个相对于这个图像或者图像块的区域,这个区域中包含感兴趣的

物体。这个regressor network的最后一层是class specific的,也就是说,对于每一个class,都需要训练单独最后一

层。这样,假设类别数有1000,则这个regressor network输出1000个bounding box,每一个bounding box对应一

类。

对于定位问题,测试时,在每一个尺度上同时运行classification network和regressor network。这样,对于每

一个尺度来说,classification network给出了图像块的类别的概率分布,regressor network进一步为每一类给出了

一个bounding box,这样,对于每一个bounding box,就有一个置信度与之对应。最后,综合这些信息,给出定位

结果。 (最近颇忙,后面的内容还是烦劳各位看论文吧。)


对于一个分类模型而言,随着模型复杂度的上升,training error一般呈现单调递减的特性,而test error则

先减后增。在test error达到临界点之前,模型为underfitting;在临界点时,模型为fitting;过了临界点,

模型就呈现overfitting的特性。如下图所示:

  

然而,当神经网络遇到大样本时,有时会出现training error和test error同时单调递减然后趋于一个大于0

的定值的情况。让我们先把test error丢到一边,单从training error上来看,传统的经验告诉我们,随着

模型的复杂度的增加,training error应该逐渐减小到0才对,毕竟,training sample对模型来说是可见的,

极端情况下,模型只需要做一个memorization就可以了。如果training error不能减小到0,这说明,不管

模型的复杂度增加多少,模型都是underfitting的(至少对training sample来说是的)。怎么会这样?


文章内容:

Yann N. Dauphin和Yoshua Bengio认为,目前的随机梯度下降算法并不适用于large neural network。所以,

就算增加了模型的复杂度,使得模型有能力去表达更复杂的数据,但是,我们目前无法将模型的这种能力

挖掘出来。

为了验证这种想法,Yann N. Dauphin和Yoshua Bengio在ImageNet上做了实验。 首先在图像上提取SIFT

特征,然后用k-means聚类得到1000个 visual words。之后这些特征被送到一个单隐含层的神经网络,

输出层用softmax进行分类。实验的目的在于,探求training error和model complexity之间的关系。为了

得到最小的training error,该实验没有用任何正则化方法。(几乎所有的正则化方法都是在解决overfitting

的问题,而该实验想解决的是underfitting的问题)

由于只有一个隐含层,该模型的tuning parameter只有两个,隐含层的神经元的个数和学习速率。前者直接

与模型复杂度相关,后者采用gird search的方法在[0.1, 0.01]之间取最优值。


实验结果:

这张图说的就是引言中提到的情况,随着模型复杂度的上升,training error递减并趋于一个大于0的常数。

这说明,模型复杂度的增加并不能解决underfitting的问题。


这张图说的是隐含层节点数和增加一个节点所去掉的错误样本(训练过程)的个数之间的关系。如果模型是

well-trained的话,每增加一个节点所去掉的错误样本应该接近常数才对,因为,对于单隐含层的神经网络来说,

网络的表达能力和隐含层节点的个数应该呈现近似线性相关的关系。因此,上图实际上是说,随着网络的增大,

增加隐含层节点所得到的收益迅速减小,即所谓的 highly diminishing returns。


讨论:

Yann N. Dauphin和Yoshua Bengio认为,这种highly diminishing returns是当前普遍使用的一阶梯度下降算法

的一个failure。

       In fact, we know that the first order approximation fails when there are a lot of interactions between
       hidden units. It may be that adding units increases the interactions between units and causes the
       Hessian to be ill-conditioned. 

所以,有两种解决方法:

1. 打断节点之间的interaction,使得Hessian矩阵变得better conditioned.

2. 更好的训练算法,将节点之间的interaction也考虑进去。其实就是要考虑Hessian矩阵。


comment:

文章的观点新颖,但是实验部分有一些值得商榷的地方。比如,用SIFT+k-means提取特征而并非直接

使用原始数据,没有考虑特征提取所引起的信息丢失;用错误率/错误样本数的评判准则似乎不妥,

因为,容易被分类的样本在模型较小的时候就已经被正确分类了,剩下的顽固分子本来就很难被分类,

它的分类的困难程度应该比容易分类的样本要高很多,如果模型的复杂程度线性增加的话,剩下的难

分类的样本的困难程度应该呈非线性递增才对。另外,单层神经网络得到的结论是否适用于deep的神

经网络,这也是一个问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值