AI・機械学習
中級

バイナリ量子化(バイナリリョウシカ)

バイナリ量子化(Binary Quantization)は、埋め込みベクトルの各次元を1ビット(0または1)で表現する最も極端な量子化手法である。float32比で32倍の圧縮を実現し、ハミング距離によるビット演算で超高速な近似検索が可能になる。

0 回閲覧
0 いいね

バイナリ量子化(Binary Quantization, BQ)は、ベクトルの各次元の値を閾値(通常0)で二値化し、1ビットで表現する量子化手法である。float32(32ビット)→ 1ビットへの変換により、理論上32倍のメモリ圧縮を実現する。さらに、バイナリベクトル間の距離計算をハミング距離(XOR + popcount)で行えるため、SIMD命令による超高速検索が可能となる。

動作原理

バイナリ量子化の手順は極めてシンプル:

  1. 閾値の決定: 通常は0を閾値とする(L2正規化済みベクトルの場合)
  2. 二値化: 各次元 d について、x_d >= 0 なら 1、x_d < 0 なら 0
  3. ビットパッキング: 連続する次元をビット列にパック(768次元 = 96バイト = 12個のuint64)
  4. 距離計算: ハミング距離 = XOR(a, b) の popcount(1のビット数)

ハミング距離はXOR演算とpopcountの2命令で計算でき、CPUのAVX2/AVX-512命令セットでは512ビット(=512次元分)を1サイクルで処理可能。float32のドット積と比較して10-40倍の演算スループットを実現する。

メモリ削減効果

規模float32int8 (SQ)binary (BQ)
1M × 768次元3.07 GB0.77 GB96 MB
10M × 768次元30.7 GB7.7 GB960 MB
100M × 768次元307 GB77 GB9.6 GB
1M × 1536次元6.14 GB1.54 GB192 MB
1M × 3072次元12.3 GB3.07 GB384 MB

100万ベクトル×768次元がわずか96MBに収まるため、一般的なPCのRAMでも億単位のベクトルを保持できる計算になる。

精度と次元数の関係

バイナリ量子化の精度は次元数に強く依存する:

次元数Recall@10(BQのみ)Recall@10(BQ + Rescore)実用性
1280.55-0.650.75-0.85非実用的
3840.70-0.800.88-0.93限定的
7680.82-0.880.94-0.97実用的
10240.85-0.920.96-0.99推奨
15360.88-0.940.97-0.99最適
30720.90-0.960.98-1.00最適

768次元以上でBQ単体のRecall@10が80%を超え、リスコアリング併用で95%以上に達するため実用的となる。384次元以下では精度劣化が大きく、スカラー量子化(int8)の使用を推奨。

オーバーサンプリングとリスコアリング

バイナリ量子化の精度を回復する標準手法:

  1. オーバーサンプリング: 最終的に必要な件数(k)の数倍(通常3-5倍)の候補をBQで高速検索
  2. リスコアリング: 候補を元のfloat32ベクトルで正確に再スコアリングし、上位k件を返却

例: k=10の場合、BQで上位50件を検索(3ms)→ 50件をfloat32で再スコアリング(1ms)→ 上位10件返却。合計4msでRecall@10が0.97以上に回復する。

Qdrantでの設定例:

quantization_config:
  binary:
    always_ram: true
search_params:
  quantization:
    rescore: true
    oversampling: 3.0

Weaviateでの実装

Weaviate v1.22+ではBQを「BQ+HNSW」として提供。HNSWグラフ構造のエッジ走査時にバイナリ距離を使用し、最終的にfloat32でリスコアリングする。flat(総当たり)インデックスと組み合わせたBQ+Flatも選択可能で、少量データでの最小メモリ構成に適する。

自作PCでのBQ活用

ローカルLLM環境でBQが特に有効なシナリオ:

  • RAGインデックスのRAM配置: 100万ドキュメントのBQベクトル(768次元)が96MBでRAMに収まり、LLM推論用のVRAM/RAMを圧迫しない
  • CPUベクトル検索: AVX2対応CPU(Ryzen 5000以降/Intel 10世代以降)でBQハミング距離演算を高速実行。GPU不要でms単位の検索が可能
  • M.2 SSD活用: BQインデックスをNVMeに配置しても、96MBなら起動時に全量RAMロード可能
  • 多言語RAG: 日英中のドキュメントを混在させても、BQならメモリ制約内で大規模コーパスを保持

よくある質問(FAQ)

Q1: バイナリ量子化で32倍圧縮すると検索品質は大丈夫? A: 単体では5-15%のRecall低下があるが、オーバーサンプリング(3-5倍)+float32リスコアリングでRecall@10を95%以上に回復可能。1024次元以上のモデルなら実用上問題ない精度を維持できる。

Q2: どのEmbeddingモデルがBQに適している? A: 高次元(768次元以上)で学習されたモデルが適する。OpenAI text-embedding-3-large(3072次元)、Cohere embed-v4(1024次元)、BGE-M3(1024次元)は特にBQとの相性が良い。sentence-transformers/all-MiniLM-L6-v2(384次元)はBQには不向き。

Q3: バイナリ量子化とLSH(Locality-Sensitive Hashing)の違いは? A: LSHはランダム射影で複数のハッシュ関数を適用し、バケットベースの近似検索を行う。BQは単純な閾値二値化でベクトル全体を1ビット表現に圧縮する。BQの方が実装が簡潔で、近年のベクトルDBではBQ+HNSWの組み合わせがLSHを置き換えている。

まとめ

  • バイナリ量子化は各次元を1ビットに圧縮し、32倍のメモリ削減を実現
  • ハミング距離(XOR+popcount)による超高速検索が最大の利点
  • 768次元以上で実用的、1024次元以上が推奨
  • オーバーサンプリング+リスコアリングで精度をRecall@10 95%以上に回復
  • ローカルRAGでのメモリ制約解消に特に有効