机器学习讲座总结-读图时代的识图技术-车库咖啡

转自: http://blog.sina.com.cn/s/blog_eb3aea990101f3uo.html


在车库咖啡见到了传说的中的大牛 黄畅博士 @黄畅_了解的不只是人脸 ,黄博士对于识图技术进行了一个综述,下面是这次报告的总结。


1. 关于机器学习优化的目的:黄博士提到机器学习并非以求最优为目的,而是以控制overfitting为目的。

这个非正式报告中提到的问题,而是在讲座开始前和黄博士交流的时候提到的,引来几个同学的疑问,首先来解释一下这个问题

微博上大家也都提到了一些看法:
@ 等魔炮3rd的高町薇薇欧 :其实overfitting原因不就是陷入局部最优解么?求解全局最优解和客服overfitting其实也是具有等价性吧// @机器学习讲座 :回复 @Copper_PKU :微博太短,只能记录大概,实际上黄博士讲的更多,是有一定道理的 // @Copper_PKU :这个说法 不是很赞同

这个地方我解释一下,这个问题源于我问黄博士为什么Deep learning现在会火这个话题,我提到原来无法求得最优解,现在由于有了好的初始化方法,导致求解最优是有可能的了。黄博士此时说其实他并不看重一个机器学习问题是否有最优解,而更关注的是是否能够将overfitting控制到一定的范围内,这个一定范围是指的稍微有一点overfitting(毕竟可观察到的数据更具有可信性)。

这样来说的主要原因是最优解在实际操作中是很难获取的:

a. 在很多大规模的学习任务中,机器学习算法都是在试图学习一个复杂的非线性的函数,这样的函数实际上存在很多局部极值点,因此求解容易陷入局部极值。

b. 因此在寻优的过程中,通常都会有一个初始值,然后再根据使得目标函数下降的方向不断的迭代,直到满足收敛条件,但是这样的解不一定就是最优的。

c. 为什么呢?原因是你求解的目标函数根本就不是原来的问题,而是原来问题的一个近似(说到这里我只能呵呵)。近一步解释一下,我们通常在求解一个问题的时候,如果原问题很难直接求解(如NP-Hard的问题),那么我们就relax一下(如使用1范数来近似0范数),通过求解原来问题的bound来近似,所以这里的问题不再是原始的我们想求解的问题的解,对于原来问题来说,最后求出的所谓的最优解还可能没有你选择的初始值好呢。

d. 既然问题已经被偷换成了求bound的问题,那么就没有必要太关注于最优这个概念。因为最后的目的是想让训练出的结果在有更好的泛化能力,这个是通过求test error的bound来完成的,而test error< traing error + O(d/N),所以这里问题就转变成了控制training error和函数的复杂度问题,实际上也可以看做在控制overfiting的问题。

下面来正式的介绍黄博士的讲座。黄博士的讲座主要对于图像处理的技术做了一个综述,然后重点介绍了deep learning在百度图像产品中的应用。由于是综述,这里也就简单的罗列一些黄博士讲到的东西,然后最后我会把自己对于图像的一些理解加入到里面来。

2. 和图像相关的一些任务和数据集:

 a.和图像相关的任务: 从Object层面上来说,有 Detection和Recognition; 从Image/Scene层面上来说:有Categorization和Segmentation
b. 下面着重介绍Categorization,与此有关的数据集:
Caltech101  有101class,9K images;
Scene15 15 classes,5K images;
Caltech256 有256 classes 30k images;
Pascal Voc‘07 20 classes,10k images;
TINY(32*32)75 classes 80M images;
SUN397 899 classes,131K images;
ImageNet 22K classes,14M images; (li feifei v587)

3. Descriptors and Model

a. Descriptors: 在具体描述一张图像的时候,有两类特征可提供我们选择,一类是 全局特征, 如histogram,GIST;还有一类是Local descriptors,如著名的Sift,HOG、LBP、Haar-like等,这些特征都具有各自的特点,是为不同的任务而生的。

黄博士也提到了关于good Descriptors的几个原则:scale,viewpoints,lighting,occlusion,也就是尽量满足在这些条件下的不变性。

上述提到的的特征也就满足good Descriptors的一个或者部分条件,绝对不变的特征目前还没有见到,也许试图寻找绝对不变的特征这个想法就是错误的,任何不变都是暂时的。所说的在线学习方法,我到感觉就是在学习一些动态不变的特征。

b. Model

Rigid Model: 这一类Model黄博士举了两种,一种就是经典的Haar-like + Boosted Cascade;另外一种就是HOG+SVM。
Deformable Part Based Model:这是 2008年Felzenszwalb搞出的一个方法,出现之后,就有点一统天下的感觉了

