1つの記事の概要ベクトル検索

要約: この記事では、ベクトル検索によって解決される問題を目指して、主流のベクトル検索の関連技術を整理し、ベクトル検索の現在の傾向を分析します。

ベクトル検索とは

まず、ベクトルとは何かを理解します。いわゆるベクトルは、n個の数値で構成される配列(バイナリベクトルはnビットで構成されます)であり、n次元ベクトルと呼ばれます。ベクトル検索は、特定の測定方法に従って、特定のベクトルデータセット内のクエリベクトルに類似したK-Nearest Neighbor(KNN)を取得することです。ただし、KNNの計算量が多いため、通常は近似のみに焦点を当てます。最近傍(近似最近傍、ANN)の問題。

ベクトルメトリック

4つの一般的なベクトルメトリックがあります:ユークリッド距離、コサイン、内部積、ハミング距離

さまざまな測定方法がさまざまなシーンに対応します。通常、ユークリッド距離は画像検索に使用され、コサインは顔認識に使用され、内部積は主に推奨に使用され、ハミング距離は通常、ベクトルが小さいため、大規模なビデオ検索シーンに使用されます。

メトリックでは、通常、リコール率(通常は精度と呼ばれます)を使用して、ベクトル取得の効果を評価します。特定のベクトルqについて、リコールされたK個の最近傍セットを取得することにより、データセット上のK個の最近傍はNです。 Mなら

リコールが100%に近いほど、インデックス効果は高くなります。

ベクトル検索によって解決される問題

本質的に、ベクトル検索はその考え方の枠組みと従来の検索方法に違いはありませんが、後でベクトル検索のインデックス構造を説明すると、より深い経験ができます。

1.候補ベクトルのセットを減らします

従来のテキスト検索と同様に、ベクター検索でも、データの全量との一致を回避するために特定のインデックス構造が必要です。従来のテキスト検索では、逆インデックスを使用して無関係なドキュメントを除外しますが、ベクター検索では、ベクターのインデックス構造を使用します。この記事では、無関係なベクトルをバイパスして、関連するベクトルインデックス構造に焦点を当てます。

2.単一ベクトル計算の複雑さを軽減します

従来のテキスト検索では、通常、並べ替えにファンネルモデルを使用します。上位レベルの計算は比較的軽く、下位レベルの計算はより洗練されていますが、フィルタリングが進むにつれて、計算する必要のあるドキュメントの数も徐々に減少します。高次元のベクトルの場合、単一のベクトル計算の量はまだ比較的多く、通常はベクトルが量子化され、ベクトルが近似され、最後に元のベクトルが小さなデータセットでソートされます。

ベクトル検索について説明するために、これら2つの問題に焦点を当てましょう。

ベクトル検索インデックス構造

ベクトルの効率的なインデックス構造を確立することは、ベクトル検索が直面する最大の問題です。開始する前に、ベンチマークプロジェクトを見てみましょう。このプロジェクトでは、複数のパブリックベクトルデータセット内の関連するインデックス構造のリコールパフォーマンスインジケーターを比較して、すばやく実行できるようにします。さまざまなインデックス構造のパフォーマンスを直感的に理解します。

ブルートフォースの計算

ブルートフォースの計算は最も単純ですが最も複雑な方法です。リコールを計算する場合、ブルートフォースの計算結果が答えとしてベンチマークデータになります。顔認識シナリオでは、100%のリコール率が必要になることがよくあります。この場合一般的に直接ブルートフォース計算。

ツリーベースのアプローチ

多くのツリーベースの方法がありますが、より一般的な方法は、従来のバイナリツリーに類似したKDTree、BallTree、およびVPTreeです。ツリー構造は、ツリーを構築するときに左または右に拡張する決定にすぎません。さまざまなベクトルツリーインデックスは、使用する標準に基づいています。意思決定では、KDTree(下の図に示す)がベクトルの分散が最大のディメンションを選択し、中央値を基準として使用します。つまり、スペースをハイパープレーンで分割し、BallTreeがスペースを球面で分割し、VPTreeが最初にコマンドの高さを選択します。 、次に、各ポイントと見晴らしの良いポイントの間の距離を計算し、距離の中央値を基準とします。通常、これらの方法では、三角形の不等式を使用して、検索時に不要な探索を排除します。

