HNSW_PQ

HNSW_PQは、HNSW(Hierarchical Navigable Small World)グラフとPQ(Product Quantization)を活用し、サイズと精度のトレードオフを制御可能な高度なベクトルインデックス作成手法を実現する。HNSW_SQと比較して、このインデックスタイプは、クエリ処理速度の低下とインデックス構築時間の延長はあるものの、同じ圧縮レベルでより高い想起率を実現している。

概要

HNSW_PQは2つのインデックス作成技術を組み合わせたものである:HNSWはグラフベースの高速ナビゲーションを、PQは効率的なベクトル圧縮を実現する。

HNSW

HNSWは、各ノードがデータセット中のベクトルに対応する多層グラフを構築する。このグラフでは、ノードは類似性に基づいて接続され、データ空間を高速にトラバースできる。階層構造により、検索アルゴリズムは近傍候補を絞り込むことができ、高次元空間での検索プロセスが大幅に高速化される。

詳細はHNSWを参照。

PQ

PQはベクトル圧縮技術で、高次元ベクトルをより小さなサブベクトルに分解し、それを量子化して圧縮します。この圧縮により、メモリ要件が劇的に削減され、距離計算が高速化される。

詳細はIVF_PQを参照。

HNSW + PQ

HNSW_PQはHNSWとPQの長所を組み合わせ,効率的な近似最近傍探索を可能にする.PQを用いてデータを圧縮し(これによりメモリ使用量を削減する)、圧縮されたベクトル上にHNSWグラフを構築することで、候補の迅速な検索を可能にする。検索中、アルゴリズムは精度を向上させるために、オプションでより精度の高いデータを使用して候補結果を絞り込むことができます。以下はそのプロセスです:

  1. データ圧縮:PQは各ベクトルを複数のサブ・ベクトルに分割し、m (サブ・ベクトル数)やnbits (サブ・ベクトルあたりのビット数)などのパラメータで制御されたセントロイドのコードブックを使用して量子化する。

  2. グラフの構築:圧縮されたベクトルは、HNSWグラフの構築に使用される。ベクターは圧縮された形で保存されるため、結果として得られるグラフは一般的に小さくなり、必要なメモリ量も少なく、より高速に走査できるようになる。

  3. 候補の検索:クエリが実行されると、アルゴリズムはHNSWグラフの圧縮データを使用して、候補となる隣接候補のプールを効率的に特定する。このグラフベースの検索により、考慮すべきベクトル数が大幅に削減され、総当たり検索に比べてクエリの待ち時間が改善される。

  4. (オプション)結果の絞り込み:最初の候補結果は、以下のパラメータに基づいて、より精度の高いものに改良することができます:

    • refine:この絞り込みステップを有効にするかどうかを制御します。true に設定すると、システムはより高精度または非圧縮の表現を使用して距離を再計算します。

    • refine_type:精密化時に使用するデータの精度レベルを指定します(SQ6、SQ8、BF16 など)。FP32 のような高精度の選択は、より正確な結果をもたらしますが、より多くのメモリを必要とします。これは、元の圧縮データセットの精度をsq_type だけ上回る必要があります。

    • refine_k:倍率として機能する。例えば、トップkが100でrefine_k が2の場合、システムはトップ200の候補を再ランク付けし、ベスト100を返し、全体的な精度を向上させる。

パラメータの完全なリストと有効な値については、Index params を参照してください。

インデックスの構築

MilvusでベクトルフィールドにHNSW_PQ インデックスを構築するには、add_index() メソッドを使用し、index_typemetric_type 、インデックス用の追加パラメータを指定します。

from pymilvus import MilvusClient

# Prepare index building params
index_params = MilvusClient.prepare_index_params()

index_params.add_index(
    field_name="your_vector_field_name", # Name of the vector field to be indexed
    index_type="HNSW_PQ", # Type of the index to create
    index_name="vector_index", # Name of the index to create
    metric_type="L2", # Metric type used to measure similarity
    params={
        "M": 30, # Maximum number of neighbors each node can connect to in the graph
        "efConstruction": 360, # Number of candidate neighbors considered for connection during index construction
        "m": 384, 
        "nbits": 8,
        "refine": true, # Whether to enable the refinement step
        "refine_type": "SQ8" # Precision level of data used for refinement
    } # Index building params
)

この設定では

  • index_type:構築するインデックスのタイプ。この例ではHNSW_PQ とします。

  • metric_type:ベクトル間の距離の計算方法。サポートされている値には、COSINEL2IP があります。詳細については、メトリック・タイプを参照してください。

  • params:インデックスを構築するための追加設定オプション。詳細は「インデックス構築パラメータ」を参照。

インデックス・パラメータを構成したら、create_index() メソッドを直接使用するか、create_collection メソッドでインデックス・パラメータを渡してインデックスを作成できます。詳細は、コレクションの作成 を参照してください。

インデックスでの検索

インデックスが構築され、エンティティが挿入されると、インデックス上で類似検索を実行できます。

search_params = {
    "params": {
        "ef": 10, # Parameter controlling query time/accuracy trade-off
        "refine_k": 1 # The magnification factor
    }
}

res = MilvusClient.search(
    collection_name="your_collection_name", # Collection name
    anns_field="vector_field",  # Vector field name
    data=[[0.1, 0.2, 0.3, 0.4, 0.5]],  # Query vector
    limit=3,  # TopK results to return
    search_params=search_params
)

