首页 > 代码库 > Multiple Instance Learning

Multiple Instance Learning

///////////////////////////////////////////推荐学习组//////////////////////////////

http://www.robots.ox.ac.uk/~vgg/

//////////////////////////////////////////////////////////////////////////////////////// 

 

 

 

多示例学习(Multiple Instance Learning)

 

今天一直在准备组会seminar,是导师点名要我做的报告,一篇有关weakly supervised的论文《Weakly supervised discriminative location and classification: a joint learning process》。读了第一遍就觉得所谓weakly supervised似乎就是多示例学习换了一个说法而已。再看更多的论文之前,这个结论还有待验证。不管怎么说,多示例学习是一个影响深远的大坑,很多令人印象深刻的重要工作都直接或者间接的应用了多示例的思想。其中我觉得最耀眼的应该是Felzenszwalb大牛的《Object Detection with Discriminatively trained part based models》。在那篇文章里他把这个模型叫做latent SVM,实际上就是MILSVM的变种。

 

监督学习 (Supervised Learning)

“学习是透过教授或体验而获得知识、技术、态度或价值的过程,从而导致可量度的稳定的行为变化,更准确一点来说是建立新的精神结构或审视过去的精神结构。”                                                                                                                  ————百度百科

 

上面这段话里,我觉得说的最贴切的地方是“学习需要审视过去”。对于计算机来说,所谓过去就是训练样本,机器学习是一个根据训练样本得到分类器或者拟合函数的过程。而监督学习意味着每个训练样本都有属于自己的标记。当这个标记代表着分类类别的时候,学习得到的就是分类函数。当这个标记代表着某种连续的取值的时候,学习得到的就是拟合函数。更复杂的,每个标记可以是一个集合,这时候学习得到的是结构化预测函数。

 

很多时候,不是每个训练样本都有标记,而是只有一部分被标记,而另一部分只有数据本身,标记缺失掉了。这时候需要将没有标记的数据和有标记的数据结合起来进行机器学习,这就是半监督学习。又有的时候,甚至所有的样本都没有标记,这就是非监督学习。但是实际上,非监督学习没法进行目标明确的分类、拟合任务,只能做一些分析性的任务,比如说聚类,PCA,字典学习等等。

 

多示例问题 (Multiple Instance Problem)

我们考虑这样一种训练数据,这个数据是有标记的,标记只有两个类别,正和负。但这一次标记的目标不是一个样本,而是一个数据包(bag)。某一个或者几个数据合在一起叫做一个bag,每个bag有自己的标记。当一个bag的标记为负时,这个bag里面所有样本的标记都是负的。当一个bag的标记为正时,这个bag里面至少有一个样本的标记为正。 我们的目标是学习得到一个分类器,使得对新输入的样本,可以给出它的正负标记。这样的一类问题就是多示例问题。

 

这个问题在实际的应用中非常常见,比如说,方校长建长城的时候,他要列举一些违禁词汇不让大家搜索,他觉得一个一个输入太麻烦了,于是可以找来一些黄色或者反动的网站,直接作为正样本包:网站中的词汇总有一个是违禁的。然后拿健康向上的人民日报网页作为负样本包:里面的词汇没有一个是违禁的。又比如做检测问题,标记训练图片样本的时候需要给出一个矩形框指明目标的位置,有可能标的不够准确,导致不同的样本之间对不齐,这时候可以将标记的矩形框做一些局部扰动得到一些新的矩形框,将它们一起看成一个bag,其中总有一个是最佳的正样本,也就是标记为正。而取一张没有目标的图片,作为负样本包:无论在里面怎么截取图片,都是负样本。

 

 求解方法

关于多示例问题怎么求解,假如说所有的样本标记都已经知道了,那就是一个监督学习的问题了,用SVM,adaboost之类的都可以做。现在的困难是,有很多样本的标记我们不知道。对于负样本包来说就无所谓了,里面每个样本那都是负标记,这个是明确的。问题出在正样本包上面,每个正样本包里只能保证有一个是正样本,其他的是正是负就不知道了,关键是到底是哪个样本是正的呢?这个也是不清楚的。

 

解决这个问题的方法其实挺直接的:迭代优化(alternative optimization)。也就是说,我们先假设已经知道了所有样本的标记,那么就可以通过某种监督学习的方法得到一个分类模型,通过这个模型我们可以对每个训练样本进行预测,然后更新它们的标记,我们又可以拿这一次新得到的标记重新训练分类模型了。所以整个优化过程分为两部分:监督学习,标记更新。

 

这里还有一些地方需要注意:

第一点, 训练监督学习的模型的时候,只从正样本包里挑选被预测的“最像正确”(也就是分类得分最高)的那一个,正样本包里面其他的样本,不管预测出来是正的还是负的都不要了。这是因为,其实多示例的问题也可以描述为,正样本包里面“最正确”的一个样本标记是正的,跟其他样本无关。所以,这种选择策略恰恰是符合问题定义的。

第二点,如果负样本足够多的话,可以只挑选每个负样本包里面被预测“最像正确"的一个样本作为负样本进行训练,这样子的负样本也叫做hard sample或者most violated sample。实践上来说,它们对于模型快速收敛是最有效的。

 

那么下面给出一个简单的流程图:

 

多示例学习:


输入:数据矩阵X=[x1,x2,?,xn], 包标记Y=[Y1,Y2,?,Ym],包与样本的关系I=[I1,I2,?,Im]

输出: 分类函数 f

 

将每个标记包j中的样本iIj初始化为包的标记yi=Yj,初始化集合U为空,将所有样本加入样本集U

重复下面的过程

iU的样本的数据xi以及标记yi训练得到一个分类函数f

利用f预测所有样本的标记yi

清空U

对于每个正标记包,选取f预测得分最高的样本加入集合U

对于每个负标记包,选取f预测得分最高的样本加入集合U(或者取较高的某些样本,也可以取全部样本都加入U,这取决于负样本是否充足)

直到满足结束条件

返回f