Vector Quantization
La cuantización vectorial sustituye cada vector por el índice de la entrada más cercana del libro de códigos. Explica los libros de códigos de k-means, la cuantización de productos y los tokens de VQ-VAE.
La cuantización vectorial (VQ) es una técnica de compresión que sustituye cada vector de un conjunto de datos por el índice de la entrada más cercana en un pequeño conjunto de vectores representativos llamado libro de códigos. La codificación solo almacena el índice; la decodificación lo busca, y el error de reconstrucción es la distancia entre el vector original y su palabra de código. Un libro de códigos de K entradas requiere log₂(K) bits por vector, independientemente de cuántas dimensiones tenga el vector, por lo que un libro de códigos de 256 entradas almacena cualquier vector en un byte. La VQ procede del procesamiento de señales: el algoritmo de Stuart Lloyd de 1957, desarrollado en Bell Labs para diseñar cuantizadores escalares y publicado en 1982, es el algoritmo que ahora suele llamarse k-means; Yoseph Linde, Andrés Buzo y Robert Gray lo ampliaron a vectores en 1980. En aprendizaje profundo, la VQ se convirtió en el método estándar para convertir imágenes, audio y vídeo en tokens para la IA generativa.
Cómo funciona la cuantización vectorial#
Un libro de códigos suele aprenderse mediante agrupamiento k-means: asigna cada vector de entrenamiento a la palabra de código más cercana, desplaza cada palabra de código a la media de los vectores asignados y repite el proceso, que nunca aumenta la distorsión media. La cuantización del color muestra el ciclo completo con los píxeles de una foto, usando el módulo scipy.cluster.vq de 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")Los 273.280 píxeles se almacenan como índices de 4 bits en una paleta de 16 colores, con seis veces menos datos de color que RGB de 24 bits y un error cuadrático medio de 11,3 niveles de intensidad sobre 255.
La cuantización escalar es el caso unidimensional, y la cuantización de modelos la aplica a las redes neuronales. Ultralytics YOLO26 la utiliza durante la exportación: quantize=8 redondea cada peso y activación por separado a uno de 256 niveles enteros, con rangos de activación observados en una pasada de calibración sobre las imágenes de data. La cuantización conjunta de vectores enteros aprovecha las correlaciones entre dimensiones, y, a la misma tasa de bits, un cuantizador vectorial óptimo nunca tiene más distorsión que un cuantizador escalar óptimo aplicado a cada valor.
Cuantización por producto y residual#
Un único libro de códigos crece exponencialmente con el presupuesto de bits, ya que 64 bits requerirían 2⁶⁴ palabras de código. La cuantización de productos, presentada por Hervé Jégou, Matthijs Douze y Cordelia Schmid en 2011, divide cada vector en m subvectores y cuantiza cada uno con su propio libro de códigos de 256 entradas. Con m = 8, una incrustación float32 de 128 dimensiones pasa de 512 bytes a 8, y las distancias a una consulta se calculan mediante pequeñas tablas de consulta. La biblioteca FAISS de Meta la combina con un índice de archivo invertido, un cuantizador k-means grueso que limita cada consulta a unos pocos clústeres, para realizar búsquedas vectoriales a escala de miles de millones.
La cuantización residual apila libros de códigos: el segundo cuantiza el error que deja el primero, el tercero el error que deja el segundo, y así sucesivamente. Los códecs de audio neuronales SoundStream (2021), de Google, y EnCodec (2022), de Meta, la utilizan para comprimir voz y música a unos pocos kilobits por segundo, y el modelado visual autorregresivo (VAR) la aplica a distintas resoluciones de imagen.
VQ-VAE y los tokens de imagen#
Aäron van den Oord, Oriol Vinyals y Koray Kavukcuoglu, de DeepMind, presentaron VQ-VAE en Neural Discrete Representation Learning en 2017. La salida del codificador de un autocodificador en cada posición espacial se sustituye por la palabra de código más cercana, y el decodificador reconstruye la entrada a partir de las palabras de código. La búsqueda del vecino más cercano no tiene gradiente, así que un estimador de paso directo copia el gradiente del decodificador a través de ella durante la retropropagación, expresada en PyTorch como z_q = z + (z_q - z).detach(). Dos términos de pérdida adicionales acercan las palabras de código a las salidas del codificador y hacen que el codificador se comprometa con las palabras de código que ha elegido; en el artículo, el segundo término tiene un peso de 0.25.
Las cuadrículas de tokens resultantes alimentan un segundo modelo, normalmente un transformer, que aprende a generarlas. VQGAN (2021) añadió pérdidas adversarias y perceptuales para obtener tokens más nítidos y se convirtió en el tokenizador de muchos modelos de texto a imagen. Un fallo habitual es el colapso del libro de códigos, en el que la mayoría de las palabras de código nunca se seleccionan y el vocabulario efectivo se reduce. La inicialización k-means, las actualizaciones del libro de códigos mediante medias móviles y el reinicio de los códigos no utilizados lo contrarrestan; la cuantización escalar finita de Google (FSQ, 2023) lo evita redondeando cada una de unas pocas dimensiones latentes a unos pocos niveles fijos, de modo que se puede acceder a todos los códigos del libro de códigos implícito.
La cuantización vectorial y otros términos relacionados#
- Bases de datos vectoriales: Almacenan e indexan incrustaciones y suelen aplicar internamente la cuantización por producto para que quepan en memoria.
- Reducción de dimensionalidad: Transforma los vectores en menos dimensiones continuas, como hace PCA, mientras que la VQ asigna cada vector a un único código discreto.
- Tokenización: Divide el texto en unidades de un vocabulario fijo; la VQ crea el vocabulario equivalente para señales continuas, como los parches de imagen y los fotogramas de audio.










