前面讲到图像分类器太弱了,虽然融合后效果挺好的(这个时候我们其实想着要不就这样投个NIPS算了),但是如果能提升图像分类器,融合的效果理论上会更好。而现在我们有了一个强大的融合分类器,我们能不能用这个融合分类器为目标数据集的图片打标签,反过来训练图像分类器呢?
一个常用的无监督学习套路就是,根据融合评分的高低,将图片对分为正样本对和负样本对(打伪标签),然后喂给图像分类器学习。
我们也尝试了这种做法,但是发现,数据集中负样本远远多于正样本,融合分类器分对的负样本是挺多的,但是分对的正样本超级少,分错的正样本很多,错样本太多,训练出来效果极差,用上一些hard ming的技巧也不行。
于是我们思考,
我们无法提供正确的01标签,分类器就只能学到许多错的01标签
我们是否可以提供一些软标签,让分类器去学习回归两个样本之间的评分,而不是直接学习二分类的标签?
这是一个图像检索问题,我们能不能用信息检索中的一些学习方法来完成这个任务?
于是自然而然地想到了Learning to Rank
Ranking问题定义:给定一个对象,寻找与其最相关的结果,按相关程度排序
常用方法:
Point-wise:每一个结果算一个绝对得分,然后按得分排序
Pair-wise:每两个结果算一下谁的得分高,然后按这个相对得分排序
List-wise:枚举所有排列情况,计算综合得分最高的一种作为排序结果
综合得分往往需要许多复杂的条件来计算,不一定适用于我们的场景,所以排除List-wise,Point-wise和Pair-wise都可以采用,得分可以直接用融合评分表示,Pair-wise可以用一组正序样本,一组逆序样本,计算两个得分,算相对得分来学习,有点Triplet loss的意味,于是在实验中采用了Pair-wise方法。
Pair-wise Ranking给定样本xi,其排序得分为oi,
给定样本xj,其排序得分为oj,
定义oij=oi - oj,如果oij>0说明xi的排名高于xj,
将这个排名概率化,定义Pij = eoij/(1+eoij),为xi排名高于xj的概率。
对于任何一个长度为n的排列,只要知道n-1个相邻item的概率Pi,i+1,就可以推断出来任何两个item的排序概率
例如,已知Pik和Pkj,Pij = Pik * Pkj = eoik+okj/(1 + eoik+okj),其中oik=ln(Pik/(1 - Pik))
RankNet: Pair-wise Learning to RankRankNet是Pair-wise Learning to Rank的一种方法,用一个神经网络去学习输入的两个样本(还有一个query样本)与其排序概率(上面定义的)的映射关系。
具体到我们这个问题里
给定查询图片A,给定待匹配图片B和C
用神经网络预测AB之间的相似度Sab为B的绝对排序得分,计算AC之间的相似度Sac为C的绝对排序得分
具体的神经网络用Keras实现并可视化出来长这样:
输入是三张图片,分别用Resnet52提取特征并flatten
flatten之后写一个Lambda层+全连接层算特征向量带权重的几何距离,得到score1和score2
用score1和score2和真实分数算交叉熵Loss(下面讲)
则B排序高于C的概率为:
Pbc= eobc/(1+ eobc) = eSab- Sac / (1 + eSab- Sac)
用预测概率Pbc去拟合真实的排序概率,回归损失用预测概率和真实概率的交叉熵表达
C(obc) = -P'bcln Pbc - (1-P'bc)ln (1 - Pbc)
网络实现超级简单,主要麻烦在样本三元组构造
Transfer Learning to rank整个Learning to rank过程如图