ツリーベースの方法には他にも多くの種類がありますが、常に同じであり、特定の基準に従ってベクトル空間を分割するだけです。ただし、分割がどのように行われたとしても、ツリーベースの方法のパフォーマンスはバックトラックの必要性によって決まります。少し劣っています。

ハッシュ方式

ハッシュは誰もが知っていることです。ベクトルをハッシュして検索を高速化することもできます。ここで説明するハッシュは、衝突のない従来のハッシュとは異なるLocality Sensitive Hashing(LSH)を指します。敏感なハッシュは、衝突に依存して隣人を見つけます。

次の2つの条件を満たすハッシュ関数は、(d1、d2、p1、p2)-sensitiveと呼ばれます。

1. d(x、y)<= d1の場合、h(x)= h(y)の確率は少なくともp1です。

2. d(x、y)> = d2の場合、h(x)= h(y)の確率は少なくともp2です。

上記の表現は人間の言葉です:高次元空間の2つのポイントが非常に近い場合は、2つのポイントのハッシュ値を計算するハッシュ関数を設計して、それらのハッシュ値が同じである可能性が高いようにしますはい、2点間の距離が遠い場合、それらのハッシュ値が同じである可能性は非常に低くなります。距離メジャーが異なればハッシュ関数も異なり、すべての距離メジャー(内部積など)が対応するローカルセンシティブハッシュを見つけることができるわけではありません。

逆法に基づく

従来の反転インデックスは、特定の単語を含むドキュメントに基づいており、現在のドキュメントを変更された単語の反転インデックスに入れてインデックス構造を構築します。次に、ベクトルはどのように反転インデックスを構築しますか?クラスタリングにより、ベクトル空間全体がK領域に分割され、各領域が中心点Cに置き換えられます。このように、各ベクトルはすべての中心点と比較され、最も近い中心点に対応する逆行に分類されます。インデックス構造が確立されます

反転行に基づくもう1つのインデックスはBOWです。原理はほぼ同じです。たとえば、画像は数百のローカルフィーチャを抽出し、すべてのフィーチャが最初にクラスター化されて中心点を形成します。これらの中心点は、反転行を確立するための基礎として使用されます。インデックスを作成するときは、画像の各ローカルフィーチャを最も近い中心点に分類し、逆行を確立して、取得中のヒット数に従って結果をフィルタリングします。

グラフベースのアプローチ

上で紹介したインデックス構造は、空間分割に基づく方法として分類できます。各ベクトルは特定の分割領域にのみ属します。これらの方法の最大の問題は、リコールを改善するために、ベクトルの広い領域を調べる必要があることです。計算量が増えていますが、この問題を解決するためのより良い方法はありますか?グラフベースの方法は、この目標をよりよく達成できます。グラフ方法の最も簡単なアイデアは、隣人の隣人も隣人である可能性があるということです。このようにして、最も近い隣人の検索がグラフのトラバーサルに変換されます。その接続性により、ターゲットにすることができます。ベクトルの一部が領域ではなく検査されるため、ベクトルの範囲を大幅に縮小できます。

近年、ベクトル検索の研究でグラフ手法が注目されており、KGraph、NSG、HNSW、NGTなどのグラフインデックス手法が数多く登場していますが、実際、これらのグラフ手法の主な違いは構築プロセスにあり、グラフ手法が異なれば使用方法も異なります。グラフの品質を向上させるために、ただしグラフの取得手順は基本的に同じです。a。エントリポイントを選択します。b。グラフをトラバースします。c。収束します。継続的な実践において、グラフインデックスの品質を判断するためのいくつかの特性を観察し、グラフメソッドの改善の方向に導きます。

1.隣接点はK個の最も近い隣接点に近い

2.隣接点の数をできるだけ少なくします。つまり、アウト度を減らします。

3.グラフの接続性を可能な限り確保し、度数を増やします

グラフ法の原理を紹介する例としてHNSWを取り上げましょう。HNSWを選択する理由は、この方法が理解しやすく、ストリーミングインデックスの作成と更新が簡単であるためです。これは、ベクトルの従来の方法の完全な実施形態です。

HNSWの背後には、実際にはグラフ上のジャンプテーブルのアプリケーションがあります。次の図に示すように、ジャンプテーブルは、シンプルで効率的なインデックス構造として、Redis、LevelDB、およびその他のシステムで広く使用されています。

第1層には大量のデータがあり、上位層はランダムなコイン挿入によって決定されます。投資額が高いほど、確率は低くなります。上位層に投資されたノードの記録があり、検索の高速道路として使用されます。

