NLP(三十二):大規模向量相似度檢索方案


一、引入

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/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM