metric learning

Posted MissSimple

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了metric learning相关的知识,希望对你有一定的参考价值。

度量(metric)的定义:

在数学中,一个度量(或距离函数)是一个定义集合中元素之间距离的函数。一个具有度量的集合被称为度量空间。

为什么要用度量学习?
很多的算法越来越依赖于在输入空间给定的好的度量。例如K-means、K近邻方法、SVM等算法需要给定好的度量来反映数据间存在的一些重要关系。这一问题在无监督的方法(如聚类)中尤为明显。举一个实际的例子,考虑图1的问题,

 

假设我们需要计算这些图像之间的相似度(或距离,下同)(例如用于聚类或近邻分类)。面临的一个基本的问题是如何获取图像之间的相似度,例如如果我们的目标是识别人脸,那么就需要构建一个距离函数去强化合适的特征(如发色,脸型等);而如果我们的目标是识别姿势,那么就需要构建一个捕获姿势相似度的距离函数。为了处理各种各样的特征相似度,我们可以在特定的任务通过选择合适的特征并手动构建距离函数。然而这种方法会需要很大的人工投入,也可能对数据的改变非常不鲁棒。度量学习作为一个理想的替代,可以根据不同的任务来自主学习出针对某个特定任务的度量距离函数。


softmax使用欧氏距离,会把同类图片都聚到一个点中,针对又是马又是人的图片,它只能框出一类。
knn最合适的是学习马氏距离,怎么学?要给出先验知识,哪两个数据更相似,欧式距离不可靠。

SVM也是metric learning的一种,因为kernel matrix就是相似度?

 

那么损失函数和度量有什么关系呢?

损失函数就是度量。损失函数就是预测标签 y‘ 和真实标签 y 之间的距离。

 

接下来看一篇博文:

http://www.cnblogs.com/zhk-sein/p/3919619.html

 

我对人脸识别的理解:比较两个人脸是不是相似,而图片的存储是矩阵,那我们就是比较这两个矩阵有多近,如果“很近”,那就是同一个人嘛,相反,如果相差很大,那就不是一个人。如何来判断两个矩阵离得“近”呢,答案是丰富多彩的嘛,所以有各种各样的方法。

然后说下人脸识别的整个过程:样本——提取特征——训练——得到分类器——测试

1 样本,我用的LFW(Labeled Face in Wild)数据库,点击LFW可以下到,一共13233幅图片,对应5749个人。
2 提取特征,我用的LBP方法,另外由于提的特征过大,如果直接训练,成本太高,建议进行压缩,我在这里用的是cai deng的PCA方法,小伙伴们可以直接从这里下工具箱,很方便。
3 训练过程,我在这里是用的metric learning

这里参考了cao qiong的Similarity Metric Learning for Face Recognition和Jason V. Davis的Information Theoretic Metric Learning他们都是有完整代码贴出来的,可惜都是matlab的。

前面说到怎么找一个合适的距离能够“恰好”的把同一个人和不同的人分开,我们当然可以用我们熟悉的欧式距离,d1=(X-Y)’(X-Y)(X,Y是两个人脸的矩阵),但是效果不好,这个时候大家就想办法了,还有什么距离的,通常,马氏距离d=(X-Y)‘G(X-Y),这个时候我们通过训练找到一个合适的G,这个G能使在X和Y相近时,得到一个很小的值;cao qiong还引入了另一个距离,d2=XMY,这个距离,当X和Y靠近时,会很大,而远离时,d的值很小。cao xiong综合以上两点,d=d2-d1。而Jason V. Davis只使用了d1。
metric learning本质上就是要找一个合适的矩阵G。

感觉这是转化为一个最优化问题,我们肯定是最优某一项指标,然后给出一些限制条件,这样就变成我们熟悉的运筹学的问题了。

4 得到分类器,有了G以后分类就简单了,可以采用KNN分类,也可以给个简单的阈值,如果d大于某个值就不是同一个人,如果小于某个值就是一个人。

5 训练的结果:我用400维的数据测试下来识别率是89.7%

 

以上是关于metric learning的主要内容,如果未能解决你的问题,请参考以下文章

metrics

metrics-server监控主机资源

metrics-server监控主机资源

如何在 Keras 中将 Sklearn Metric 实现为 Metric?

sklearn.metrics 用法详解

Flink Metrics