在后边的讲座中,黄博士主要综述了一下基本的BOW的方法,然后罗列了一下baidu使用deeplearning一类方法所做的工作,具体的可以参考一下黄博士的slides。


--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------


下面主要想谈一下我对于传统的图像的描述方法以及现在比较火热的deeplearning之间关系的简单理解,首先谈一下传统的方法。

1. 传统的BOF框架

在归类的任务中,其实就在做一件事情:如何拿到数据的描述,有了描述我们再用一些分类器(如SVM)去分类就好了。

在如何生成图像的描述方面,BOW(Bag of words)和BOF(Bag of features)是先前比较成功的框架,主要分为几个步骤:

a. 图像基本特征的提取,如sift,hog,histgram等。这个步骤就是在提取图像中的基本特征。
b. Codebook的生成,这个就跟文本中的单词表一样的(我们常用的汉字词汇表有大概6W左右),在图像中这个初始的book的生成一般是通过聚类算法来完成的,如基本的k-means或者层次化的k-means等。另外这个book后边一般还要优化,这就是图像和文本处理的一个不同。

c. Encode features:有了这个codebook之后,我们就要用它来对于基本的a中提出的特征点进行encode。为什么要encode呢,实际上是为构建图像的描述做准备。这里顺带提一下,我们看到的汉字词表就是一个一个的高度抽象的词,而文本就是直接使用用这样一个一个词组合起来得。但图像跟文本是不同的是,图像不是人脑抽象过的,而文本是。图像不直接用codebook中的word来构成的,而是由像素构成,然后我们再提取sift,hog这样底层特征,如果要转换成和文本一样词表的结构,就要进行encode过程。

这个过程实际上是使用Codebook中的word来表示我们提出的sift,hog这样的特征(x = c*codebook,这个优化有很多中方法) 这样就得到一组系数c,我们可以认为就是把每个底层特征(sift,hog)映射到了另外一个空间,这个空间是由系数c来构成的。有了c之后,我们就可以来构建图像的描述了。

d. Pooling(这个被很多同学翻译成池化):这个就是构建图像描述的一个过程,常用的有average以及max两种操作,一种是把图像patch中所有出现的底层特征的code取一个平均,一个是取一个最大,这个实际上是在local建立一个feature competition的机制,一个是统计平均,一个是优者胜出,实际在局部区域的特征选择上有了And 和 Or的这两种逻辑(有点UCLA的Zhu老板的与或图的意思)。这样经过几次pooling后,就得到了不同level的图像的表示,把这些level的值级联起来或者经过某种组合,就得到了图像的描述,其实更深层的是因为Pooling这个过程跟人的神经元筛选的机制类似。(还要看神经学方面的文献,都要哭了…...)

总结一下:以上这4个步骤,仔细看来每一步就是一个函数映射,不断的把上层空间的特征映射到下层的新空间中,就是 f = f3(f2(f1(x)))这样一个过程,这不就是一个深度的模型吗?

2. CNN(卷积神经网络)模型

现在用在图像上的最成功的DL模型就是convlutional Neural NetWork(感谢LeCun和Hinton老人家)。在讨论CNN前,先来看一个图像处理的流程。

Input一副图像,我把图像分成了4*4一共16块,使用一个filter(如Gabor)对于图像的每一块提取了Gabor特征(级联后不就是Gist么),然后我再把2*2区域的Gabor特征进行Pooling,然后得到了一个2*2的一个map,然后最后我把这个2*2的map展成一个vector来作为图像的描述。每一副图像都这样做,把最后的描述都拿去用svm去train一个model,然后新来的图像就可以用这个分类器来分类。至少我们用BOF一类的模型就可以这样来做(以上没有生成codebook的过程,如果加上也只不过相当于多加一个函数映射而已),不同是可以调整一下filter,调整一下Pooling的策略,调整一下map和pooling的次数。

下面问两个问题:
a. Gabor filter是人工设计的,一个Gabor出来参数是定死的,用这样一个filter就真正可以来把某一类的图像的某种代表性的特征提取出来吗?
答案是否定的,因为图像的类别是千变万化的,但是目前人工设计的filter又是有限的,把有限的filter应用到无限的图像类别中,很难做到普适的。那怎么办呢?

b. 如果针对不同的图像类别能把这样的filter给学习出来那问题不就解决了,那怎样学习呢?

