Сижу сегодня на митинге про оптимизацию LLaMA2, и вдруг понимаю, что старинная идея использовать тандем Марковской модели языка и Арифметического кодера в качестве оптимального компрессора текстов наконец имеет все шансы стать полезной!
Поискали с коллегой по ключевым словам - опоздали ровно на год :)
LLMZip: Lossless Text Compression using Large Language Models .
Ребята молодцы, получили 0.7-0.85 бита на букву, это текущий рекорд. Причём я подозреваю (статью по диагонали читал), что они настоящий Арифметический кодер даже не гоняли - возни с ним много.
Для достаточно точной оценки длины получающегося кода можно просто циклически прогнать весь текст через токенизатор, поток токенов - через модель, выбирая на каждом шаге из выхлопного вектора of logits тот, который соответствует кодируемому токену, привести этот logit к отрицательному двоичному логарифму ожидаемой вероятности, и это уже даст длину кода в (нецелых!) битах для этого конкретного токена (свойство Арифметического кодера - вроде бы даже теорема про это доказана). Потом просто просуммировать все эти длины кода вместе, и соотнести с оригинальной длиной текста в буквах (а не токенах).
По крайней мере, я бы так сделал. Собственно, я так и сделал в своём дипломе, просто 30 лет назад ещё никаких LLM не существовало :)
Для практического применения нужно было бы использовать Chat-версию LLM, у которой есть специальный токен "текст закончился", а также какой-нибудь настоящий Арифметический кодер.
Поискали с коллегой по ключевым словам - опоздали ровно на год :)
LLMZip: Lossless Text Compression using Large Language Models .
Ребята молодцы, получили 0.7-0.85 бита на букву, это текущий рекорд. Причём я подозреваю (статью по диагонали читал), что они настоящий Арифметический кодер даже не гоняли - возни с ним много.
Для достаточно точной оценки длины получающегося кода можно просто циклически прогнать весь текст через токенизатор, поток токенов - через модель, выбирая на каждом шаге из выхлопного вектора of logits тот, который соответствует кодируемому токену, привести этот logit к отрицательному двоичному логарифму ожидаемой вероятности, и это уже даст длину кода в (нецелых!) битах для этого конкретного токена (свойство Арифметического кодера - вроде бы даже теорема про это доказана). Потом просто просуммировать все эти длины кода вместе, и соотнести с оригинальной длиной текста в буквах (а не токенах).
По крайней мере, я бы так сделал. Собственно, я так и сделал в своём дипломе, просто 30 лет назад ещё никаких LLM не существовало :)
Для практического применения нужно было бы использовать Chat-версию LLM, у которой есть специальный токен "текст закончился", а также какой-нибудь настоящий Арифметический кодер.