Vector Quantization
Vektör niceleme, her vektörü en yakın kod kitabı girdisinin diziniyle değiştirir. k-means kod kitaplarını, ürün nicelemeyi ve VQ-VAE belirteçlerini ele alır.
Vektör niceleme (VQ), bir veri kümesindeki her vektörü, kod kitabı adı verilen küçük bir temsilî vektör kümesindeki en yakın öğenin indeksiyle değiştiren bir sıkıştırma tekniğidir. Kodlama yalnızca indeksi saklar, kod çözme indekse bakar ve yeniden oluşturma hatası, özgün vektör ile kod sözcüğü arasındaki mesafedir. K boyutlu bir kod kitabı, vektör kaç boyutlu olursa olsun vektör başına log₂(K) bit gerektirir; dolayısıyla 256 öğeli bir kod kitabı herhangi bir vektörü bir baytta saklar. VQ'nun kökeni sinyal işlemedir: Stuart Lloyd'un 1957'de Bell Labs'te skaler niceleyiciler tasarlamak için geliştirdiği ve 1982'de yayımlanan algoritması, bugün genellikle k-means olarak adlandırılan algoritmadır; Yoseph Linde, Andrés Buzo ve Robert Gray ise 1980'de bu yöntemi vektörlere uyarlamıştır. Derin öğrenmede VQ, görüntüleri, sesleri ve videoları token'lara dönüştürmenin üretken yapay zekâ için standart yolu hâline geldi.
Vektör Niceleme Nasıl Çalışır#
Kod kitabı genellikle k-means kümeleme ile öğrenilir: her eğitim vektörünü en yakın kod sözcüğüne ata, her kod sözcüğünü kendisine atanmış vektörlerin ortalamasına taşı ve ortalama bozulma artık artmayana kadar bu adımları tekrarla. Renk niceleme, SciPy'nin scipy.cluster.vq modülünü kullanarak bir fotoğrafın pikselleri üzerinde tüm süreci gösterir:
import numpy as np
from scipy.cluster.vq import kmeans2, vq
from sklearn.datasets import load_sample_image
image = load_sample_image("china.jpg") # 427 x 640 RGB photo bundled with scikit-learn
pixels = image.reshape(-1, 3).astype(np.float64) # one 3-D color vector per pixel
# Learn a 16-entry codebook with k-means (Lloyd's algorithm) on a sample of pixels
rng = np.random.default_rng(0)
codebook, _ = kmeans2(rng.choice(pixels, 5000), 16, minit="++", seed=0)
# Encode: replace each pixel with the index of its nearest codeword (4 bits instead of 24)
indices, _ = vq(pixels, codebook)
# Decode: look each index up in the codebook
reconstruction = codebook[indices]
rmse = np.sqrt(((pixels - reconstruction) ** 2).mean())
print(f"{len(pixels):,} pixels, {len(codebook)} codewords, 24 -> 4 bits per pixel")
print(f"Reconstruction RMSE: {rmse:.1f} on the 0-255 scale")273.280 pikselin tümü 16 renge karşılık gelen 4 bitlik indisler olarak saklanır; bu, 24 bit RGB'den altı kat daha az renk verisi demektir ve 255 üzerinden 11,3 yoğunluk düzeyinde kök ortalama kare hatası verir.
Skaler niceleme tek boyutlu özel durumdur; model niceleme bu yöntemi sinir ağlarına uygular. Ultralytics YOLO26, dışa aktarma sırasında bunu kullanır: quantize=8, her ağırlığı ve aktivasyonu 256 tam sayı düzeyinden en yakınına yuvarlar; aktivasyon aralıkları, data içindeki görüntüler üzerinde yapılan tek bir kalibrasyon geçişinde gözlemlenir. Tüm vektörleri birlikte nicelemek, boyutlar arasındaki korelasyonlardan yararlanır; aynı bit hızında, en iyi vektör niceleyicisinin bozulması, her değere ayrı ayrı uygulanan en iyi skaler niceleyiciden asla yüksek olmaz.
Ürün ve Artık Niceleme#
Tek bir kod kitabı, bit bütçesiyle üstel olarak büyür; 64 bit için 2⁶⁴ kod sözcüğü gerekir. Hervé Jégou, Matthijs Douze ve Cordelia Schmid tarafından 2011'de tanıtılan ürün nicelemesi, her vektörü m alt vektöre böler ve her birini kendine ait 256 öğeli bir kod kitabıyla nicelemeye tabi tutar. m = 8 olduğunda, 128 boyutlu bir float32 gömme vektör 512 bayttan 8 bayta iner ve sorguya olan mesafeler küçük arama tablolarından elde edilir. Meta'nın FAISS kütüphanesi, bunu ters dosya diziniyle eşleştirir; bu dizin, her sorguyu birkaç kümeyle sınırlayan kaba bir k-means niceleyicisidir ve milyarlarca ölçeğinde vektör aramasını mümkün kılar.
Artık niceleme bunun yerine kod kitaplarını art arda kullanır: ikinci kod kitabı ilkinin bıraktığı hatayı, üçüncüsü ikincinin bıraktığı hatayı ve bu şekilde devam ederek her hatayı nicelemeyi öğrenir. Google'ın SoundStream (2021) ve Meta'nın EnCodec (2022) sinirsel ses kodekleri, konuşma ve müziği saniyede birkaç kilobite sıkıştırmak için bu yöntemi kullanır; görsel otoregresif modelleme (VAR) ise bu yöntemi görüntü çözünürlükleri boyunca uygular.
VQ-VAE ve Görüntü Token'ları#
DeepMind'dan Aäron van den Oord, Oriol Vinyals ve Koray Kavukcuoglu, VQ-VAE'yi 2017'de yayımlanan Neural Discrete Representation Learning makalesinde tanıttı. Bir otomatik kodlayıcının kodlayıcı çıktısı, her uzamsal konumda en yakın kod sözcüğüyle değiştirilir ve kod çözücü girdiyi bu kod sözcüklerinden yeniden oluşturur. En yakın komşu aramasının gradyanı olmadığından, geri yayılım sırasında düz geçişli kestirici, kod çözücünün gradyanını bu adımın ötesine kopyalar; PyTorch'ta bu işlem z_q = z + (z_q - z).detach() şeklinde yazılır. İki ek kayıp terimi kod sözcüklerini kodlayıcı çıktılarına yaklaştırır ve kodlayıcıyı seçtiği kod sözcüklerine bağlar; makalede ikinci terim 0.25 ile ağırlıklandırılmıştır.
Ortaya çıkan token ızgaraları, bunları üretmeyi öğrenen ikinci bir modele, genellikle bir transformer'a beslenir. VQGAN (2021), daha keskin token'lar için karşıt ve algısal kayıplar ekledi ve pek çok metinden görüntüye modelin arkasındaki tokenizer hâline geldi. Yaygın bir sorun kod kitabı çökmesidir: kod sözcüklerinin çoğu hiç seçilmez ve etkin söz dağarcığı küçülür. k-means başlatması, kod kitabını hareketli ortalamayla güncelleme ve kullanılmayan kodları sıfırlama bu sorunu azaltır. Google'ın sonlu skaler nicelemesi (FSQ, 2023) ise birkaç gizil boyutun her birini bir avuç sabit düzeye yuvarlayarak bu sorunu önler; böylece örtük kod kitabındaki her koda ulaşılabilir.
Vektör Niceleme ve İlişkili Terimler#
- Vektör veri tabanları: Gömme vektörlerini saklar ve dizinler; bunları belleğe sığdırmak için çoğu zaman ürün nicelemeyi dahili olarak uygular.
- Boyut indirgeme: PCA'da olduğu gibi vektörleri daha az sayıda sürekli boyuta eşler; VQ ise her vektörü tek bir ayrık koda eşler.
- Tokenleştirme: Metni sabit bir söz dağarcığındaki birimlere böler; VQ ise görüntü yamaları ve ses çerçeveleri gibi sürekli sinyaller için eşdeğer bir söz dağarcığı oluşturur.










