机器学习讲座总结-读图时代的识图技术在车库咖啡见到了传说的中的大牛黄畅博士@黄畅_了解的不只是人脸,黄博士对于识图技术进行了一个综述,下面是这次报告的总结。1.关于机器学习优化的目的:黄博士提到机器学习并非以求最优为目的,而是以控制overfitting为目的。这个非正式报告中提到的问题,而是在讲座开始前和黄博士交流的时候提到的,引来几个同学的疑问,首先来解释一下这个问题这个地方我解释一下,这个问题源于我问黄博士为什么Deeplearning现在会火这个话题,我提到原来无法求得最优解,现在由于有了好的初始化方法,导致求解最优是有可能的了。黄博士此时说其实他并不看重一个机器学习问题是否有最优解,而更关注的是是否能够将overfitting控制到一定的范围内,这个一定范围是指的稍微有一点overfitting(毕竟可观察到的数据更具有可信性)。这样来说的主要原因是最优解在实际操作中是很难获取的:a.在很多大规模的学习任务中,机器学习算法都是在试图学习一个复杂的非线性的函数,这样的函数实际上存在很多局部极值点,因此求解容易陷入局部极值。b.因此在寻优的过程中,通常都会有一个初始值,然后再根据使得目标函数下降的方向不断的迭代,直到满足收敛条件,但是这样的解不一定就是最优的。c.为什么呢?原因是你求解的目标函数根本就不是原来的问题,而是原来问题的一个近似(说到这里我只能呵呵)。近一步解释一下,我们通常在求解一个问题的时候,如果原问题很难直接求解(如NP-Hard的问题),那么我们就relax一下(如使用1范数来近似0范数),通过求解原来问题的bound来近似,所以这里的问题不再是原始的我们想求解的问题的解,对于原来问题来说,最后求出的所谓的最优解还可能没有你选择的初始值好呢。d.既然问题已经被偷换成了最小化bound的问题,那么就没有必要太关注于最优这个概念。因为最后的目的是想让训练出的结果在有更好的泛化能力,这个是通过求testerror的bound来完成的,而testerrortraingerror+O(d/N),所以这里问题就转变成了控制trainingerror和函数的复杂度问题,实际上也可以看做在控制overfiting的问题。下面来正式的介绍黄博士的讲座。黄博士的讲座主要对于图像处理的技术做了一个综述,然后重点介绍了deeplearning在百度图像产品中的应用。由于是综述,这里也就简单的罗列一些黄博士讲到的东西,然后最后我会把自己对于图像的一些理解加入到里面来。2.和图像相关的一些任务和数据集:a.和图像相关的任务:从Object层面上来说,有Detection和Recognition;从Image/Scene层面上来说:有Categorization和Segmentation。b.下面着重介绍Categorization,与此有关的数据集:Caltech101有101class,9Kimages;Scene1515classes,5Kimages;Caltech256有256classes30kimages;PascalVoc‘0720classes,10kimages;TINY(32*32)75classes80Mimages;SUN397899classes,131Kimages;ImageNet22Kclasses,14Mimages;(lifeifeiv587)3.DescriptorsandModela.Descriptors:在具体描述一张图像的时候,有两类特征可提供我们选择,一类是全局特征,如histogram,GIST;还有一类是Localdescriptors,如著名的Sift,HOG、LBP、Haar-like等,这些特征都具有各自的特点,是为不同的任务而生的。黄博士也提到了关于goodDescriptors的几个原则:scale,viewpoints,lighting,occlusion,也就是尽量满足在这些条件下的不变性。上述提到的的特征也就满足goodDescriptors的一个或者部分条件,绝对不变的特征目前还没有见到,也许试图寻找绝对不变的特征这个想法就是错误的,任何不变都是暂时的。所说的在线学习方法,我到感觉就是在学习一些动态不变的特征。b.ModelRigidModel:这一类Model黄博士举了两种,一种就是经典的Haar-like+BoostedCascade;另外一种就是HOG+SVM。DeformablePartBasedModel:这是2008年Felzenszwalb搞出的一个方法,出现之后,就有点一统天下的感觉了在后边的讲座中,黄博士主要综述了一下基本的BOW的方法,然后罗列了一下baidu使用deeplearning一类方法所做的工作,具体的可以参考一下黄博士的slides。下面主要想谈一下我对于传统的图像的描述方法以及现在比较火热的deeplearning之间关系的简单理解,首先谈一下传统的方法。1.传统的BOF框架在归类的任务中,其实就在做一件事情:如何拿到数据的描述,有了描述我们再用一些分类器(如SVM)去分类就好了。在如何生成图像的描述方面,BOW(Bagofwords)和BOF(Bagoffeatures)是先前比较成功的框架,主要分为几个步骤:a.图像基本特征的提取,如sift,hog,histogram等。这个步骤就是在提取图像中的基本特征。b.Codebook的生成,这个就跟文本中的单词表一样的(我们常用的汉字词汇表有大概6W左右),在图像中这个初始的book的生成一般是通过聚类算法来完成的,如基本的k-means或者层次化的k-means等。另外这个book后边一般还要优化,这就是图像和文本处理的一个不同。c.Encodefeatures:有了这个codebook之后,我们就要用它来对于基本的a中提出的特征点进行encode。为什么要encode呢,实际上是为构建图像的描述做准备。这里顺带提一下,我们看到的汉字词表就是一个一个的高度抽象的词,而文本就是直接使用用这样一个一个词组合起来得。但图像跟文本是不同的是,图像不是人脑抽象过的,因此如果想要使用类似文本的方法来描述图像,需要有一个抽象的过程:原始图像是由像素构成,然后我们再提取sift,hog这样底层特征,然后在进行encode。这个过程实际上是使用Codebook中的word来表示我们提出的sift,hog这样的特征(x=c*codebook,这个优化有很多种方法)这样就得到一组系数c,我们可以认为就是把每个底层特征(sift,hog)映射到了另外一个空间,这个空间是由系数c来构成的。有了c之后,我们就可以来构建图像的描述了。d.Pooling(这个被很多同学翻译成池化):这个就是构建图像描述的一个过程,常用的有average以及max两种操作,一种是把图像patch中所有出现的底层特征的code取一个平均,一个是取一个最大,这个实际上是在local建立一个featurecompetition的机制,一个是统计平均,一个是优者胜出,实际在局部区域的特征选择上有了And和Or的这两种逻辑(有点UCLA的Zhu老板的与或图的意思)。这样经过几次pooling后,就得到了不同level的图像的表示,把这些level的值级联起来或者经过某种组合,就得到了图像的描述,其实更深层的是因为Pooling这个过程跟人的神经元筛选的机制类似。(还要看神经学方面的文献,都要哭了…...)总结一下:以上这4个步骤,仔细看来每一步就是一个函数映射,不断的把上层空间的特征映射到下层的新空间中,就是f=f3(f2(f1(x)))这样一个过程,这不就是一个深度的模型吗?2.CNN(卷积神经网络)模型现在用在图像上的最成功的DL模型就是convlutionalNeuralNetWork(感谢LeCun和Hinton老人家)。在讨论CNN前,先来看一个图像处理的流程。Input一副图像,我把图像分成了4*4一共16块,使用一个filter(如Gabor)对于图像的每一块提取了Gabor特征(级联后不就是Gist么),然后我再把4个2*2区域的Gabor特征进行Pooling,然后最后得到了一个2*2的一个map,然后最后我把这个2*2的map展成一个vector来作为图像的描述。每一副图像都这样做,把最后的描述都拿去用svm去train一个model,然后新来的图像就可以用这个分类器来分类。至少我们用BOF一类的模型就可以这样来做(以上没有encode的过程,如果加上也只不过相当于多加一个函数映射而已),不同是可以调整一下filter,调整一下Pooling的策略,调整一下map和pooling的次数。下面问两个问题:a.Gaborfilter是人工设计的,一个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.关于Deeplearning结构的求解下面讨论一下deepmodel任务的求解方法a.convex&non-convexfunction:一般的目标函数可以分为两类,一类是Convex的,一类是non-Convex的。前一类就是有一个全局极小值点,后一类就是有多个局部极值点,神经网络构成的函数就是一个non-convex的,而且是高度复杂非线性的,非线性的结构按照道理来说比线性的结构更能近似任意函数的分布,这也就是为什么如果神经网络的参数调好了,就能显示出对于数据精确的拟合能力。b.优化的思路:对于前一类,所有的参数随意初始化一个,可以使用一些基本的优化方法(如基本的梯度下降方法)求得最优解。而对于后一类,如果初始值不好,则非常容易陷入局部最小。由此给出一个基本思路就是选取尽量好的初始值,然后使用梯度下降类的方法来求解。另外一个思路就是采用多次试探求最优的方法,如模拟退火算法,理论上尝试无限次肯定能拿到最优解,这类算法耗时较多,在大规模的数据中非常不适用。(在大规模数据的优化算法上@jingdongc@夏粉_百度是专家,正在招人呢,小伙伴们快联系吧)c.DNN中的问题:DNN模型80年代就提出来,但是没有火,原因是DNN参数非常多,因此计算量非常非常大,效率非常低,另外初始值不