HeadlinesBriefing favicon HeadlinesBriefing.com

O gzip pode ser um modelo de linguagem? Equivalência compressão-predição

Hacker News •
×

Há algum tempo escrevi sobre modelagem de linguagem sem redes neurais, onde gerei Shakespeare com um modelo n-gram ilimitado: sem pesos, sem treinamento, apenas contando. Felizmente, encontrei o artigo 'Language Modeling is Compression', que mencionou a equivalência compressão-predição: todo modelo de predição é intrinsecamente um compressor, e todos os algoritmos de compressão são modelos de predição. Isso levou à pergunta natural: o gzip pode fazer modelagem de linguagem? Sem rede neural, sem parâmetros aprendidos, nada. Apenas o compressor que vem com seu sistema operacional. Você o prepara com um corpus, dá a ele um prompt de texto normal, e ele continua esse prompt procurando pelas sequências de bytes que melhor comprimem. Aqui está alguma saída real e não editada após prepará-lo com 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 .Descobre-se que, de certa forma? Não é exatamente texto coerente, mas claramente sabe algo sobre o texto. Muito mais do que eu esperava que o gzip soubesse.

Então, como um compressor pode gerar isso? A compressão é predição. Pense no que um compressor faz. Ele gasta poucos bytes em dados que ele 'espera' e muitos bytes em dados que ele não espera. Se eu lhe der um arquivo que é a letra A repetida um milhão de vezes, você pode descrevê-lo em uma frase. Um milhão de bytes aleatórios, por outro lado, não têm estrutura para explorar e quase não comprimem. Isso não é coincidência; é o núcleo da teoria da informação. O número de bits necessários para codificar um símbolo é $-\log_2 p$, onde $p$ é a probabilidade que o modelo lhe atribui. Alta probabilidade significa poucos bits. Portanto, qualquer compressor tem intrinsicamente um modelo de probabilidade escondido dentro dele, independentemente de alguém ter escrito ou não. O gzip usa o DEFLATE, que comprime os próximos bytes encontrando correspondências com o texto recente em uma janela deslizante de 32 KiB. Se uma continuação ecoar algo já presente na janela, o DEFLATE a codifica como uma referência para trás barata em vez de bytes literais. Assim: uma continuação que o gzip 'esperou', porque ecoa texto já presente em sua janela, é comprimida quase até nada. Isso nos dá uma pontuação. Se eu tiver algum contexto e quiser saber o quão bom é um candidato a continuação, eu simplesmente medimos: score(candidato) = len(gzip(contexto + candidato)). Quanto menor o comprimento comprimido, mais 'previsto' o candidato é. Para preparar o modelo, incluo um corpus na janela do gzip. Qualquer continuação que se pareça com o corpus é comprimida pequena, e qualquer continuação que não se pareça com o corpus é comprimida grande. Geração por busca em feixe. A pontuação é uma coisa; a geração é outra. A abordagem ingênua de escolher o próximo byte individual que melhor comprime falha miseravelmente, e por uma razão sutil: o gzip só fornece um comprimento de byte inteiro (sem frações). Adicionar um byte frequentemente não altera o comprimento comprimido em absoluto, então muitos candidatos empatam e o sinal se perde no ruído de quantização. A solução é olhar para um intervalo completo antes de se comprometer. O gzipt executa uma busca em feixe sobre sequências de bytes. Em cada passo, o contexto atual é: janela do corpus + cauda recente de (prompt + bytes gerados). Então o gzipt tenta bytes seguintes possíveis. Cada continuação candidata é pontuada comprimindo contexto + candidato e verificando quantos bytes o resultado comprimido ocupa. O loop é:

Prompt. Comece com o prompt do usuário como o texto inicial para continuar. Não há token de início; os bytes do prompt são apenas parte do contexto que o gzip vê.

Contexto. Mostre ao gzip a janela do corpus mais a cauda recente do prompt/texto gerado.

Busca. Mantenha as beam_width parciais continuações mais comprimíveis. Estenda cada uma por cada byte que ocorre no corpus, pontue todas pelo comprimento comprimido, e depois reduza novamente para as melhores beam_width.

Repita para os bytes de horizon.

Compromisso. Pegue a continuação completa mais comprimível (ou amostre entre os finalistas se a temperatura for positiva), anexe-a e continue.

...

FAQ Q: O gzip pode ser usado como modelo de linguagem?

FAQ A: Sim, o gzip pode funcionar como modelo de linguagem por meio de predição baseada em compressão. Ao prepará-lo com um corpus e usar busca em feixe para encontrar sequências de bytes que comprimam de forma mais eficiente, o gzip identifica efetivamente padrões e gera continuações de texto. Isso funciona porque os algoritmos de compressão constroem intrinsecamente modelos de probabilidade — quando o texto ecoa padrões previamente vistos, ele comprime de forma mais eficiente, indicando maior previsibilidade.