[R] PCA回転により、非Matryoshka埋め込みが打ち切り可能に——再ランク付けで99%リコールを保ちつつ27倍圧縮

Reddit r/LocalLLaMA / 2026/4/11

💬 オピニオンDeveloper Stack & InfrastructureIdeas & Deep AnalysisTools & Practical UsageModels & Research

要点

  • 多くの埋め込みモデルでは、Matryoshka方式の次元削減をそのまま適用しても、類似度や検索の品質が大きく劣化するため、ナイーブな打ち切りはできません。
  • 本記事では、単純な代替策を示します。埋め込みのサンプルに対してPCAを適用し、ベクトルをPCA基底へ回転してから打ち切ることで、PCAを行う場合は大幅に高いコサイン類似度が得られます(例:PCAにより約0.974に到達した256Dでは、PCAなしの約0.467より大きい)。さらに、追加の再学習は不要です。
  • PCAの回転/打ち切りに、スカラー量子化(座標をよりガウス的にする直交回転を含む)を組み合わせることで、大きな圧縮を実現し、実用的な検索性能を維持しつつ、埋め込みサイズを最大で約27倍小さくできると報告しています。
  • 240万(2.4M)埋め込みに対するベンチマークでは、PCA量子化バリアントは単段のrecall@10で中程度の性能でしたが、標準的な5倍のオーバーサンプリングに加えて厳密な再ランク付けを行うことで、性能が劇的に向上し、recall@10を約99.4%まで到達させています。
  • 重要な発見として、高い圧縮ではコサイン類似度が「誤解を招く」ことがあります。ある設定ではコサインは低いのにリコールは高いことが示されており、攻撃的な圧縮下ではランキング品質と再構成指標が乖離することが示唆されます。

ほとんどの埋め込みモデル(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 回転トリックを使用)と組み合わせます:

  1. PCA 回転 + 384 次元への切り詰め(1024 から)
  2. ランダムな直交回転(座標を約 Gaussian にする)
  3. 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-propip install turboquant-pro

手法や「コサイン vs リコール」の発見について議論することもできます。あれが、私たちの特定のユースケースを超えて最も広い意味を持つ部分だと思っています。

submitted by /u/ahbond
[link] [comments]