Thinking in Reverse.

Spreading Vectors for Similarity Search是小白菜崇拜的Matthijs Douze和Herve Jegou的作品,发表于ICLR 2019,是一篇对思维方法非常有启发作用的paper,可能会成为利用DNN构建索引方面的经典。这样一篇因为思维的光辉而动人的paper,小白菜很乐意成为它的布道者,并希望借自己的绵薄之力,去传播、应用和改进。

主要思想

Spreading Vectors是逆向思维的一种产物。在我们设计量化器的时候,通常是将量化器适配到待量化数据(分布)上,而很少或者说没有考虑过逆向设计的可能性,即将数据(分布)适配到预先设定的满足某种分布的量化器上。这种正向思维的方式,产生了很多经典的向量索引方法,比如PQ及其变种、ITQ等,但近些年来,除了基于图ANN创造了像HNSW这样非常work的方法外,矢量量化方法给小白菜的感觉是止步不前,没有很出彩很work的工作,大部分工作都停留于修修补补,或者说虽然有一些表现还不错,但很难推广应用的方法。其中缘由,小白菜以为,思维的困局是其中很重要一个原因。技术相对比较容易实现,但思维的困局,往往很难打开。Spreading Vectors思维的光辉正体现在这里,它采用逆向思维的方式,对数据分布重新进行调整,将其投影到均匀分布的空间,然后采用sign()sign()二值量化器或格子量化器进行量化,从而完成索引的构建。

在对数据分布重新进行调整,有两个基本要求:

  • 近邻关系尽可能得到保持,不能破坏数据在原始空间中的近邻关系。
  • 数据经过映射后,数据类内部尽可能呈现均匀分布(展开状态,这也是得到的vector具有spreading属性的含义),以便尽可能增大格子量化器对空间的利用率。

关于用DNN做索引结构的想法,Jeff Dean在2017年第一次用DNN尝试优化数据库索引,并发表了The case for learned index structures,但那是面向key-value的低层数据结构优化。Spreading Vectors受Jeff Dean一维数据索引的启发,将使用DNN构建索引结构的想法,拓展到向量索引上。

方法框架

Spreading Vectors索引构建过程,包含两个部分,分别为:catalyzer和discretization,如下图所示:

对应的作用为:

  • catalyzer完成原始vector到Spreading Vectors的映射,是一个3层的感知器。该3层的DNN实现数据的近邻结构保持与均匀张开,数据的张开程度,由差分熵正则项前的参数λλ控制。
  • discretization完成Spreading Vectors的量化,可以是sign()sign()或者格子量化器,完成最终数据的量化。

具体方法

从原始vector到Spreading Vectors,数据在重新映射过程中需要保持的两个基本要求,3层DNN优化的目标函数为:

loss=lossrank+λlossKoLeoloss=lossrank+λlossKoLeo

其中lossranklossrank用于保持数据在投影过程中的原始近邻关系(原始流形结构),lossKoLeolossKoLeo,即差分熵,用于张开数据,使数据尽可能均匀分布在整个空间,从而加大格子量化器对空间的利用效率。我们先抛却lossranklossrank和lossKoLeolossKoLeo的具体表示形式,观察不同的差分熵正则项参数lambda对分数分布的影响,如下图示:

上图,格子量化器以六边形示意,可以看到当λλ为0的时候,即用于张开数据的差分熵正则项完全不起作用,经过3层DNN后,数据邻近之间的关系变得更加紧致,这对于量化而言,可并不是一件好事,因为数据变得更加紧致,会导致格子量化器的利用效率变得非常低,因为有很多格子量化器,里面没有包含任何数据,这就意味着,那些包含了数据的格子量化器,需要容纳更多的数据。这样导致的问题是,容纳在同一个格子量化器的这么多的数据,我们没法再做区分了,从而导致格子量化器的利用效率非常低下。

举个更加直观的例子,比如一间客栈,有10间房子,需要容纳10个人,并且还需要很快的定位到张三在某个房间,我们有很多种分配方式,其中两种分配方式:

  • 一人一间房子;
  • 有些房子有多个人,某些房子是空着的;

当我们需要寻找张三的时候,第一种方式显然最快,房间号对应一下即可;但是第二种方式,在我们知道是某间房子后,由于里面存在多人,我们还是没法区分出谁是张三。这就是说,在空间利用率上,第一种方式显示是最优的,它区分数据的粒度更细。这正如PQ和哈希方法,PQ相比哈希,排序的粒度更细一样。

同时从上图我们也可以看到,当λλ区域无穷大时,也就是差分熵占据主导地位的时候,数据之间的近邻关系完全被破坏,呈现出一种完全均匀分布的状态,这显然不是我们希望看到的。因而,λλ参数的选取至关重要。下图是Deep 1M数据集经过catalyzer降到8维后,随机选取其中的两维的侧视图:

左边是λ=0λ=0,中间是λ=0.02λ=0.02,右边是λ=1.0λ=1.0,相比于λ=0λ=0,λλ为0.02或1.0的时候,数据分布得均匀。另外作者还从rank@1和rank@100的距离分布,来进一步可视化验证catalyzer确实起到了很好的作用。

lossKoLeolossKoLeo的具体表达形式,可以细看论文推导,我们重点一下lossranklossrank以及训练过程。

训练过程

lossranklossrank作者采用的是典型的triplet loss,因而整个过程的训练,涉及到三元组怎么训练的问题。回到前面强调过的,Spreading Vectors对数据分布重新进行调整的时候,有两个基本的要求,即原始空间近邻关系尽可能得到保持,因而对于每一个样本xixi,作者将原始空间中的top@kpostop@kpos的最近邻,作为该数据点(anchor)的正样本(正样本不再更新),catalyzer的输出f(xi)f(xi)的top@knegtop@kneg作为负样本,负样本的更新在每跑完一个epoch后重新计算,然后更新。