这是后问题变成了我们用的filter的参数未知的,只能给它一个大小,比如5*5,10*10。数目上可以假设为6,7,8….。 好了先暂且假定这些filter已经被求出来了,我们就可以拿它们对图像进行卷积了,每一个filter可以对应一个map,每个map可以做pooling,pooling完使用另外的一批filter再卷积映射成map,卷积完再pooling,如此往复一定数目就得到了图像的描述比如是di。到这里,跟本节开始提到的图像处理的流程是一致的,问题是这里面每个filter是未知的,需要求解。我们可以加一个分类器,通过一个求解目标min(sum(lable_est(di) - lable)),来对于这些参数构成一个约束。这个目标就是让估计的图像的类别和真实图像类别一致,这样一个过程就是使用CNN同时实现图像描述构建以及分类器求解的的一个过程。

那我们反过头来看其中未知的参数,每一次映射map就会产生一批filter,这一批filter的某种组合方式(比如前面的两个map映射到后边的一个map)又会产生一批参数,这些参数都是要求的,求解就是由构成的目标函数min(sum(lable_est(di) - lable))来控制的。每一次map或者pooling就是产生一个新的映射函数的过程,最后也就构成了第一节中提到的函数 f = f3(f2(f1(x))),不同的是本节这个函数中的参数要求解,是个求解的过程,而第1节之中的那个是设计的过程,不用求解。

3. 关于Deep learning结构的求解

下面讨论一下deep model 任务的求解方法

a. convex &  non-convex function: 一般的目标函数可以分为两类,一类是Convex的,一类是non-Convex的。前一类就是有一个全局极小值点,后一类就是有多个局部极值点,神经网络构成的函数就是一个non-convex的,而且是高度复杂非线性的,非线性的结构按照道理来说比线性的结构更能近似任意函数的分布,这也就是为什么如果神经网络的参数调好了,就能显示出对于数据精确的拟合能力。

b. 优化的思路:对于前一类,所有的参数随意初始化一个,可以使用一些基本的优化方法(如基本的梯度下降方法)求得最优解。而对于后一类,如果初始值不好,则非常容易陷入局部最小。由此给出一个基本思路就是选取尽量好的初始值,然后使用梯度下降类的方法来求解。另外一个思路就是采用多次试探求最优的方法,如模拟退火算法,理论上尝试无限次肯定能拿到最优解,这类算法耗时较多,在大规模的数据中非常不适用。


(在大规模数据的优化算法上  @jingdongc   @夏粉_百度  是专家,正在招人呢,小伙伴们快联系吧)

c. DNN中的问题:DNN模型80年代就提出来,但是没有火,原因是DNN参数非常多,因此计算量非常非常大,效率非常低,另外初始值不好找因此一直没有火起来,直到Hinton老先生在2006年发表的那篇论文出现,似乎找到了提高效率的方法。现在大家努力在多个维度上提升效率,设备上适应GPU,框架上进行并行计算、算法上使用Dropout策略,同时改进SGD算法。在精确度上,则使用pretraining进行神经网络的预先训练得到一个比较好的初始值,这样原来神经网络中效率和精度的问题就逐渐的解决了。

d. 如何看待Deep learning现在的火爆程度:DL火到一个什么程度,基本上跟Machine learning沾边的领域,如果不知道Deep learning就是out了。一般说来,一旦一个很久找不到答案的问题,突然有了曙光,会很快的刺激大家的兴奋点,兴奋过头了,就无所不用其极了,一下子就崇拜的不得了。我听过一些老师的讲座或者课程,比如baidu的余凯老师、黄畅博士、微软的邓力老师也请教过他们一些问题,感觉他们还是挺淡定的,呵呵。所以选择深度学习作为课题的博士生们,祝你们好运…...:)


4. 总结一下:

a. 图像在分类一个最为重要的任务是在找图像描述,那这个描述可以通过设计一个规则来建立,比如提取sift,Hog等一些底层结构的规则,也可以对于这些底层的结构使用一些已知的结构的函数进行再次变换,这些都属于人工设计的范畴。

b.Deep learning的一个最大的不同,就是尝试去自动的学习我们所想要的一些feature,而且可以多任务去做(2013年底 LeCun搞的overFeat),只要能把这些问题formulate成一坨参数,直接扔进去做就可以了,现在DL的火爆 其实跟Deep learning这个模型关系只有一半,另外一半是因为高度复杂非线性的函数可以快速的求解了…

c. 关于百度翻译中的实拍翻译功能:看到过baidu的 @ 余轶南 在他们主页上提到过一些, 这个功能应该就是使用CNN做的,图像的标注采用的是自动标注(大家可以看到很多图像拍摄后翻译出的一些词汇都不像人工标注的结果)和手工标注结合,因为加入了文本标注的技术,有可能采用了google的word2vec的技术通过词的距离来对图像的相似程度做一个参考,晚上的数据识别结果不是太好,应该和训练样本有关。

你可能感兴趣的:(图像检索)