量子化(Quantization)は、AIにおけるスケーリング問題を解決するために広く使用されています。その名前は複雑そうに聞こえますが、数値を丸めて占有するスペースを小さくするだけのことです。これは、メモリとストレージスペースを占有するより小さな 向量模型 (Embeddings) を意味し、ベクトルの比較にかかる時間が短縮されるため、より高速な情報検索が可能になります。量子化は、モデルが処理するデータの種類やユースケースに関係なく、純粋に数値的な手法であるため、コストのかかるドメイン知識をあまり必要とせずに改善をもたらすことができます。
量子化には、精度のいくらかを犠牲にしなければならないという、昔ながらのトレードオフが伴うと予想されるかもしれません。この記事では、量子化対応トレーニング(QAT)によってそれをロスレスにする方法を紹介します。この手法は、スペースが重要なアプリケーションで必要となるより小さな 向量模型 (Embeddings) を提供するために、jina-embeddings-v4で使用されています。
tag量子化手法の概要
モデル量子化は通常、次の4つのいずれかを意味します。
- トレーニング後量子化(Post-training quantization、PTQ)
- 量子化された 向量模型 (Embeddings) 出力のためのトレーニング(Output QAT)
- 完全に量子化されたモデルのためのトレーニング(Full QAT)
- 既存の非量子化モデルから新しい量子化モデルを蒸留する
トレーニング後量子化(Post-training quantization、PTQ)は、トレーニング済みの 向量模型 (Embeddings) モデルをそのまま受け入れ、何も変更しません。これは、モデルによって生成された浮動小数点値の最下位桁を破棄するだけの問題です。数値を丸めるだけで、場合によっては範囲に合わせてスケーリングします。
Output QATは、最適な低精度ベクトルを生成するために 向量模型 (Embeddings) モデルを微調整することを意味します。これはモデルを変更することを意味しますが、モデルの重みの精度は変更しないため、サイズは縮小されません。出力ベクトルのサイズだけが縮小されます。
Full QATは、完全にトレーニングされた、フル精度のモデルから始まり、モデルの重みの精度を下げてから、この変更されたモデルのパフォーマンスを微調整します。これにより、微調整を行うという代償を払って、より小さな 向量模型 (Embeddings) だけでなく、大幅に小さなモデルが生成されます。
蒸留とは、既存のモデルのパフォーマンスに合わせて新しいモデルをトレーニングするプロセスです。これは、量子化されたものとして最初から設計された新しいモデルを作成し、既存のモデルを使用して、既存のモデルにできるだけ近いパフォーマンスを発揮するまでトレーニングするために必要なだけのトレーニングデータを生成することを意味します。
これら4つのアプローチの利点を以下の表にまとめます。
| アプローチ | よりコンパクトな 向量模型 (Embeddings)? | トレーニングが必要ですか? | モデル圧縮? | より高速な推論? |
|---|---|---|---|---|
| PTQ | ✓ | ❌ | ❌ | ❌ |
| Output QAT | ✓ | ✓ | ❌ | ❌ |
| Full QAT | ✓ | ✓ | ✓ | ✓ |
| Distillation | ||||
| (より小さなモデルへ) | ✓ | ✓ | ✓ | ✓ |
4つすべてがよりコンパクトな 向量模型 (Embeddings) を生成しますが、PTQ以外はすべて追加のトレーニングが必要であり、Full QATとDistillationのみが新しい、より高速なモデルを生成します。Full QATとDistillationは、Output QATよりもはるかに多くのトレーニングが必要なため、実装にはるかに費用がかかります。
この記事では、 向量模型 (Embeddings) モデルのサイズや速度を変更しないPTQとOutput QATのみに注目します。
tag実験設定
これらの実験では、ベースラインモデルは、2048次元で32ビット精度の浮動小数点(FP32)ベクトルを生成する、検索アダプターを備えたjina-embeddings-v4です。したがって、各 向量模型 (Embeddings) のサイズは8196バイト、つまり8kBです。
NanoBEIRベンチマークスイートからのクエリ-ドキュメント検索ベンチマークタスクを使用して、いくつかの実験条件を調査しました。検索プロセスでは、ベクトル間のコサイン類似度を使用して、クエリに最適なドキュメントを見つけてランク付けします。
- ベースライン — 量子化なしのjina-embeddings-v4 向量模型 (Embeddings) ベクトルのパフォーマンス。これらの実験はすべてモデルのベータ版を使用しており、リリース時のパフォーマンスはいくらか向上しています。
- PTQ — モデルを変更せずに、出力ベクトルをバイナリベクトルに量子化しました。
- Output QAT — 出力ベクトルを量子化し、量子化された条件下でのパフォーマンスを向上させるために、検索アダプターに微調整を適用しました。
tag量子化レベル

