量化是一種廣泛用於解決人工智慧中擴展問題的技術。這個名稱聽起來很複雜,但它只是將數字四捨五入,使其佔用更少的空間。這意味著更小的向量模型 (Embeddings) 佔用更少的記憶體和儲存空間,以及更快的資訊檢索,因為比較向量所需的時間更少。量化是一種純粹的數值技術,不關心您的模型處理什麼樣的資料或您有哪些用例,因此它可以帶來改進,而無需大量的昂貴的領域知識。
人們可能會預期,量化涉及權衡,沒有什麼是免費的——我們必須犧牲一些精度。在本文中,我們將向您展示一種透過量化感知訓練 (quantization-aware training, QAT) 使其無損的方法。此技術用於 jina-embeddings-v4 中,以提供空間關鍵應用中所需的更小的向量模型 (Embeddings)。
tag量化技術概述
模型量化通常意味著以下四件事之一:
- 訓練後量化(Post-training quantization, PTQ)
- 訓練用於量化向量模型 (Embeddings) 輸出(Output QAT)
- 訓練用於完全量化模型(Full QAT)
- 從現有的未量化模型中提煉出一個新的量化模型
訓練後量化(PTQ)接受經過訓練的向量模型 (Embedding) 模型,並且不以任何方式修改它。這只是丟棄模型產生的浮點值的最小有效位數的問題。我們只是將數字四捨五入,有時將它們縮放到一個範圍。
Output QAT 意味著微調向量模型 (Embedding) 模型,以產生最佳的降低精度向量。這意味著修改模型,但它不會改變模型權重的精度,因此不會減小其大小。只有輸出向量大小減小。
Full QAT 從一個完全訓練好的、全精度模型開始,降低模型權重的精度,然後微調此修改後的模型的性能。這會產生一個顯著更小的模型以及更小的向量模型 (Embeddings),但需要進行一些微調。
Distillation 是訓練一個新模型以匹配現有模型性能的過程。這意味著創建一個從頭開始設計為量化的新模型,然後使用現有模型生成所需的盡可能多的訓練資料來訓練它,直到它的性能盡可能接近現有模型。
下表總結了這四種方法的好處:
方法 | 更緊湊的向量模型 (Embeddings)? | 需要訓練? | 模型壓縮? | 更快的推論? |
---|---|---|---|---|
PTQ | ✓ | ❌ | ❌ | ❌ |
Output QAT | ✓ | ✓ | ❌ | ❌ |
Full QAT | ✓ | ✓ | ✓ | ✓ |
Distillation | ||||
(到一個更小的模型) | ✓ | ✓ | ✓ | ✓ |
所有四種方法都產生更緊湊的向量模型 (Embeddings),但除了 PTQ 之外,所有方法都需要一些額外的訓練,而只有 Full QAT 和 Distillation 產生新的、更快的模型。Full QAT 和 Distillation 的實施成本要高得多,因為它們需要比 Output QAT 更多的訓練。
在本文中,我們只會研究 PTQ 和 Output QAT,它們不會改變向量模型 (Embedding) 模型的大小或速度。
tag實驗設定
對於這些實驗,我們的基準模型是帶有檢索適配器的 jina-embeddings-v4,它產生 2048 維的 32 位精度浮點 (FP32) 向量。因此,每個向量模型 (Embedding) 的大小為 8196 位元組,即 8kB。
我們使用來自 NanoBEIR 基準測試套件的查詢-文件檢索基準測試任務研究了幾種實驗條件。檢索過程使用向量之間的餘弦相似度來查找和排名與查詢最匹配的文件。
- 基準 — jina-embeddings-v4 向量模型 (Embedding) 向量在沒有任何量化的情況下的性能。這些實驗都使用了該模型的 beta 版本,並且發布的性能略好。
- PTQ — 我們將輸出向量量化為二進制向量,而沒有更改模型。
- Output QAT — 我們量化了輸出向量,並對檢索適配器進行了微調,以提高其在量化條件下的性能。
tag量化級別

我們實驗了四種不同的量化級別。
- 8 位元整數 — FP32 值縮減為 -128 到 127 範圍內的整數,將向量模型 (Embeddings) 縮小 4 倍至 2048 位元組。
- 4 位元整數 — 與 4 位元整數相同,但我們映射到 -8 到 7 的範圍,將向量大小減少 8 倍,至 1024 位元組。
- 三元量化 — 所有值都映射到三個值之一:-1、0、1。最佳儲存時,這會將每個維度減少到 1.6 位元,將向量模型 (Embedding) 向量的大小大致減少 40 倍,至約 230 位元組。
- 二進制量化 — 我們使用
torch.sign
資料類型將 FP32 標量值轉換為一位元,該資料類型僅提供兩個值,需要一位元來儲存。這將 2048 維向量模型 (Embedding) 向量從 8192 位元組減少到 128 位元組,減少了 64 倍。
tag縮放
對於二進制量化,量化非常簡單:如果向量值大於 0 或為正數,則映射到 1。否則,它映射到 -1。