HNSWの原理も同様です。リンクリストを使用して各レイヤーのノードを接続する従来のジャンプテーブルとは異なり、HNSWは各レイヤーのNSW(Navigable Small World Graph)であり、グラフデータ構造によって編成され、上位ノードもコインの挿入によって決定されます。 1層で、すべて下層グラフに記録されます。上層グラフは下層グラフの縮図と見なすことができます。上から下に向かって検索する場合、検索プロセスは継続的にガイドされ、探索したいベクトル空間に徐々に近づきます。また、HNSWは、合成プロセスにおいて、エッジクリッピングによるグラフの接続性を保証します。ちなみに、グラフ方式に関する多くの論文では、エッジクリッピング方式について、さまざまな方法に関係なく、それぞれ独自の観点から説明しています。説明がいかにクールか、方法はまったく同じですが、視点が異なります。

ベクトル量子化

主流のベクトル検索のインデックス技術は基本的に上に概説されています。調査中のベクトルがインデックス構造によってカットされた後、高次元ベクトルの場合、単一の計算量は依然として非常に大きいです。計算量を減らす方法はありますか? ?定量化は、まさにこの目的の技術に基づいています。いわゆる定量化とは、大きな値の空間を小さな値の範囲に定量化することを指します。簡単な例として、世界には60億人以上の人々がいます。つまり、地球上の人々の表現には60人がいます。人を男性と女性の2つのタイプに定量化できるため、60億を超えるスペースを2つの値の範囲に定量化できます。

一般的に使用される量子化には、通常、PQ(およびその最適化されたOPQ、LOPQ)と2つの値が含まれます。

PQの原理を図に示します。PQのPは製品を意味しますが、なぜ製品が出現するのでしょうか。次の図では、128次元のベクトル空間がPQ処理され、ベクトル空間が4つのセグメントに分割され、各セグメントが256の中心点によって定量化されるため、元の128次元空間は各セグメントの中心点を使用できるようになります。組み合わせ、つまり256 * 256 * 256 * 256の組み合わせを表現する、いわゆる製品です。

バイナリベクトルの場合、最新のCPUは特別な命令を提供するため、ハミング距離の計算は非常に高速です。大規模なベクトル検索では、通常、バイナリベクトルが直接生成されます。バイナリベクトルを生成する一般的な方法には、ITQ(Iterative Quantization)、 DeepHashなどのメソッド。

その他の技術

クラスタリング

ベクトルクラスタリングは主に、古典的なK-means、K-means ++、K-means#、ワンパスK-means、YinYang k-meansなどの一連のK-meansメソッドを指します。実際には、層化も使用しています。大規模な中心点を取得する方法。

内部製品の変換

ハッシュの章の前半で、内部積に対応する局所的に敏感なハッシュ関数を見つける方法がなく、内部積が三角形の不等式を満たさないため、多くのインデックス構造が内部積をメトリックとして直接使用できないことを確認しました。ほとんどの方法が最初です。ベクトルは正規化されてから取得されますが、正規化によってベクトル空間の分布が変換されます。研究者は、数学的な観察を通じて方法を発見しました。次の図に示すように、特定のルール変換を通じて、内部積とユークリッドは負の相関関係にある可能性があります。

ベクトルを変換した後、ユークリッド距離測定法を使用して直接取得できます。

ベクター検索の開発動向

この記事の冒頭で、ベクトル検索の考え方の枠組みは従来の検索と同じであると述べましたが、これまでのところ、ベクトル検索に適用される従来の方法の成果は基本的に使い果たされてきました。過去2年間の開発動向は、さまざまな手法の組み合わせであり、さまざまな手法の利点を吸収することで、より良い性能とより大規模なベクトルを得ることができます。

定量化マップ

ベンチマークから、基本的にグラフ法が優勢な方法が支配的であることがはっきりとわかります。同時に、量子化によって単一のベクトルの計算量を減らすことができることがわかります。したがって、2つを一緒に機能させるのが自然な考えです。定量計算は、グラフトラバーサルプロセスを加速するために使用されます。この方法は、高次元の方法で明らかな利点があり、スピードアップ率は3倍以上に達する可能性があります。

写真+反転

マップのパフォーマンスは優れていますが、欠点も非常に明白です。検索効果を確保するために、マップに保存すると多くのストレージが消費されます。

