Penalidade LZ: a penalidade baseada em LZ77 ajuda modelos de linguagem a evitar repetições em loop sem perda de qualidade

7 setembro 20268 visualizações

Uma nova abordagem usa comprimentos de códigos de compressão LZ77 para descartar fragmentos bem comprimíveis durante a decodificação. Com isso, os modelos podem operar em modo guloso sem repetições degenerativas, enquanto penalidades padrão erram em 4% dos casos.

Penalidade LZ: a penalidade baseada em LZ77 ajuda modelos de linguagem a evitar repetições em loop sem perda de qualidade

Problema: modelos de linguagem entram em loop

Modelos de linguagem autorregressivos geram texto um token por vez, com base nas palavras já escritas. Esse processo quase inevitavelmente leva a repetições degenerativas: o modelo começa a reproduzir infinitamente a mesma frase ou cadeia de frases. Isso acontece com frequência especialmente em textos curtos, raciocínios matemáticos ou cadeias lógicas, onde o modelo "fica preso" em um loop local.

Os métodos padrão de combate — penalidade de frequência (frequency penalty) e penalidade de repetição (repetition penalty) — funcionam apenas parcialmente. Eles corrigem a distribuição de probabilidades na etapa de decodificação, mas não levam em conta a estrutura dos padrões repetitivos. Como resultado, mesmo em sistemas modernos, a taxa de queda em repetição em loop chega a vários por cento — isso é difícil de notar em respostas curtas, mas é crítico para raciocínios longos.

Não basta punir a frequência: é preciso teoria da informação

A frequency penalty reduz a probabilidade de tokens que já apareceram no texto, e a repetition penalty adicionalmente diminui o peso de sequências já emitidas. Mas ambas as abordagens usam heurísticas que não têm relação com a forma como o modelo entende a estrutura do texto. Elas podem suprimir repetições úteis (por exemplo, a repetição de uma conclusão importante) e, ao mesmo tempo, deixar passar padrões longos em loop compostos por palavras diferentes.

Uma visão mais fundamentada é oferecida pela teoria da compressão de dados. Se uma sequência é bem comprimida por um algoritmo como o LZ77, isso significa que ela contém pouca informação nova — e, do ponto de vista da previsão, é "previsível" e perigosa para a geração. É lógico punir o modelo por escolher tais padrões, em vez de simplesmente punir a repetição de palavras individuais.

O que é LZ77 e como é construída a penalidade baseada nele

LZ77 é um dos algoritmos clássicos de compressão sem perdas. Ele substitui fragmentos repetidos por referências a ocorrências anteriores: em vez de escrever a string inteira, o algoritmo armazena o deslocamento e o comprimento. Como resultado, cada porção de texto recebe um "comprimento de código" — o número mínimo de bits necessário para representá-la. Quanto mais previsível é o fragmento, mais curto é o seu código.

Os autores do LZ penalty propuseram usar esse comprimento como uma medida de redundância diretamente durante a decodificação. A cada passo, o modelo calcula as probabilidades de todas as continuações possíveis, e cada uma delas é adicionalmente avaliada do ponto de vista de quanto ela aumenta a compressibilidade de toda a sequência gerada. Continuações que levam a estruturas repetitivas longas recebem uma penalidade aumentada.

Curiosamente, essa abordagem decorre naturalmente da dualidade entre previsão e compressão: um bom compressor é simultaneamente um bom previsor, e vice-versa. A decodificação com LZ penalty pode ser interpretada como uma amostragem de uma distribuição residual, da qual já foi removida a informação que o compressor prevê com sucesso. Em outras palavras, o modelo é forçado a produzir não as continuações mais "fáceis" para ele, mas aquelas que contêm informação realmente nova.

Implementação prática: a penalidade é adicionada antes da escolha do token

No nível do código, o LZ penalty é facilmente integrado ao processo de decodificação gulosa. Após cada passo, a hipótese atual de continuação é comprimida por um codificador semelhante ao LZ77, e a diferença no comprimento do código é levada em conta no logaritmo da probabilidade. É importante que a penalidade não exija treinamento ou ajuste fino do modelo — ela funciona na etapa de inferência.

