Notation

该论文中应用到较多符号,为避免混淆,在此进行解释:

n:原始数据集的大小

l:实验中用于监督学习的数据集大小(矩阵S行/列的大小)

m:辅助数据集,用于得到基于核的哈希函数

r:比特位数量/哈希函数的个数

1. Introduction

先前的哈希检索方法,要么精度低,要么目标函数过于复杂导致导致训练慢。在大规模的图像数据检索中,这些方法就不太适用。先前的哈希方法都是对汉明距离进行直接优化,但是因为汉明距离是nonconvex和nonsmooth,难以优化。在本文中,作者利用汉明距离和编码内积等价的特点,得到了一个非常高效易于优化的目标函数。同时,作者利用的内积的可分性,设计了一个贪婪算法逐比特位得对哈希函数进行求解。此外,为了适应线性不可分的数据,作者还应用了基于核的公式。得到了Kernel-Based Supervised Hashing(KSH)。并在CIFAR-10和TINY数据集上与无监督、半监督、监督等多种哈希方法进行比较,证明了KSH具有最好的表现。

2. Kernel-Based Supervised Hashing

2.1 Hash Functions with Kernels

论文利用基于核的哈希函数,解决了原始数据线性不可分的问题。对应的哈希函数如下:

该哈希函数由Kernelized Locality-Sensitive Hashing(KLSH)推导而来。查阅了下这篇文献,整个核哈希函数的推导过程大致如下:两个数据点间的相似性可由向量内积\(sim(x_i, x_j) = (x_i^{T}x_j) / (||x_i||_2||x_j||_2)\)来表示,为了解决原始数据的线性不可分问题,KLSH引入了核函数,于是得到了:

之后,经由均值、方差、特征值分解等等一系列的代数变换,得到了上述基于核的哈希函数。

In order to maintain efficiency and to maintain sublinear time searches, we want p to be much smaller than n. For example, \(p = O(\sqrt n)\)would guarantee that the algorithm maintains sublinear search times.

为了确保线性的搜索速度,KLSH中建议m(p)的的取值为\(O(\sqrt n)\)。

2.2 Manipulating Code Inner Products

在监督学习中,通过类别标签信息,原始数据集\(X\)可以划分为\(M\)和\(C\)两个集合,其中\(M\)中的数据点都是相似的,\(C\)中的数据点都是不相似的。通过对\(X\)进行部分采样,取\(l\)个样本构造相似矩阵\(S\)如下:

我们的目标是通过相似矩阵优化得到具有局部敏感特征的哈希函数,但是直接对汉明距离\(D_h(x_i,x_j)=|{k|h_k(x_i)≠h_k(x_j),1≤k≤r}|\)进行优化在数学上是难以求解的。因此,论文采用了code inner products来进行优化。code inner products可以如下表示:

由于r为码长是个常熟,因此从上式可以看到code inner products等价于汉明距离,存在一一映射的关系,我们可以通过优化code inner products的方法进而优化汉明距离。得到目标函数如下:

其中矩阵\(H\)表示向量\(x\)的哈希编码。接着再通过引入2.1节中的核哈希函数,得到最终目标函数如下:

2.3 Greedy Optimization

通过简单的代数变换,可以得到目标函数如下:

其中\(a_k\)为第k个哈希函数。在优化时,逐比特位得进行优化,即先优化\(a_1、a_2 ... a_{k-1}\),然后再之前的基础上再优化\(a_k\)。在此定义一个残差矩阵为:

显然,有\(R_0 = rS\)。因此,哈希函数可以通过最小化如下损失函数进行求解:

通过去掉常数项,可以得到哈希函数\(a_k\)的目标函数为:

Spectral Relaxation:因为此时的目标函数时非凸的,难以进行优化,因此论文应用了Spectral relaxation trick的方法,去掉了sgn函数,得到目标函数如下:

显然,通过变换,我们可以得到一个广义特征值问题\(K_l^TR_{k-1}K_la = \lambda K_l^TK_la\)。通过求解最大特征值对应的特征向量,并进行适当的尺度缩放以满足限制条件,我们可以得到\(a\)的解。但是,这个方法在l非常大时,优化结果不理想,因此KSH仅将这部作为\(a_k\)的初始化选择。

Sigmoid Smoothing:通过用sigmoid函数替换sgn函数,我们可以对目标函数进行优化。之后通过牛顿梯度下降方法,可以得到\(a_k\)的最优解(局部)。

算法流程如下:

在算法运行时,先初始化\(R_0 = rS\),在这个基础上逐步对\(a_1、a_2 ... a_k\)等进行优化。因为有着Spectral Relaxing中限制条件的约束,因此在一开始对\(a_1\)进行优化时,经由广义特征值求解、梯度下降之后得到的哈希函数\(a_1\)不会使得\(R_0 = rS\),优化结果只与\(a_1\)本身相关,和其他哈希函数无关。

从本质上看,\(rS\) 的信息是由r个哈希函数组合而成的,且哈希函数之间互相独立不相关。因此,在对\(a_1\)进行优化之后,我们可以从\(rS\)中去除掉哈希函数\(a_1\)相关的信息,继而对剩下的哈希函数进行优化。整个算法的思想不是直接对全局的目标函数进行优化,而是尽可能贪心地、逐比特位进行优化,这也是为什么算法称为Greedy Optimization的原因(个人理解)。

3. Experiments

在对查询点进行查询时,将汉明距离小于一定距离的图像作为查询结果返回。

  • metric distance neighbors

    当距离小于一定阈值时,即认为两个数据是相似的。

  • semantically similar neighbors

    只有当两个属于的标签一致时,才认为两个数据是相似的。具有更强的置信度。

  • Hashing table的构造

    个人理解:m个数据,经过c个哈希函数映射后,得到矩阵\(H∈R^{m*c}\),矩阵H的第i行代表第i个数据对应的哈希编码,矩阵的第j列代表哈希表的第j个bucket。

评价标准:

  • precision

    对于一个查询,返回了一系列的文档,正确率指的是返回的结果中相关的文档占的比例,定义为:precision=返回结果中相关文档的数目/返回结果的数目。

  • recall

    召回率则是返回结果中相关文档占所有相关文档的比例,定义为:Recall=返回结果中相关文档的数目/所有相关文档的数目。

  • mAP

    正确率只是考虑了返回结果中相关文档的个数,没有考虑文档之间的序。对一个搜索引擎或推荐系统而言返回的结果必然是有序的,而且越相关的文档排的越靠前越好,于是有了AP的概念。对一个有序的列表,计算AP的时候要先求出每个位置上的precision,然后对所有的位置的precision再做个average。如果该位置的文档是不相关的则该位置 precision=0。

  • the success rate of hash lookup

4. Conclusions

KSH算法具有以下三个优点:

  • 利用核函数解决了原始数据不可分的问题;
  • 设计了一个基于coder inner products的目标函数,易于优化;
  • 利用贪心算法逐比特位得求解方法。

