Vector Quantization
A quantização vetorial substitui cada vetor pelo índice da entrada mais próxima do codebook. Abrange codebooks de k-means, quantização de produto e tokens VQ-VAE.
A quantização vetorial (VQ) é uma técnica de compressão que substitui cada vetor de um conjunto de dados pelo índice da entrada mais próxima em um pequeno conjunto de vetores representativos chamado livro de códigos. A codificação armazena apenas o índice, a decodificação consulta esse índice, e o erro de reconstrução corresponde à distância entre o vetor original e sua palavra-código. Um livro de códigos com K entradas custa log₂(K) bits por vetor, independentemente do número de dimensões do vetor; assim, um livro de códigos com 256 entradas armazena qualquer vetor em um byte. A VQ tem origem no processamento de sinais: o algoritmo de Stuart Lloyd, de 1957, dos Bell Labs, para projetar quantizadores escalares, publicado em 1982, é o algoritmo hoje geralmente chamado de k-means, e Yoseph Linde, Andrés Buzo e Robert Gray o estenderam a vetores em 1980. No aprendizado profundo, a VQ tornou-se a forma padrão de converter imagens, áudio e vídeo em tokens discretos para IA generativa.
Como funciona a quantização vetorial#
Em geral, aprende-se um livro de códigos com agrupamento k-means: cada vetor de treino é atribuído à palavra de código mais próxima, cada palavra de código é movida para a média dos vetores que lhe foram atribuídos, e o processo repete-se, sem nunca aumentar a distorção média. A quantização de cores mostra todo o ciclo nos píxeis de uma fotografia, usando o módulo scipy.cluster.vq do SciPy:
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")Os 273.280 píxeis são armazenados como índices de 4 bits para 16 cores, com seis vezes menos dados de cor do que o RGB de 24 bits e um erro quadrático médio de 11,3 níveis de intensidade em 255.
A quantização escalar é o caso unidimensional, e a quantização de modelos aplica-a às redes neurais. O Ultralytics YOLO26 usa-a na exportação: quantize=8 arredonda cada peso e ativação, de forma independente, para um dos 256 níveis inteiros, com intervalos de ativação observados numa única passagem de calibração pelas imagens em data. Quantizar vetores inteiros em conjunto explora as correlações entre dimensões e, à mesma taxa de bits, um quantizador vetorial ótimo nunca tem distorção superior à de um quantizador escalar ótimo aplicado a cada valor.
Quantização de produto e residual#
Um único livro de códigos cresce exponencialmente com o orçamento de bits, pois 64 bits exigiriam 2⁶⁴ palavras-código. A quantização de produto, apresentada por Hervé Jégou, Matthijs Douze e Cordelia Schmid em 2011, divide cada vetor em m subvetores e quantiza cada um com seu próprio livro de códigos de 256 entradas. Com m = 8, um embedding float32 de 128 dimensões encolhe de 512 bytes para 8, e as distâncias até uma consulta são obtidas por meio de pequenas tabelas de consulta. A biblioteca FAISS da Meta combina essa técnica com um índice de arquivo invertido, um quantizador k-means grosseiro que limita cada consulta a alguns agrupamentos, para busca vetorial em escala de bilhões.
A quantização residual empilha livros de códigos: o segundo quantiza o erro deixado pelo primeiro, o terceiro quantiza o erro deixado pelo segundo e assim por diante. Os codecs de áudio neurais SoundStream (2021), da Google, e EnCodec (2022), da Meta, usam-na para comprimir fala e música a algumas quilobits por segundo, e a modelação autorregressiva visual (VAR) aplica-a em várias resoluções de imagem.
VQ-VAE e tokens de imagem#
Aäron van den Oord, Oriol Vinyals e Koray Kavukcuoglu, da DeepMind, introduziram o VQ-VAE em Neural Discrete Representation Learning, em 2017. A saída do codificador de um autoencoder em cada posição espacial é substituída pela palavra de código mais próxima, e o descodificador reconstrói a entrada a partir das palavras de código. A consulta do vizinho mais próximo não tem gradiente, por isso um estimador straight-through copia o gradiente do descodificador para além dela durante a retropropagação, escrita em PyTorch como z_q = z + (z_q - z).detach(). Dois termos de perda adicionais aproximam as palavras de código das saídas do codificador e comprometem o codificador com as palavras de código escolhidas; no artigo, o segundo termo tem peso 0,25.
As grelhas de tokens resultantes alimentam um segundo modelo, geralmente um transformer, que aprende a gerá-las. O VQGAN (2021) acrescentou perdas adversariais e percetuais para obter tokens mais nítidos e tornou-se o tokenizador por trás de muitos modelos de texto para imagem. Uma falha comum é o colapso do livro de códigos, em que a maioria das palavras de código nunca é selecionada e o vocabulário efetivo diminui. A inicialização k-means, as atualizações do livro de códigos por média móvel e a reposição dos códigos não utilizados ajudam a evitá-lo. A quantização escalar finita (FSQ, 2023) da Google evita-o arredondando cada uma de algumas dimensões latentes para um pequeno número de níveis fixos, de modo que todos os códigos do livro de códigos implícito possam ser alcançados.
Quantização vetorial e termos relacionados#
- Bases de dados vetoriais: Armazenam e indexam embeddings e, muitas vezes, aplicam internamente a quantização de produto para os manter na memória.
- Redução de dimensionalidade: Mapeia vetores para menos dimensões contínuas, como faz a PCA, enquanto a VQ mapeia cada vetor para um código discreto.
- Tokenização: Divide o texto em unidades de um vocabulário fixo; a VQ cria o vocabulário equivalente para sinais contínuos, como recortes de imagens e segmentos de áudio.










