HeadlinesBriefing favicon HeadlinesBriefing.com

¿Puede gzip ser un modelo de lenguaje? Equivalencia compresión-predicción

Hacker News •
×

Hace un tiempo escribí sobre modelado de lenguaje sin redes neuronales, donde generé Shakespeare con un modelo n-gram ilimitado: sin pesos, sin entrenamiento, solo contando. Afortunadamente, encontré el artículo 'Language Modeling is Compression', que mencionó la equivalencia compresión-predicción: cada modelo de predicción es inherentemente un compresor, y todos los algoritmos de compresión son modelos de predicción. Esto llevó a la pregunta natural: ¿puede gzip hacer modelado de lenguaje? Sin red neuronal, sin parámetros aprendidos, nada. Solo el compresor que viene con tu sistema operativo. Lo preparas con un corpus, le das un prompt de texto normal, y continúa ese prompt buscando las secuencias de bytes que mejor comprimen. Aquí tienes alguna salida real y sin editar después de prepararlo con tiny Shakespeare:

gzipt --corpus data/tinyshakespeare.txt --prompt $'MENENIUS:\n' --length 200

MENENIUS:'Though all at once canq MARCIUS: Pray now, nocamest thou to a morsel .LARTIUS: Hence, and I' the end admire, where Gagain; and after it ag .Resulta que, de alguna manera? No es exactamente texto coherente, pero claramente sabe algo sobre el texto. Mucho más de lo que esperaba que gzip supiera.

Entonces, ¿cómo puede un compresor generar esto? La compresión es predicción. Piensa en lo que hace un compresor. Gasta pocos bytes en datos que 'espera' y muchos bytes en datos que no espera. Si te doy un archivo que es la letra A repetida un millón de veces, puedes describirlo en una oración. Un millón de bytes aleatorios, por otro lado, no tienen estructura para explotar y apenas se comprimen. Esto no es una coincidencia; es el núcleo de la teoría de la información. El número de bits necesarios para codificar un símbolo es $-\log_2 p$, donde $p$ es la probabilidad que el modelo le asigna. Alta probabilidad significa pocos bits. Así que cualquier compresor tiene un modelo de probabilidad oculto dentro, ya sea que alguien lo haya escrito o no. gzip usa DEFLATE, que comprime los próximos bytes encontrando coincidencias contra el texto reciente en una ventana deslizante de 32 KiB. Si una continuación refleja algo ya en la ventana, DEFLATE la codifica como una referencia atrás barata en lugar de bytes literales. Así: Una continuación que gzip 'esperó', porque refleja texto ya en su ventana, se comprime casi a nada. Eso nos da una puntuación. Si tengo algún contexto y quiero saber qué tan buena es una continuación candidata, simplemente mido: score(candidato) = len(gzip(contexto + candidato)). Cuanto menor sea la longitud comprimida, más 'predicho' está el candidato. Para preparar el modelo, incluyo un corpus en la ventana de gzip. Cualquier continuación que se parezca al corpus se comprime pequeña, y cualquier continuación que no se parezca se comprime grande. Generación por búsqueda en haz. La puntuación es una cosa; la generación es otra. El enfoque ingenuo de elegir el siguiente byte individual que comprime mejor falla mal, y por una razón sutil: gzip solo da una longitud de byte entera (sin fracciones). Añadir un byte a menudo no cambia la longitud comprimida en absoluto, así que muchos candidatos empatan y la señal se entierra en el ruido de cuantización. La solución es mirar hacia adelante un tramo completo antes de comprometerse. gzipt ejecuta una búsqueda en haz sobre secuencias de bytes. En cada paso, el contexto actual es: ventana del corpus + cola reciente de (prompt + bytes generados). Luego gzipt prueba posibles próximos bytes. Cada continuación candidata se puntúa comprimiendo contexto + candidato y verificando cuántos bytes ocupa el resultado comprimido. El bucle es:

Prompt. Comienza con el prompt del usuario como el texto inicial para continuar. No hay token de inicio; los bytes del prompt son simplemente parte del contexto que ve gzip.

Contexto. Muéstrale a gzip la ventana del corpus más la cola reciente del prompt/texto generado.

Búsqueda. Mantén las beam_width parciales continuaciones más compresibles. Extiende cada una por cada byte que ocurre en el corpus, puntúa todas por longitud comprimida, y vuelve a podar hasta las mejores beam_width.

Repite para horizon bytes.

Confirmación. Toma la continuación completa más compresible (o muestrea entre los finalistas si la temperatura es positiva), agrégala y continúa.

...

FAQ Q: ¿Puede gzip usarse como modelo de lenguaje?

FAQ A: Sí, gzip puede funcionar como modelo de lenguaje mediante predicción basada en compresión. Al prepararlo con un corpus y usar búsqueda en haz para encontrar secuencias de bytes que compriman de manera más eficiente, gzip identifica efectivamente patrones y genera continuaciones de texto. Esto funciona porque los algoritmos de compresión construyen inherentemente modelos de probabilidad: cuando el texto refleja patrones previamente vistos, se comprime de manera más eficiente, indicando mayor predecibilidad.