Supervised Hashing with Kernels, KSH的更多相关文章

  1. 【Paper Reading】Deep Supervised Hashing for fast Image Retrieval

    what has been done: This paper proposed a novel Deep Supervised Hashing method to learn a compact si ...

  2. 局部敏感哈希-Locality Sensitive Hashing

    局部敏感哈希 转载请注明http://blog.csdn.net/stdcoutzyx/article/details/44456679 在检索技术中,索引一直须要研究的核心技术.当下,索引技术主要分 ...

  3. 哈希学习(2)—— Hashing图像检索资源

    CVPR14 图像检索papers——图像检索 1.  Triangulation embedding and democratic aggregation for imagesearch (Oral ...

  4. Hashing图像检索源码及数据库总结

    下面的这份哈希算法小结来源于本周的周报,原本并没有打算要贴出来的,不过,考虑到这些资源属于关注利用哈希算法进行大规模图像搜索的各位看官应该很有用,所以好东西本小子就不私藏了.本资源汇总最主要的收录原则 ...

  5. 【Deep Hash】CNNH

    [AAAI 2014] Supervised Hashing via Image Representation Learning [paper] [code] Rongkai Xia , Yan Pa ...

  6. 2016CVPR论文集

    http://www.cv-foundation.org/openaccess/CVPR2016.py ORAL SESSION Image Captioning and Question Answe ...

  7. CVPR2016 Paper list

    CVPR2016 Paper list ORAL SESSIONImage Captioning and Question Answering Monday, June 27th, 9:00AM - ...

  8. CVPR 2017 Paper list

    CVPR2017 paper list Machine Learning 1 Spotlight 1-1A Exclusivity-Consistency Regularized Multi-View ...

  9. CVPR14 图像检索papers

    CVPR14年关于图像检索方面的papers,汇总成一个list,方便阅读. 图像检索 Triangulation embedding and democratic aggregation for i ...

随机推荐

  1. linux 的常用命令---------第九阶段

    Centos 7 系统启动及相关配置文件(面试题) 1. BIOS 初始化,开始post开机自检(主要检查磁盘.cpu.内存) 2. 加载 MBR 到内存 3. GRUB 阶段(可不说) 4. 加载内 ...

  2. Postman-自动化传参

    一,自动化传参 在实现接口自动测试的时候,会经常遇到接口参数依赖的问题,例如调取登录接口的时候,需要先获取登录的key值,而每次请求返回的key值又是不一样的,那么这种情况下,要实现接口的自动化,就要 ...

  3. shiro实战系列(一)之入门实战

    一.什么是shiro? Apache Shiro 是一个强大而灵活的开源安全框架,它干净利落地处理身份认证,授权,企业会话管理和加密.   Apache Shiro 的首要目标是易于使用和理解.安全有 ...

  4. VMware安装VMware tool是 遇到The path "" is not a valid path to the 3.10.0-693.el7.x86_64 kernel headers.

    The path "" is not a valid path to the 3.10.0-693.el7.x86_64 kernel headers.问题是找不到内核头文件,需要 ...

  5. haproxy [WARNING] 312/111530 (17395) : config : 'option forwardfor' ignored for frontend 'harbor_login' as it requires HTTP mode.

    1.经过调查, 2down voteaccepted x-forwarded-for is an HTTP header field, so has nothing to do with the tr ...

  6. day06--元组、字典、集合与关系运算

    今日内容: 1.元组 2.字典 3.集合与关系运算 元组: 用途:记录多个值,当多个值没有改的需求,此时用元组更适合. 定义方式:在()内用逗号分隔开多个任意类型的值. 变量名=tuple('') 切 ...

  7. jquery ajax error函数和及其参数详细说明(转载)

    使用jquery的ajax方法向服务器发送请求的时候,常常需要使用到error函数进行错误信息的处理,本文详细的说明了ajax中error函数和函数中各个参数的用法.一般error函数返回的参数有三个 ...

  8. OutputFormat输出过程的学习

    花了大约1周的时间,最终把MapReduce的5大阶段的源代码学习结束掉了.收获不少.就算本人对Hadoop学习的一个里程碑式的纪念吧.今天花了一点点的时间,把MapReduce的最后一个阶段.输出O ...

  9. 2017-2018-2 20155224『网络对抗技术』Exp7:网络欺诈防范

    基础问题回答 问:通常在什么场景下容易受到DNS spoof攻击? 同一局域网下,以及各种公共网络. 问:在日常生活工作中如何防范以上两攻击方法? 答:DNS欺骗攻击是很难防御的,因为这种攻击大多数本 ...

  10. springmvc接收json注意事项

            在以前使用SpringMvc框架时,在接受json数据时碰到了一些奇怪的问题.这里记录下来,方便以后查阅. 1. data 里写json对象 , 即该json数据没有被单(双)引号包住 ...