Isso torna o método universal: pode ser aplicado a qualquer modelo autorregressivo, sem alterar a arquitetura e sem tocar nos pesos.

Resultados: ausência de repetições degenerativas com temperatura zero

O principal resultado declarado pelos autores é que o LZ penalty permite que modelos abertos modernos raciocinem com decodificação gulosa (temperatura zero) sem perda de capacidades. Normalmente, com temperatura zero, o modelo sempre escolhe o token mais provável, o que torna o loop especialmente provável. É por isso que, na prática, frequentemente se usa amostragem aleatória com temperatura acima de zero e penalidades — mas isso introduz aleatoriedade desnecessária na geração e pode reduzir a qualidade.

Com o LZ penalty, a necessidade de tais artifícios desaparece. A decodificação gulosa deixa de ser uma fonte de repetições degenerativas, e o modelo permanece focado na resolução da tarefa. Ao mesmo tempo, as capacidades do modelo para inferência lógica, matemática e codificação não se deterioram — a penalidade atua apenas contra a redundância, sem afetar a parte semântica da geração.

Para comparação: nos experimentos, os mesmos modelos com frequency penalty e repetition penalty, em vários casos, demonstraram até 4% de quedas em repetições em loop. Isso pode parecer um número pequeno, mas para respostas longas ou cadeias de raciocínio, cada uma dessas quedas desvaloriza completamente o resultado.

Por que o LZ penalty funciona melhor que heurísticas

A diferença fundamental em relação à penalidade de frequência ou repetição está na capacidade de reagir à estrutura, e não a tokens individuais. Heurísticas, em geral, punem todas as repetições igualmente, independentemente do comprimento do padrão. O LZ penalty é sensível ao comprimento da sequência repetida: quanto mais longa e exata a repetição, maior a penalidade. Repetições curtas, que não formam um padrão, são punidas fracamente ou não são punidas.

Isso é importante para a linguagem natural. O modelo pode legitimamente repetir a palavra "portanto" em diferentes partes do raciocínio, e isso não deve ser bloqueado. Mas se o modelo começa a gerar a mesma cadeia de argumentos repetidamente, o LZ penalty perceberá a redução no comprimento do código e interromperá o processo.

Como resultado, o LZ penalty elimina o dilema entre qualidade e segurança do texto: não é preciso escolher entre "razoável, mas em loop" e "diverso, mas incoerente".

Conclusões práticas

Para desenvolvedores e pesquisadores, o LZ penalty é uma ferramenta pronta que não exige alterações no modelo. Basta adicioná-lo ao pipeline de inferência para obter uma geração estável sem repetições degenerativas. Isso é especialmente relevante para modelos de raciocínio open-source, usados em cenários com respostas longas e alta exigência de determinismo.

Permanece em aberto a questão da eficiência: a compressão a cada passo exige cálculos adicionais. Os autores não discutem a complexidade no trabalho apresentado, mas é de se esperar que, no futuro, surjam versões otimizadas que funcionem em GPU e sejam integradas a bibliotecas populares de decodificação.

Limitações e observações

No artigo, são observadas pequenas correções pós-publicação relacionadas a imprecisões nos cálculos — isso demonstra a atenção dos autores aos detalhes e não afeta a essência da abordagem proposta. Como qualquer método, o LZ penalty não é uma bala de prata: ele resolve o problema específico das repetições, mas não aborda, por exemplo, a veracidade factual ou a coerência lógica da geração.

Ainda assim, a própria ideia de usar o comprimento do código de compressão como uma medida da informatividade da continuação parece elegante e promissora. Ela conecta a teoria da informação à prática da geração de textos e oferece o que heurísticas simples não conseguem: a compreensão de quando a repetição é ruído e quando é um sinal de degradação do modelo.

Perguntas mais frequentes

Penalidade LZ: a penalidade baseada em LZ77 ajuda modelos de linguagem a evitar repetições em loop sem perda de qualidade