對於其他量化情境,我們將值歸一化到一個範圍,然後四捨五入到量化級別允許的最接近的值。向量模型 (Embedding) 向量由 -∞ 和 +∞ 之間的比例數字組成(或者,在實踐中,是非常大的正數和負數)。我們使用兩個數字 和 來縮放用於量化的值。
對於三元量化,我們採用每個向量分量 並按如下方式轉換它:
- 如果 ≥ ,則 變為 1。
- 如果 ≤ ,則 變為 -1。
- 如果 < < ,則 變為 0。

對於 4 位元整數:
- 如果 ≥ ,則 變為 7。
- 如果 ≤ ,則 變為 -8。
- 如果 < < ,則 變為 ,然後四捨五入到最接近的整數。這將值縮放到範圍 。

對於 8 位元整數:
- 如果 ≥ ,則 變為 127。
- 如果 ≤ ,則 變為 -128。
- 如果 < < ,則 變為 ,四捨五入到最接近的整數。這將值縮放到範圍 。

為了計算 和 ,我們使用了兩種方法:
- 最小值/最大值 — 我們分批處理我們的資料,並且對於每一批,我們識別出最高和最低的向量分量,將 設置為最高,將 設置為最低。
- 批次上的滾動平均 — 對於每個批次,我們計算向量分量的平均值和標準差。在處理所有批次時,我們保持平均值和標準差的移動平均值。如果 是批次平均值的當前移動平均值,並且 是標準差的當前移動平均值,則對於每個批次:
tagQAT 微調
對於 PTQ 實驗,我們按原樣使用模型,並使用上述方法量化它產生的向量模型 (Embeddings)。
對於 Output QAT,我們使用直接估計微調模型。這意味著我們反轉量化過程,將值恢復到全精度,然後計算損失(即誤差),然後我們使用該損失指標來微調模型。
在每個案例中,我們都針對 10,000 個步驟進行了微調,每 500 個步驟儲存一個檢查點。 然後,我們保留了在 NanoBEIR 基準測試中得分最高的檢查點。
tag非對稱量化 (Asymmetric Quantization)
訓練後量化 (PTQ) 和輸出感知量化訓練 (Output QAT) 降低了向量模型 (embedding vectors) 的大小,但並未減少模型大小或推論速度; 所有的節省都在儲存的文件向量模型 (document embeddings) 的大小和檢索速度上。
因此,我們測試了在檢索時量化查詢向量 (query vectors) 以及保持它們不量化的兩種情況,因為無論哪種方式,它都不會改變儲存的向量模型 (embedding vectors) 的大小。
tag結果
我們總共測試了九種情況,總結在下表中:
條件名稱 | 微調 | 量化等級 | 縮放策略 | 量化查詢 |
---|---|---|---|---|
基準 (Baseline) | ❌ | 不適用 (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) | 滾動平均 (Rolling Average) | ✓ |
QAT 4-bits | ✓ | 4 位元 (4-bits) | 滾動平均 (Rolling Average) | ✓ |
QAT 8-bits | ✓ | 8 位元 (8-bits) | 滾動平均 (Rolling Average) | ✓ |
QAT 8-bits Min/Max | ✓ | 8 位元 (8-bits) | 最小值/最大值 (Min/Max) | ✓ |
表 2:實驗條件
條件名稱 | 平均分數 | 與基準的差異 |
---|---|---|
基準 (Baseline) | 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:在十二個 NanoBEIR 基準測試中,每個條件的平均分數(以正確百分比表示)。
從上表可以看出,針對量化進行微調可提高分數。 PTQ Binary 和 QAT Binary 條件之間的唯一區別是微調,並且分數差異顯著。 類似地,我們看到 PTQ Binary Docs Only 和 QAT Binary Docs Only 條件之間的分數提高了近 2%,它們僅因相同的微調而區分。
毫不奇怪地,我們也看到,量化程度越低,分數通常會提高,4 位元量化的得分高於三元量化,而三元量化又優於二元量化。 然而,進一步提高到 8 位元似乎沒有改善任何東西。
我們僅在二元案例中測試了保持查詢不量化的情況,但這似乎可以提高效能。
最後,我們的測試表明,滾動平均縮放方法優於簡單的最小值/最大值方法。
tag結論
量化對於向量模型 (embedding models) 具有一些重要的操作優勢,透過顯著減小向量模型 (embedding vectors) 的大小並加速資訊檢索。 雖然簡單的訓練後量化 (PTQ) 在記憶體和儲存方面提供了直接的好處,但我們的實驗表明,感知量化訓練 (QAT) 顯著減輕了不可避免的精度損失。 微調始終產生更好的分數。
量化程度直接影響效能,這也是您對基於降低數值精度的方法的期望。 較不激進的量化(例如,4 位元)通常優於更激進的方法(例如,二元),但令人驚訝的是,8 位元和 4 位元量化之間的效能沒有顯著差異。 看來,在達到某個不精確的閾值之前,量化程度的大小之間幾乎沒有差異。
縮放策略也很重要,與固定的最小值/最大值方法相比,滾動平均方法顯示出更好的結果。 使用相對於資料的縮放值似乎效果更好,值得進一步探索。
量化可以讓您以更少的成本從向量模型 (embedding models) 中獲得更多。 儘管本文未探討所有量化選項,但它探討了兩種易於訪問的選項,並且它們具有實際的好處。 我們正在努力完善和改進量化策略,以便我們可以進一步降低使用者的成本,並期望在不久的將來發布對 jina-embeddings-v4 的二元支援。