バイナリ量子化(バイナリリョウシカ)
バイナリ量子化(Binary Quantization)は、埋め込みベクトルの各次元を1ビット(0または1)で表現する最も極端な量子化手法である。float32比で32倍の圧縮を実現し、ハミング距離によるビット演算で超高速な近似検索が可能になる。
バイナリ量子化(Binary Quantization, BQ)は、ベクトルの各次元の値を閾値(通常0)で二値化し、1ビットで表現する量子化手法である。float32(32ビット)→ 1ビットへの変換により、理論上32倍のメモリ圧縮を実現する。さらに、バイナリベクトル間の距離計算をハミング距離(XOR + popcount)で行えるため、SIMD命令による超高速検索が可能となる。
動作原理
バイナリ量子化の手順は極めてシンプル:
- 閾値の決定: 通常は0を閾値とする(L2正規化済みベクトルの場合)
- 二値化: 各次元 d について、x_d >= 0 なら 1、x_d < 0 なら 0
- ビットパッキング: 連続する次元をビット列にパック(768次元 = 96バイト = 12個のuint64)
- 距離計算: ハミング距離 = XOR(a, b) の popcount(1のビット数)
ハミング距離はXOR演算とpopcountの2命令で計算でき、CPUのAVX2/AVX-512命令セットでは512ビット(=512次元分)を1サイクルで処理可能。float32のドット積と比較して10-40倍の演算スループットを実現する。
メモリ削減効果
| 規模 | float32 | int8 (SQ) | binary (BQ) |
|---|---|---|---|
| 1M × 768次元 | 3.07 GB | 0.77 GB | 96 MB |
| 10M × 768次元 | 30.7 GB | 7.7 GB | 960 MB |
| 100M × 768次元 | 307 GB | 77 GB | 9.6 GB |
| 1M × 1536次元 | 6.14 GB | 1.54 GB | 192 MB |
| 1M × 3072次元 | 12.3 GB | 3.07 GB | 384 MB |
100万ベクトル×768次元がわずか96MBに収まるため、一般的なPCのRAMでも億単位のベクトルを保持できる計算になる。
精度と次元数の関係
バイナリ量子化の精度は次元数に強く依存する:
| 次元数 | Recall@10(BQのみ) | Recall@10(BQ + Rescore) | 実用性 |
|---|---|---|---|
| 128 | 0.55-0.65 | 0.75-0.85 | 非実用的 |
| 384 | 0.70-0.80 | 0.88-0.93 | 限定的 |
| 768 | 0.82-0.88 | 0.94-0.97 | 実用的 |
| 1024 | 0.85-0.92 | 0.96-0.99 | 推奨 |
| 1536 | 0.88-0.94 | 0.97-0.99 | 最適 |
| 3072 | 0.90-0.96 | 0.98-1.00 | 最適 |
768次元以上でBQ単体のRecall@10が80%を超え、リスコアリング併用で95%以上に達するため実用的となる。384次元以下では精度劣化が大きく、スカラー量子化(int8)の使用を推奨。
オーバーサンプリングとリスコアリング
バイナリ量子化の精度を回復する標準手法:
- オーバーサンプリング: 最終的に必要な件数(k)の数倍(通常3-5倍)の候補をBQで高速検索
- リスコアリング: 候補を元の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でのメモリ制約解消に特に有効