4つの異なる量子化レベルを試しました。
- 8ビット整数 — FP32値は-128〜127の範囲の整数に縮小され、 向量模型 (Embeddings) は4分の1の2048バイトに縮小されます。
- 4ビット整数 - 4ビット整数と同じですが、-8から7の範囲にマッピングし、ベクトルサイズを8分の1に縮小して1024バイトにします。
- 三値量子化— すべての値は、-1、0、1の3つの値のいずれかにマッピングされます。最適に保存されると、これにより各次元が1.6ビットに縮小され、 向量模型 (Embeddings) ベクトルのサイズが約40分の1の約230バイトに縮小されます。
- バイナリ量子化 —
torch.signデータ型を使用して、FP32スカラー値を1ビットに変換します。これにより、2つの値のみが提供され、保存に1ビットかかります。これにより、2048次元の 向量模型 (Embeddings) ベクトルが8192バイトから128バイトに縮小され、64分の1に縮小されます。
tagスケーリング
バイナリ量子化の場合、量子化は非常に簡単です。ベクトル値が0より大きいか正の場合、1にマッピングされます。それ以外の場合は、-1にマッピングされます。

他の量子化シナリオでは、値を範囲に正規化し、量子化のレベルで許可される最も近い値に丸めました。 向量模型 (Embeddings) ベクトルは、-∞〜+∞(または、実際には、非常に大きな正および負の数)のスケール数で構成されます。量子化のために値をスケーリングするには、との2つの数値を使用します。
三値量子化の場合、各ベクトル成分を取得し、次のように変換します。
- ≥ の場合、は1になります。
- ≤ の場合、は-1になります。
- < < の場合、は0になります。

4ビット整数の場合:
- ≥ の場合、は7になります。
- ≤ の場合、は-8になります。
- < < の場合、はになり、最も近い整数に丸められます。これにより、値がの範囲にスケーリングされます。

8ビット整数の場合:
- ≥ の場合、は127になります。
- ≤ の場合、は-128になります。
- < < の場合、はになり、最も近い整数に丸められます。これにより、値がの範囲にスケーリングされます。