超参影响

涉及到的超参主要是lambdalambda、kposkpos、knegkneg以及f(xi)f(xi)输出的维度doutdout,作者发现,kposkpos和knegkneg,对结果的影响不是很大,文中作者将其kposkpos设置为10,knegkneg设置为50。对于固定的编码位,doutdout主要影响特征表达的好坏与压缩编码的难以程度。在训练的过程中,这些参数的设置,可以参考论文中得出的经验。

实验结果

跟PQ、OPQ相比,有了比较大的提升,编码的时间,跟OPQ相比,并没有显著的耗时增加,主要是设计的catalyzer是一个3层的DNN轻量级网络。在二值量化上,召回率相比ITQ也有了较好的提升。

Spreading Vectors一个非常好的特征是,由于catalyzer是一个特征学习器,所以可以将Spreading Vectors作为特征的预处理过程,加到不同索引方法的前级,来boost索引的召回。

启发

Spreading Vectors是DNN网络学习的产物,并结合量子量化器等量化方式,为采用神经网络构建索引,打开了新的思路,后面应该会有很多在这个基础上不断改进、拓展的方法出现。其逆向思维、lossKoLeolossKoLeo、格子量化、以及如何使用无监督的方式构造非常吻合数据映射要求的方法,都值得喝彩。

图像检索:Spreading Vectors for Similarity Search相关推荐

  1. 图像视频检索: faiss: Billion-scale similarity search with GPUs

    faiss: Billion-scale similarity search with GPUs  paper https://arxiv.org/abs/1702.08734 github  htt ...

  2. Python:实现similarity search相似性搜索算法(附完整源码)

    Python:实现similarity search相似性搜索算法 from __future__ import annotationsimport mathimport numpy as npdef ...

  3. DeltaPQ: Lossless Product Quantization Code Compression for High Dimensional Similarity Search

    DeltaPQ: Lossless Product Quantization Code Compression for High Dimensional Similarity Search 高维数据无 ...

  4. Fast Adaptive Similarity Search through Variance-Aware Quantization (ICDE 2022)

    随着高维数据的爆炸性增长,最近邻搜索中出现了很有前途的近似方法.其中,量化方法因其快速的查询响应和较低的编码和存储成本而受到关注.量化方法将数据维度分解为不重叠的子空间,并对每个子空间使用不同的字典进 ...

  5. 机器学习笔记 - Facebook AI Similarity Search(Faiss)简介

    一.概述 Facebook AI Similarity Search (Faiss)是高效相似性搜索最受欢迎的轮子之一.给定一组向量,我们可以使用 Faiss 对它们进行索引--然后使用另一个向量(查 ...

  6. 图像检索:再叙ANN Search

    每逢碰到这个ANN的简称,小白菜总是想到Artificial Neural Network人工神经网络,不过这里要展开的ANN并不是Artificial Neural Network,而是已被小白菜之 ...

  7. 《Fast Phonetic Similarity Search over Large Repositories》——大型存储库中的快速语音相似性搜索

    介绍一篇关于当存在拼写错误的字符串如何进行相似性搜索的论文,该论文结合字符串相似性和语音相似性可在大型存储库中进行快速的相似性搜索. 论文连接 一.介绍 背景:字符串相似性算法可以处理字符串拼写错误的 ...

  8. MSQ-Index: A Succinct Index for Fast Graph Similarity Search

    文章链接

  9. 【ICLR2019】Poster 论文汇总

    ICLR2019 Poster 文章汇总, 共478 papers Convolutional Neural Networks on Non-uniform Geometrical Signals U ...

最新文章

  1. 实战1--应用EL表达式访问JavaBean的属性
  2. 开启apache的server-status辅助分析工具
  3. mysql8.0.23下载安装详细教程
  4. python3 爬虫第二步Selenium 使用简单的方式抓取复杂的页面信息
  5. libsvm java下载_一个基于LIBSVM(JAVA)的股票预测demo
  6. python pymysql使用连接池连接mysql示例
  7. siteminder sso agent 初探
  8. WPF教程尝试(修正部分格式)
  9. 单独编译使用WebRTC的音频处理模块 - android
  10. php配置mysql集群_【mysql集群】mysql集群配置
  11. 构图之法——9条构图小贴士
  12. 真正的技术大牛,可能根本不写代码
  13. 工作总结之因为笛卡尔积问题写SQL搞了半天[害](附笛卡尔积总结)
  14. 计算机三角符号,word标尺倒三角 word倒三角符号
  15. 网站被移动运营方屏蔽怎么办?
  16. win10应用程序模糊处理
  17. (附源码)Python音乐分类系统 毕业设计 250858
  18. ibm tivoli_在Tivoli Access Manager环境中管理TDS 6.0代理服务器并进行故障排除
  19. 条信息流oCPC调研报告
  20. 给米钱包、买买分收取用户15%-20%“砍头息”,泸州银行为资金方

热门文章

  1. JS数组取交集、并集
  2. 程序员学Python编程或许不知的十大提升工具
  3. 首次实战安卓App《第一行代码》欧酷天气遇到的一些问题总结
  4. 服务器系统survey,GitHub - zhanwen/survey: iWen问卷调查系统
  5. 企业邮箱如何购买,公司企业邮箱在哪申请?
  6. Codeforces Round #501 (Div. 3) F(动态规划)
  7. 自动续费PHP,Hostwinds 续费教程:管理取消支付宝、PayPal 等付款方式的自动续费...
  8. matlab向量中插入元素
  9. oracle 变更字段名称_oracle怎么修改字段名称?
  10. 移动空调和普通空调有什么区别