1. 引入
有很多指标可以用来衡量向量的相似度,比如余弦距离、汉明距离、欧氏距离等。
在图像、视频、文本、音频领域,做向量的相似性搜索,有很多应用点,比如:图像识别,语音识别、垃圾邮件过滤。
这种基于相似度检索的方案,不同于机器学习模型的方案。比如用有监督学习模型来做人脸识别,模型的可解释性较低,而基于相似度搜索来做人脸识别,可解释性就更高。
但是,当数据量很大,比如几千万张图片,要做相似度搜索,就比较困难了。穷举法固然可行,但非常耗时。针对这种场景,本文主要介绍方案级别的信息。
2. 常用方案
通用的向量相似度检索方法,主要是如下几种
- 穷举搜索
该方案是O(n)的时间复杂度,只适用于数据量较少的情况。
- 基于MySQL的搜索
通过巧妙构造数据库表结构来实现。比如将向量拆分为N段,根据鸽巢原理,相似度为M(M<N)的向量,一定有N-M段值是完全相同的,这就可以用SQL的多段OR在一起来查询。
- KD-Tree
构建一颗树,与BST非常类似,能用来做二分查找,时间复杂度为O(logN)
- ES
ElasticSearch在7.x版本之后,集成了向量搜索的功能。
- 向量搜索引擎
Facebook等公司开发了专门针对向量做相似度搜索的引擎,有的还可以支持GPU,分布式部署。
3. 向量检索算法
目前大部分向量搜索引擎用的都是hnsw算法,Google在2019年8月提出了一个新的算法,叫ScaNN (Scalable Nearest Neighbors) ,从他们的测试数据(https://github.com/google-research/google-research/tree/master/scann)中可以看出,ScaNN可以吊打其他所有算法。从这个链接中也能看到几乎所有的向量检索算法。
4. 向量检索引擎
向量相似度搜索引擎内部集成了多种算法,多种索引,能根据不同类型的数据和不同类似的搜索要求来动态选择搜索策略,做到更好的搜索效率,是一个比较好的选择。目前常见的向量搜索引擎如下
- faiss
- 开发者:Facebook
- 是否开源:开源
- 链接:https://github.com/facebookresearch/faiss
- 优点:
- 比较成熟,相关资料多,github上星很高
- 支持CPU和GPU加速
- milvus
- 开发者:Zilla(国产软件,上海公司)
- 是否开源:开源
- 链接:https://github.com/milvus-io/milvus
- 优点:
- 资料多,已经加入linux基金项目,技术社区维护的比较好,也有自己的博客更新及时
- 支持GPU加速
- 国内阿里、小米等很多大公司都在使用
- SPTAG
- 开发者:Microsoft
- 是否开源:开源
- 链接:https://github.com/microsoft/SPTAG
- 优点:对比下来其他引擎,发现SPTAG有没优势
- annoy
- 一个库,不支持GPU之类的加速和其他复杂应用
- Zsearch
- 开发者:蚂蚁金服
- 是否开源:不开源
- 介绍链接:https://segmentfault.com/a/1190000021334725
- vearch
- 开发者:京东
- 是否开源:开源
- 链接:https://www.infoq.cn/article/gxYOJ0m5rpMpIEwvz9GR
- 优点:在 faiss 的基础上研发了 vearch,提供了类似 ES的灵活易用的API
- ESKNN
- 开发者:AMAZON
- 是否开源:开源
- 链接:https://github.com/opendistro-for-elasticsearch/k-NN
- 优点:AMAZON直接在ES基础上的修改,有看到说使用起来比较耗内存的说法
5. 性能数据
本文查找了上面提到的一些向量搜索引擎的性能数据,总结如下表:
Engine | Performance | Data Size | Vector Size | Link |
---|---|---|---|---|
ES | 0.6s | 1,000,000 | 128 | https://github.com/jobergum/dense-vector-ranking-performance |
ES-aliyun | 0.09s | 20,000,000 | 128 | https://developer.aliyun.com/article/738155 |
milvus | 27ms | 1,000,000,000 | 128 | https://github.com/milvus-io/milvus/blob/master/docs/test_report/milvus_ivfsq8_test_report_detailed_version.md |
SPTAG | not good | N/A | N/A | https://github.com/microsoft/SPTAG/issues/80 |
https://github.com/microsoft/SPTAG/issues/76 |
可以看到,对比下来,发现milvus性能很不错。
6. milvus介绍
- 如何安装(用docker,很方便就能配置起来)
- https://milvus.io/cn/docs/install_milvus.md
- python SDK及其用法(经实测,效率确实不错)
- https://github.com/milvus-io/pymilvus
- 图形界面(经实测,安装配置使用也方便)
- https://milvus.io/cn/gui/