特に、ベクトル自体が非常に小さいバイナリベクトルでは、これは耐え難い負担です。さらに、グラフの近傍は本質的にランダムであり、ハードウェア処理ベクトルにとっても非常に不利です。逆の方法は正反対です。インデックス構造は基本的にスペースをあまり消費しませんが、スペース分割方法ではリコール率が高くないというデメリットがありますが、暴力的なコンピューティングの観察からインスピレーションを得ています。暴力的なコンピューティングには、スペース分割の観点から2つの視点があります。 :ブルートフォースの計算は、すべてのベクトルを1つにクラスター化することと見なすことができます。ブルートフォースの計算は、N(Nはベクトルデータセットのサイズ)の中心にクラスター化することと見なすこともでき、各中心点はベクトル自体です。これらの2つの方法は、100%再現できますが、1つは中心点の下にベクトルが多すぎるため、もう1つはクラスター内の中心点が多すぎて計算が受け入れられないためです。バランスを見つけることができますか?リコールとパフォーマンスのバランスを改善するための適切な数の中心点はありますか?大規模な中心点を使用してベクトル空間を分割するグラフ+逆配置法と、大規模な中心点を編成するグラフ法が誕生しました。

HuaweiCloudベクトル検索の練習

ベクトル検索のアプリケーションは前例のない繁栄を遂げました。HuaweiCloudSearchService(CSS)は、ベクトル検索機能を外の世界に開放しました。私たちは、高性能と大規模なデータシナリオの両方にソリューションを提供します。

実装では、主にグラフ方式に基づいており、トリミングの最適化、接続の強化、命令の高速化、およびマルチスレッド処理で多くの機能強化を行いました。比較テストでは、リコール率はファイスよりもはるかに高く、高次元データのギャップはさらに明白です。同じリコールの下で、SIFTやGISTなどの公開データセットでのパフォーマンスはファイスの2.3倍です。比較テストでは、同じマシンと同じアルゴリズムを使用します。

総括する:

ベクトル検索によって解決されるべき問題を考慮して、本論文は、主流のベクトル検索の関連技術を分類し、ベクトル検索の現在の傾向を分析する。ベクトル検索の開発プロセスには、まだ含まれていない関連メソッドがたくさんありますが、それらは常に同じです。これらのメソッドは、従来のメソッドの拡張、三角不等式の適用の最適化、または階層メソッドの適用のいずれかです。この記事がベクトル検索のコンテキストを整理するのに役立つことを願っています。

参照:

1.JLベントリー。連想検索に使用される多次元二分探索木。ACMのコミュニケーション、18:509–517,1975

2. PNYianilos。一般的な距離空間での最近傍探索のデータ構造とアルゴリズム。Proc。離散アルゴリズムに関する第4回ACM-SIAMシンポジウムの概要、311〜321ページ、1993年

3.   Liu、T。; Moore、A。&Gray、A。(2006) 効率的な高次元ノンパラメトリック分類のための新しいアルゴリズム。 Journal of Machine LearningResearch。 7:1135〜1158。

4.P.インディクとR.モトワニ。おおよその最近傍:次元の呪いの除去に向けて。STOC、604〜613ページ、テキサス州ダラス、1998年。

5. W.ドン、C。モーゼス、およびK.リー。一般的な類似性測度のための効率的なk最近傍グラフの構築。ワールドワイドウェブ上の第20回国際会議の議事録、577〜586ページ。ACM、2011年。

6.YAマルコフとDAヤシュニン。階層的にナビゲート可能な小さな世界のグラフを使用した、効率的で堅牢な近似最近傍検索。CoRR、abs / 1603.09320、2016年。

7. https://arxiv.org/abs/1707.00143

8. https://yongyuan.name/blog/vector-ann-search.html

9. A.ShrivastavaおよびP.Li。非対称lshの改良されたスキーム。テクニカルレポート、arXiv:1410.5410、2014年。

10. H. Jegou、M。Douze、およびC.Schmid。最近傍探索のための積量子化。パターン分析とマシンインテリジェンスに関するIEEEトランザクション、33(1):117 {128、2011。

11.https://arxiv.org/abs/1810.07355

 

注:この記事のインデックス構造の例は、https://yongyuan.name/blog/vector-ann-search.htmlからのものです。

 

クリックしてフォローし、Huawei Cloudの新しいテクノロジーについて初めて学びましょう〜

おすすめ

転載: blog.csdn.net/devcloud/article/details/108849882