The Role of Features, Algorithms and Data in Visual Recognition

最近被华农的老师邀请去给她的研究生介绍一下Deep Learning,一时间没想到什么好的角度去讲。

看了不少大牛们关于Deep Learning的introduction,结合最近Deep Learning三大神牛Nature上的文章,还是发现了不少的东西,有些问题甚至自己都没想过的。

慢慢的就形成了做PPT的思路了,从特征工程引出特征学习,然后再从特征学习引出深度学习,然后再讲几个经典的深度模型,重点讲讲CNN。

update: slides做好了,提前放出来。下载链接:

Pipeline of Pattern Recognition

模式识别里面所有的任务都可以归结为下面一个流程:

正是因为这个流程,计算机视觉的发展都是围绕三个大的方面来进行:

  1. 数据。如何清洗数据?如何对数据做扰动,增加训练样本?等等等等。
  2. 特征表达。如何找到一种更有效的特征表达方式?抑或说怎么得到更加适合特定任务的特征,从而增加模型的准确性。
  3. 学习算法。怎么设计出一种高效准确的学习算法?

毫无疑问的是,数据、特征表达以及学习算法都是非常重要的,不过哪个会比较重要?这么说或许不合理,应该说,在哪个方面下功夫对最终的结果影响最大?

Role of three factors

CVPR 2010年的一篇文章给出了线索,它做了大量的实验去比较跟验证哪个更重要,甚至还用做了人跟机器的性能比较,在这里我就不关心人的效果到底怎么样了。

The Role of Learning Algorithm

首先比较了不同学习算法对结果的影响,实验方法是固定特征跟训练数据,使用不同的学习算法进行求解。下图就是实验结果,横轴是特征,纵轴是准确率,不同的子图表示用不同的数据集,不同颜色的曲线表示不同的学习算法。可以发现不同学习算法他们的效果会有区别,但是变化不会太大。

The Role of Data

然后就是探究训练数据的不同对结果的影响,这时候就需要固定学习算法跟特征,使用不同的训练数据进行训练,下图是他们的实验结果,横轴是训练数据的数量,纵轴就是准确率,不同的子图表示不同的数据集以及不同的特征,不同颜色的曲线表示不同的学习算法,发现数据量增大的时候,效果提升还是挺明显的,然而到了一定量之后,数据增加,效果并不会提升了或者说提升非常慢。

The Role of Features

最后就是探究特征的作用,这时候需要固定学习算法跟特征。下图是实验结果,横轴表示不同的学习算法,纵轴表示准确率,不同的子图表示不同数据集以及特征维度,不同颜色的曲线表示不同的特征,可以看出来,特征的选择对结果影响非常大。

通过这组对比实验,可以得出的结论是,特征很重要,特征一旦没选好,不管用什么算法,用多少数据量、用什么再强大的算法也没什么用,比如上面提到的红色的这条曲线,不管用多少数据,用什么学习算法,它的效果总是最烂的。相反,如果特征选得好,用再简单的算法也能达到相当不错的效果。

Feature Engineering

那么这样就会引发我们的思考,特征是影响效果的最重要因素,然而在目前的主流系统里面,用的都是各种各样手工定义的特征,这些手工定义的特征有不少的缺陷:

  • 很依赖于人的领域知识,那么比如如果一个学计算机视觉的人想要做车辆的检测,那么需要花很多时间去了解车辆,区分不同车辆之间的关系。

  • 特征的设计跟学习算法是分开的,这样的一个坏处是,如果效果好,并不知道是特征好还是学习算法不好,难以分析。

  • 如果设计的特征有很多参数,那么就很难进行调参。
  • 如果出现了一个新的任务,那么设计有效的特征会非常缓慢。

比如下面这个图,我们想要学习出一张图片里面的深度信息,所谓的深度信息就是,物体距离我的距离,左边是一个正确的距离表示,不同颜色表示距离的远近,然而,这种任务的特征需要怎么设计?这非常困难,可以说是无从入手。

这时候自然而然就会想,能不能找到更有效的特征,能不能直接从数据里面学习出物体的特征,使得特征更适合我们需要解决的问题?

Feature Learning

这当然是可以的,而且也一直被研究,叫特征学习。只不过在以前的时代,数据量不多,计算不够快,导致了这样的研究很难进行下去。

特征学习是一个比较久的概念了,它指的是建立分类器或者一些预测器的同时,学习出数据的一种转换,使得基于这种转换能够更容易的提取出有效的信息,为最终的任务服务,特征学习的方法的好处在于:

  • 能够把分类器跟特征的表达一起学习,并做联合优化。
  • 在这种方法底下,我们可以为特征表示设计出大量的参数并进行学习,这样可以极大的提高了深度模型的表达能力。通常来讲,参数越多,模型的表达能力会越强。
  • 因为是直接从数据里面学习特征,那么会更有效的挖掘数据本身的特性。
  • 对于新的应用领域,能够很快的得到一个比较好的特征表达方式。

那么有什么方法是可以用来学习特征的?

Deep Learning

时下最火的Deep Learning就是一种非常强大的特征学习方法,他能够层次性的学习特征,高层的特征是用底层的特征表示的。这跟我们人的认知是很吻合的,像我们初中学的几何,我们就知道点动成线,线动成面,一样的道理,我们对一个物体的认识,通常都会把他进行拆解,比如人脸这个东西,通常我们理解是对他进行拆解成眼耳口鼻,然后不同的部分又是由不同的形状组合而成。右边这个图呢,是生物学的人对人脑的研究,发现脑对事物的认知是分层的,从简单到复杂。深度学习正是仿照这个脑认知来设计的,左边这个图是一个很好的说明,模型的输入直接是图像,然后一开始模型是学习出比较简单的特征,比如边缘,接着学习出更加复杂的特征,比如物体的部件,越往高层,特征越复杂,越接近我们想要了解的东西。

Deep Learning比较经典的模型有三个:DBN、Auto-Encoder以及CNN,这里主要讲一下CNN,对其他有兴趣的自行深入了解。

Convolutional Neural Networks (CNN)

卷积神经网络,跟很多深度模型都不太一样,像DBN、Auto-Encoder等都是把数据拉成一个一维的向量处理,而CNN是把数据以多维的数组来处理,比如图像通常会表示为3个二维数组,每个二维数组表示一个颜色通道,RGB。

神经元在卷积层会被组织成特征图的形式,每一张特征图是一个二维数组,比如下图的第2~4个子图,都是特征图,在特征图里面,每个点只会跟前一层的某个小区域有关。这种连接关系会决定了参数的个数,比如假设特征图上的一个点跟前面的一个4x4的区域有连接,那么这时候就只会有16个参数,对于一个特征图上点来讲,他们都共享这些参数。这些参数我们通常就叫做滤波器,右下角就是把滤波器可视化后的结果。而pooling操作了是指将特征图相邻的神经元进行合并。

卷积神经网络里面有4个非常有技巧的设计,1) 局部连接, 2) 共享权重, 3) pooling,以及 4) 多层卷积的使用,它们都利用了自然信号的特性。我逐一讲解一下为什么这些东西是有效的。

  • 对于局部连接,对于二维的数据,特别是图像,局部区域的值是高度相关的,而跟远离自己的区域的相关性很弱,所以不需要对太大的区域进行建模,这也是我们经常提到的图像局部区域相关性。在生物视觉的研究里面,当人注视前方的时候,只会关注前面的一小个区域,而不关注与周围的区域,按照这个理解,建模的时候不需要对太大的区域进行建模,需要对一小个区域建模就好了,这就是所谓的局部连接。
  • 而对于共享权重,前面讲过,同一个特征图上的神经元是共享相同的参数的,理由是图像或者其他信号的局部统计信息是跟位置无关的,出现在哪里都是可以的,这有点抽象,举个例子,比如人脸的眼睛,它是可以出现在图像上的任意位置的,如果一个特征图是表示眼睛出现的概率,那么这个特征图上的神经元就自然而然的会共享同一组参数。
  • 接下来是pooling,这个比较好理解,主要是用了降维,相邻的神经元表达的东西是很相似的,这时候需要对这些冗余的信息进行减少,加速计算速度 。
  • 多个卷积层的使用,这是一个分层的概念了,多层主要是为了学习到更高层的语义特征。在卷积神经网络里面,底层的特征都是一些比较简单的特征,比如边缘,再往高层就是由边缘组成的部件,再往更高层就是由部件组成的物体了。

因为卷积神经网络有上面这些特性,导致了它的参数比普通的深度模型少很多,从而使得卷积神经网络比以前更加容易训练。所以最近很多工作都是基于卷积神经网络来做的。

以上。

Reference

  1. Deep Learning, Nature, 2015
  2. The Role of Features, Algorithms and Data in Visual Recognition
  3. Deep Learning Tutorial, CVPR 2014
  4. Introduction to Deep Learning, Xiaogang Wang
坚持原创技术分享,您的支持将鼓励我继续创作!