Обнаружен дефект штрафа за повтор в LLM: он ломает структурированный вывод

Учёные обнаружили серьёзный дефект в реализации штрафа за повторение токенов (repetition penalty), используемого в таких движках, как HuggingFace, vLLM и llama.cpp. Проблема связана с тем, что штраф ветвится в зависимости от знака каждого сырого логита, однако softmax инвариантен к сдвигу на константу, поэтому нулевая точка логитов произвольна. Это приводит к двум негативным последствиям.
Во-первых, сам штраф становится неопределённым: сдвиг логитов на константу при theta=1 не меняет результат, но при theta=1,3 меняет 58-96% жадных токенов. Разные модели имеют различные нулевые точки, поэтому одинаковый параметр repetition_penalty действует на каждую модель по-своему.
Во-вторых, штраф разрушает структурированный вывод. Измерения на 200 реальных JSON-схемах показали, что при theta=1,3 доля валидного вывода падает с 97% до 23%. Это делает инструменты, полагающиеся на гарантированный формат (например, извлечение данных), ненадёжными.
В качестве решения предложено применять штраф к нормализованным лог-вероятностям, а не к сырым логитам. HuggingFace уже предоставляет соответствующий оператор (LogitNormalization), но по умолчанию он выключен и применяется после штрафа. Исследователи рекомендуют изменить порядок и включить нормализацию.
В работе приведены измерения на пяти моделях до 7B параметров (базовых и RLHF) на префиксах WikiText-103, а также на двух моделях кода на HumanEval и JSONSchemaBench. Эффект воспроизведён как в HuggingFace, так и в vLLM и llama.ccp через их собственные сэмплеры.
Хотя проблема широко распространена, её исправление не требует сложных изменений — достаточно включить нормализацию логарифмов до применения штрафа. Разработчикам рекомендуется обновить настройки движков, чтобы обеспечить корректную работу штрафа повторения и сохранность структурированного вывода.