この構成では

インデックスパラメータ

このセクションでは、インデックスを構築し、インデックス上で検索を実行するために使用されるパラメータの概要を説明します。

インデックス構築パラメータ

以下の表に、paramsインデックスを構築する際に設定できるパラメータを列挙します。

パラメータ

説明

値の範囲

チューニングの提案

HNSW

M

各ノードがグラフ内で持つことのできる接続(またはエッジ)の最大数。 このパラメータはインデックスの構築と検索の両方に直接影響する。

:整数[2, 2048]

デフォルト値:30 (ノードあたり最大 30 の送信エッジと 30 の受信エッジ)

M を大きくすると、一般的に精度が高くなるが、メモリ・オーバーヘッドが増加し、インデックス構築と検索の両方が遅くなる。 次元性の高いデータセットや、高い再現性が重要な場合は、M を大きくすることを検討する。

メモリ使用量と検索速度が最大の関心事である場合は、M を減らすことを検討する。

ほとんどの場合、この範囲内の値を設定することを推奨する:[5, 100].

efConstruction

インデックス構築時に接続を考慮する近隣候補の数。 より多くの候補が新しい要素ごとに評価されますが、 実際に確立される接続の最大数はM によって制限されます。

:整数[1,int_max] です。

デフォルト値360

より多くの接続候補が探索されるため、efConstruction を大きくすると、通常より正確なインデックスが得られる。しかし、これはインデックス作成時間の延長と、作成中のメモリ使用量の増加にもつながります。 特にインデックス作成時間がそれほど重要でないシナリオでは、精度を向上させるためにefConstruction を増加させることを検討してください。

リ ソ ース制約が懸念 さ れ る 場合には、efConstruction を減らして イ ンデ ッ ク ス作成を高速化す る こ と を検討 し て く だ さ い。

ほとんどの場合、この範囲内の値を設定することを推奨します:[50, 500].

PQ

m

量子化処理中に各高次元ベクトルを分割する(量子化に使用する)サブベクトルの数。

タイプ:整数[1, 65536]

デフォルト値:なし

m の値を大きくすると精度が向上するが、計算の複雑さとメモリ使用量も増加する。m は、適切な分解を保証するために、ベクトル次元(D)の約数でなければならない。一般的に推奨される値はm = D/2 です。

ほとんどの場合、この範囲内の値を設定することをお勧めします:[D/8, D]。

nbits

各サブベクトルの重心インデックスを圧縮形式で表現するためのビット数。各コードブックは2nビットのセントロイドを含む。例えば、nbits が 8 に設定された場合、各サブベクトルは 8 ビットのセントロイドのインデックスで表現される。これにより、そのサブベクタのコードブックには28個(256個)のセントロイドの可能性がある。

タイプ整数[1, 24]

デフォルト値8

nbits の値を大きくすると、コードブックが大きくなり、元のベクトルをより正確に表現できる可能性がある。ほとんどの場合、この範囲内の値を設定することを推奨します:[1, 16].

refine

検索時に絞り込みステップを適用するかどうかを制御するブーリアン・フラグ。refinementは、クエリベクタと候補の間の正確な距離を計算することにより、最初の結果を再ランク付けすることを含む。

タイプ:ブール値の範囲:[true,false]。

デフォルト値false

高精度が必須で、検索時間が多少遅くても許容できる場合は、true に設定する。スピードを優先し、精度の多少の妥協が許容できる場合はfalse を使用します。

refine_type

精緻化処理で使用するデータの精度を決定します。 この精度は、圧縮されたベクトル(mnbits パラメータで設定)の精度よりも高くなければなりません。

:StringRange:[ SQ6, SQ8, BF16, FP16, FP32 ]。

デフォルト値:なし

より高いメモリコストで最大の精度を得るにはFP32 を使用し、より良い圧縮を得るにはSQ6/SQ8 を使用する。BF16FP16 は、バランスの取れた代替案を提供する。

インデックス固有の検索パラメータ

次の表は、インデックスを検索する際にsearch_params.params で設定可能なパラメータの一覧です。

パラメータ

説明

値の範囲

チューニングの提案

HNSW

ef

最近傍検索時の検索の幅を制御します。どれだけのノードが最近傍候補として訪問され、評価されるかを決定します。 このパラメータは検索プロセスのみに影響し、グラフの最下層にのみ適用される。

タイプ整数Range:[1,int_max]

デフォルト値:limit(TopK nearest neighbors to return)

ef を大きくすると、より多くの近傍候補が考慮されるため、一般的に検索精度が高くなる。しかし、これはまた検索時間を増加させます。 高い想起を達成することが重要であり、検索速度があまり気にならない場合は、ef を増加させることを検討してください。

特に精度が多少低下しても構わないようなシナリオでは、ef を減らして、より高速な検索を優先させることを検討してください。

ほとんどの場合、この範囲内の値を設定することをお勧めします:[K, 10K]。

PQ

refine_k

要求された上位K個の結果に対して、絞り込み(再ランク付け)段階でどれだけの余分な候補を調べるかを制御する倍率。

タイプ:Float範囲:[1,float_max)

デフォルト値: 1

refine_k の値を高くすると、再現率と精度が向上するが、検索時間とリソースの使用量も増加する。1の値は、絞り込み処理が最初の上位K個の結果のみを考慮することを意味する。

Try Managed Milvus for Free

Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.

Get Started
フィードバック

このページは役に立ちましたか ?