とを計算するために、次の2つのアプローチを使用しました。
- 最小/最大 — データをバッチで処理し、各バッチについて、最高のベクトル成分と最低のベクトル成分を特定し、を最高に、を最低に設定しました。
- バッチごとのローリング平均 — 各バッチについて、ベクトル成分の平均と標準偏差を計算しました。すべてのバッチを処理する際に、平均と標準偏差の両方の移動平均を維持しました。がバッチ平均値の現在の移動平均であり、が標準偏差の現在の移動平均である場合、各バッチについて:
tagQAT微調整
PTQ実験では、モデルをそのまま使用し、上記の方法を使用して生成された 向量模型 (Embeddings) を量子化しました。
Output QATの場合、ストレートスルー推定を使用してモデルを微調整しました。これは、損失(つまり、エラー)を計算する前に、量子化プロセスを逆にして、値の完全な精度を復元し、その損失メトリックを使用してモデルを微調整することを意味します。
各ケースで10,000ステップのファインチューニングを行い、500ステップごとにチェックポイントを保存しました。その後、NanoBEIRベンチマークで最高のスコアを獲得したチェックポイントを保持しました。
tag非対称量子化
PTQとOutput QATは、埋め込みベクトルのサイズを縮小しますが、モデルサイズや推論速度は低下させません。すべての節約は、保存されたドキュメント埋め込みのサイズと検索速度にあります。
その結果、クエリベクトルを量子化するか、検索時に量子化されていない状態にするかの両方をテストしました。どちらにしても、保存される埋め込みベクトルのサイズは変わらないためです。
tag結果
合計9つの条件をテストし、以下の表にまとめました。
| 条件名 | ファインチューニング | 量子化レベル | スケーリング戦略 | 量子化されたクエリ |
|---|---|---|---|---|
| ベースライン | ❌ | n/a | n/a | n/a |
| PTQ Both | ❌ | Binary | n/a | ✓ |
| PTQ Docs Only | ❌ | Binary | n/a | ❌ |
| QAT Binary | ✓ | Binary | n/a | ✓ |
| QAT Binary Docs Only | ✓ | Binary | n/a | ❌ |
| QAT Trinary | ✓ | Trinary | ローリング平均 | ✓ |
| QAT 4-bits | ✓ | 4-bits | ローリング平均 | ✓ |
| QAT 8-bits | ✓ | 8-bits | ローリング平均 | ✓ |
| QAT 8-bits Min/Max | ✓ | 8-bits | Min/Max | ✓ |
表2:実験条件
| 条件名 | 平均スコア | ベースラインからの差 |
|---|---|---|
| ベースライン | 60.10 | n/a |
| PTQ Binary | 58.33 | -1.78 |
| PTQ Binary Docs Only | 59.08 | -1.02 |
| QAT Binary | 59.22 | -0.89 |
| QAT Binary Docs Only | 60.81 | +0.70 |
| QAT Trinary | 59.49 | -0.62 |
| QAT 4-bits | 61.73 | +1.62 |
| QAT 8-bits | 61.67 | +1.56 |
| QAT 8-bits Min/Max | 61.29 | +1.19 |
表3:12のNanoBEIRベンチマークにおける各条件の平均スコア(正解率%)。
上記の表から、量子化のためのファインチューニングによってスコアが向上することがわかります。PTQ Binary条件とQAT Binary条件の唯一の違いはファインチューニングであり、スコアの差は有意です。同様に、PTQ Binary Docs Only条件とQAT Binary Docs Only条件の間でも、同じファインチューニングによってのみ区別される、約2%のスコアの向上が見られます。
当然のことながら、量子化を減らすほどスコアが全体的に向上し、4ビット量子化は3値より優れており、3値はバイナリより優れていることもわかります。ただし、さらに8ビットにしても何も改善されていないようです。
バイナリの場合にのみクエリを量子化しないままテストしましたが、これはパフォーマンスを向上させるようです。
最後に、ローリング平均スケーリング法は、単純な最小/最大アプローチよりも優れた結果を示すことがテストから示唆されています。
tag結論
量子化は、埋め込みベクトルのサイズを大幅に縮小し、情報検索を高速化することにより、埋め込みモデルにいくつかの重要な運用上の利点をもたらします。単純な量子化後トレーニング(PTQ)は、メモリとストレージの点で即時のメリットをもたらしますが、量子化対応トレーニング(QAT)は、避けられない精度損失を大幅に軽減することが実験で示されています。ファインチューニングは一貫してより良いスコアをもたらしました。
量子化の程度はパフォーマンスに直接影響しますが、これは値の精度を下げることに基づいた手法から予想されることです。積極性の低い量子化(例:4ビット)は、一般に、より積極的な手法(例:バイナリ)よりも優れていますが、驚くべきことに、8ビットと4ビットの量子化の間にパフォーマンスの有意な差はありませんでした。ある程度の精度閾値に達するまでは、量子化の大小にほとんど差がないようです。
スケーリング戦略も重要であり、ローリング平均法は、固定された最小/最大アプローチと比較して優れた結果を示しています。データに対して相対的なスケーリング値を使用すると、大幅に効果的であると思われ、さらなる調査に値します。
量子化を使用すると、より少ないコストで埋め込みモデルをより活用できます。この記事では、量子化のすべてのオプションを網羅しているわけではありませんが、簡単にアクセスできる2つのオプションについて検討しており、それらは提供できる本当の利点があります。ユーザーのコストをさらに削減できるように、量子化戦略の改良と改善に取り組んでおり、近い将来、jina-embeddings-v4のバイナリサポートをリリースする予定です。









