ほとんどの埋め込みモデル(BGE-M3、E5、ada-002、Cohere)は Matryoshka 損失で訓練されていないため、末尾の次元を単に落とすことはできません。私たちが試したのは:BGE-M3 を 1024 次元から 256 次元に切り詰めると、コサイン類似度が 0.467 でした。使い物になりません。
解決策は、あまりに単純すぎて笑ってしまうほどです。 埋め込みのサンプル(約 5K ベクトルで十分)に対して PCA を当てはめ、その後、切り詰める前にすべてのベクトルを主成分の基底に回転します。固有値は次元の重要度の順に次元を並べ替えるので、切り詰めでは任意の次元ではなく「最も重要でない次元」が捨てられるようになります。
結果:PCA の切り詰めを 256 次元にするとコサイン類似度が 0.974 になりました。これは、再訓練なしで 1 行の線形変換をしただけで得られた 109% の改善です。
圧縮パイプライン
PCA による次元削減を、スカラー量子化(各座標あたり 3 ビット、Zandieh らの ICLR 2026 の PolarQuant 回転トリックを使用)と組み合わせます:
- PCA 回転 + 384 次元への切り詰め(1024 から)
- ランダムな直交回転(座標を約 Gaussian にする)
- Lloyd-Max による 3 ビット量子化 + ビットパッキング
結果:27x 圧縮(4096 バイト → 埋め込みあたり 148 バイト)。
リコールの数値(ここが重要です)
2.4M ベクトルの文明横断的な倫理コーパスでベンチマークしました(BGE-M3 埋め込み)。分かったことは次の通りです:
| 手法 | 圧縮 | Recall@10 |
|---|---|---|
| スカラー int8 | 4x | 97.2% |
| TurboQuant 3 ビット | 10.6x | 83.8% |
| PCA-384 + TQ3 | 27.7x | 77.0% |
| PCA-256 + TQ3 | 41.0x | 78.2% |
| 2 値量子化 | 32x | 66.6% |
| 積量子化(M=16) | 256x | 41.4% |
リコール 77% の単段(single-stage)は良くありません。しかし、標準的な 5 倍オーバーサンプリング + 正確な再ランキング(50 個の候補を取得して、元のベクトルで再スコアリング)を行うと、99.4% の Recall@10 まで跳ね上がります。合成データではなく、50K の本番埋め込みで検証しました。
比較のために言うと、TQ3 単体でも同じ再ランキングのトリックで、81% から 100% へ上がります。再ランキングのコストはごくわずかです。2.4M ではなく、50 個のベクトルを再スコアリングするだけだからです。
驚くべき発見:コサイン類似度はあなたを騙す
これは論文の中で最も面白い部分でした。次の 2 行を見てください:
- PCA-384 + TQ3:0.979 のコサイン類似度、76.4% の Recall@10
- PCA-256 + TQ3:0.963 のコサイン類似度、78.2% の Recall@10
PCA-256 は コサイン類似度が低い のに リコールが高い。ベクトルごとの再構成忠実度の指標は、高圧縮ではランキング品質の指標とずれてしまいます。多数のベクトルに分散された小さな摂動は、各ベクトルがそれぞれ良く見える場合でも、順位の近いアイテムの順番を入れ替えることがあり得ます。
結論: 検索のために埋め込み圧縮を評価するなら、コサイン類似度だけでなく recall@k を報告してください。私たち自身もほぼこのミスをしました。コサインの数値だけだと PCA-384 が PCA-256 より良く見えますが、リコールは逆の話をしてくれます。
うまくいかないこと
- Matryoshka ではないモデルに対する単純な切り詰め。 次元を単に落とすだけでは致命的です(次元 50% でコサインが 0.467、25% で 0.333)。情報はだいたい一様に分散されているので、PCA でそれを集中させる必要があります。
- 同じ圧縮帯域における積量子化(Product Quantization)。 PQ(M=16, K=256)は 256x の圧縮が得られますが、リコールは 41% にとどまります。PCA-128 + TQ3 は 79% のリコールで 79x の圧縮になり、30〜80x の範囲では PQ を明確に上回ります。
- コサイン類似度に頼って圧縮品質を評価すること。 私たちはこれを繰り返してしまっています。なぜなら、この罠に最も簡単に落ちるからです。
実装作業から得られたボーナス発見が 2 つ
学習済みコードブック: 標準の Lloyd-Max 量子化は、回転後の座標が Gaussian であることを前提にしています。しかし実際は違い、裾がより重い(heavy tails)です。実際に回転したデータでコードブックを学習する(単に 1D k-means を行い、50 イテレーション)と、同じ 3 ビットでも量子化誤差が 22% 減ります。モデルをまたいで一貫して機能します。
KV キャッシュにおける非対称 K/V 配分: K は V よりも量子化に対して敏感です。なぜなら softmax が K の誤差を増幅するからです。4 ビットのキー / 2 ビットの値を使うと、均一な 3 ビットと同じ保存量でキーのコサイン類似度が 0.995 になります。重要な次元に対して、無料の品質向上を得られます。
この論文は IEEE TAI で査読中です。コード:https://github.com/ahb-sjsu/turboquant-pro(pip install turboquant-pro)
手法や「コサイン vs リコール」の発見について議論することもできます。あれが、私たちの特定のユースケースを超えて最も広い意味を持つ部分だと思っています。
[link] [comments]

