Модуль 11. Языковые модели¶
Чему вы научитесь в этом модуле
- Объяснять, что языковая модель — это распределение вероятности следующего токена, и почему обучение на этой задаче не требует ручной разметки.
- Интерпретировать перплексию как «количество равновероятных вариантов, между которыми модель колеблется на каждом шаге».
- Объяснять, что делает температура при генерации текста, и связывать её с масштабированием softmax из модуля 10.
- Объяснять, почему квантизация до 8 и 4 бит почти не ухудшает качество, и в каких случаях она его ухудшает.
- Показывать на числах, почему бенчмарк, попавший в обучающую выборку, — это утечка данных из модуля 7, и к чему это приводит при оценке.
Время: около трёх недель. Пререквизиты: модуль 10.
Ноутбук: открыть в Colab · notebooks/11-language-models.ipynb
Зачем нужен этот модуль¶
Модуль 10 закончился стопкой блоков трансформера. Обучите её предсказывать следующий токен — и вы получите языковую модель. Всё, что отличает GPT от учебного примера, — это масштаб данных, параметров и вычислительного бюджета, но не принцип. Принцип помещается в одно предложение, и оно ниже.
Этот модуль — последний в части III, и он замыкает её на модуль 1. Языковые модели соревнуются на лидербордах, а лидерборд — это витрина заявленных улучшений, и практически каждое из них проверяется столь же плохо, как и всё остальное в области. Первая половина модуля — о том, как языковые модели обучают. Вторая — о том, почему честно их оценить оказывается труднее, чем обучить.
Предобучение¶
Одна задача, из которой вырастает всё остальное: предсказать следующий токен по предыдущим.
Модель выдаёт распределение вероятности над словарём, правильный ответ — реально следующий токен, функция потерь — кросс-энтропия из модуля 5, та самая \(-\ln p\) за правильный класс. Ничего принципиально нового: последний слой трансформера — это softmax-классификатор на \(|V|\) классов, где \(|V|\) — размер словаря.
Ключевое свойство — ручная разметка не нужна. Правильный ответ уже содержится в самом тексте: это следующее слово. Терабайты текста размечают сами себя. Именно поэтому предобучение называют самообучением (self-supervised learning): метку не ставит человек, она автоматически извлекается из данных сдвигом на один токен.
Токенизация: почему не слова и не буквы
Словарь из целых слов не вмещает опечатки, редкие имена и новые термины. Словарь из отдельных букв делает последовательности длинными, а зависимости — далёкими, то есть возвращает ровно ту проблему, которую внимание решало в модуле 10. Компромисс — подслова: часто встречающиеся фрагменты («работа», «-ешь», «tion») получают собственный токен, а редкие собираются из отдельных букв. Алгоритм BPE строит такой словарь, жадно сливая наиболее частые пары символов. Отсюда следует практическое наблюдение: длина текста в токенах не равна длине в словах, и на редком языке для передачи «одного и того же смысла» требуется больше токенов.
Перплексия¶
Как измерить качество модели до какой-либо генерации текста.
Перплексия — это экспонента средней кросс-энтропии:
Читается на человеческом языке: это количество равновероятных вариантов, между которыми модель колеблется на каждом шаге. Перплексия 1 означает, что модель знает следующий токен наверняка. Перплексия 100 означает, что она колеблется, как если бы выбирала из сотни равновероятных вариантов. Хорошо предсказуемый текст на честном тестовом наборе даёт низкую перплексию, случайный текст — перплексию порядка размера словаря.
Перплексия удобна и обманчива одновременно. Она измеряет, насколько хорошо модель предсказывает текст, а не насколько она полезна. Модель может превосходно предсказывать следующий токен и при этом быть совершенно бесполезной в разговоре — и это первый разрыв между «предсказывает хорошо» и «работает хорошо», к которому мы вернёмся в разделе про оценку.
Дообучение¶
Предобученная модель умеет продолжать текст. Отвечать на вопрос в качестве помощника — это отдельный навык, и его добавляют с помощью дообучения.
Дообучение с учителем (SFT — supervised fine-tuning). Модели показывают пары «инструкция — качественный ответ» и продолжают всё то же предсказание следующего токена, но уже на этих парах. Модель перенимает формат общения: на вопрос нужно отвечать ответом, а не задавать ещё один вопрос.
Обучение на предпочтениях. Далее модели показывают пары ответов с указанием «этот лучше того» и сдвигают её в сторону предпочитаемых. Здесь курс впервые соприкасается с обучением с подкреплением: «лучше» — это по сути награда, и как только появляется награда, появляется и возможность её взлома.
Инференс и температура¶
Обученная модель на каждом шаге выдаёт распределение вероятности. Как именно из этого распределения получить конкретный текст — отдельное решение, и оно влияет на результат сильнее, чем может показаться.
Жадная стратегия — на каждом шаге брать самый вероятный токен. Безопасно и скучно: текст склонен к повторениям и ходит по кругу.
Выборка — случайно вытягивать токен в соответствии с распределением. Текст получается живее, но при полном распределении изредка выпадают нелепые варианты из длинного хвоста.
Остротой распределения управляет температура — она делит логиты перед softmax:
Это ровно та же ручка, что масштабировала внимание в модуле 10. Низкая температура \(T\) делает выбор почти жадным, высокая — размазывает распределение в сторону равномерного.
Сдвиньте ползунок. При \(T\), близкой к нулю, модель почти детерминированная и упорно повторяет самый вероятный вариант. При \(T\) около двух распределение выравнивается, выборка становится практически случайной, и текст рассыпается. Рабочий диапазон — между этими крайностями, и он подбирается в зависимости от задачи: для генерации кода — низкая температура, для свободного текста — выше.
Одна ручка, две главы. В модуле 10 деление логитов на \(\sqrt{d}\) удерживало внимание мягким. Здесь деление логитов на \(T\) удерживает генерацию управляемой. Один и тот же softmax, одна и та же острота распределения — только применённая в разных точках архитектуры.
На практике полное распределение обрезают перед выборкой: top-k оставляет \(k\) самых вероятных токенов, top-p (nucleus sampling) — минимальный набор токенов, суммарная вероятность которых покрывает порог \(p\). Хвост из нелепых, но ненулевых вариантов отсекается до того, как из распределения извлекается конкретный токен.
KV-кэш: почему инференс дешевле, чем кажется
Наивный подход потребовал бы при каждом новом токене пересчитывать внимание по всей истории заново. Однако ключи и значения уже обработанных токенов не меняются — их сохраняют в KV-кэше и переиспользуют. Отсюда практическое следствие: потребление памяти при инференсе растёт с длиной контекста, и на длинных диалогах узким местом оказывается именно кэш, а не веса модели.
Квантизация¶
Обученная модель — это гигабайты весов в формате float32. Большая часть этой точности избыточна: значимость седьмого знака после запятой в весе, который и сам по себе является приближённым, практически нулевая.
Квантизация хранит веса в 8 или 4 битах вместо 32. Потребление памяти сокращается в четыре–восемь раз, а вместе с ним снижаются и требования к видеокарте: модель, для которой ранее требовалась карта за тысячи долларов, помещается в обычную бытовую.
Почему качество при этом почти не страдает: ошибка округления одного веса мала, и при усреднении по огромному числу весов она в значительной степени компенсируется. Кроме того, сеть устойчива к малому шуму в весах — это та же устойчивость, которая позволяла SGD шуметь в модуле 4. Где качество всё же страдает: биты «работают» неравномерно, и несколько весов-выбросов несут непропорционально большую нагрузку. Грубое округление именно этих весов заметно ухудшает результат. Поэтому хорошие схемы квантизации хранят выбросы с более высокой точностью, чем основную массу весов.
В ноутбуке этот эффект измерен на биграммной модели: перплексия строится как функция числа бит. До определённого порога кривая практически не двигается, ниже — начинает расти. На игрушечной модели эффект выражен слабо, потому что предсказания и так почти детерминированные; у настоящих весов запас точности меньше, и именно поэтому в практике используются 8 и 4 бита.
Оценка, и почему она сложнее, чем кажется¶
Это главный раздел модуля, и он возвращает нас к модулю 1.
Обучить языковую модель стало рутинной процедурой. Честно утверждать, что одна модель лучше другой, — по-прежнему трудно, и труднее, чем в любой задаче, которую мы рассматривали до сих пор.
Перплексия измеряет не то, что хочется. Низкая перплексия означает, что модель хорошо предсказывает текст, а не что она полезна, правдива или безопасна. Две модели с одинаковой перплексией могут вести себя в разговоре совершенно по-разному.
Открытый ответ нечем измерить автоматически. У классификации есть правильный класс, у перевода — эталонный текст. У задания «напишите эссе» правильного ответа не существует. Отсюда набирающая популярность практика — модель-судья: один LLM оценивает ответы другого. Приём работает, но привносит собственные проблемы — судья предвзят к своему стилю, к длинным ответам, к уверенному тону. Это оценка, которую саму необходимо оценивать, и замкнуть этот круг удаётся далеко не всегда.
Бенчмарк утекает в обучающую выборку. Вот прямая связь с модулем 7. Если вопросы теста попали в обучающий корпус — а он собран из всего интернета, где эти тесты и публикуются, — модель их видела. Высокий балл в этом случае означает, что модель их запомнила, а не что она умеет решать. Это утечка данных из модуля 7, только обнаружить её значительно труднее: обучающий корпус закрыт, и проверить его содержимое невозможно.
Картинка та же, что открывала курс в модуле 1. Два числа на лидерборде, доверительные интервалы которых перекрываются, — это не «модель A лучше», а «разница не продемонстрирована». К языковым моделям это относится вдвойне: их запускают на трёх промптах вместо тридцати случайных зёрен, а результат чувствителен к формулировке промпта не меньше, чем к самой модели.
Лидерборд — ненадёжный источник истины. Заявленное превосходство LLM переживает смену промпта, честную базовую линию и проверку на утечку теста примерно так же редко, как и всё остальное в области. Как пользоваться лидербордами, не веря им слепо, — тема модуля 25. А как проверять заявление своими руками, вы уже умеете с модуля 1: величина эффекта, условия эксперимента, базовая линия.
Практическая часть¶
Часть 1. Работа с ноутбуком¶
Откройте notebooks/11-language-models.ipynb. Только numpy и matplotlib, обучения градиентным спуском нет — модель символьная и строится подсчётом частот, чтобы каждый шаг был прозрачен и считался мгновенно.
Что содержится внутри:
- Символьная модель по счётчикам: биграммы и триграммы на маленьком корпусе. Распределение следующего символа строится вручную.
- Перплексия: вычисляем её на отложенном тексте, сравниваем биграмму с триграммой. Больше контекста — ниже перплексия.
- Генерация с температурой: один и тот же текст при \(T = 0.3\), \(1.0\), \(1.6\). Наглядно видно, как жадность душит разнообразие, а высокая температура рассыпает связность.
- Квантизация таблицы логитов: перплексия как функция числа бит. Где именно кривая обваливается.
- Утечка бенчмарка: перплексия на тексте, который модель видела, в сравнении с невиданным. Разрыв — это цена загрязнения теста, посчитанная числом, а не рассказанная словами.
Часть 2. Промпт как случайное зерно¶
Возьмите любую открытую модель через готовый интерфейс и один вопрос с проверяемым ответом.
- Задайте этот вопрос пятью различными способами: разными формулировками, но с одним и тем же смыслом.
- Запишите пять ответов. Совпали ли они по существу?
- Смените температуру и повторите один и тот же промпт трижды.
- Напишите вывод: что здесь является свойством модели, а что — свойством промпта и случайного зерна.
Смысл упражнения тот же, что в модуле 1: одно наблюдение — не свойство. Промпт здесь играет роль случайного зерна.
Задание¶
- Выведите, почему кросс-энтропия за предсказание следующего токена — это и есть отрицательный логарифм правдоподобия текста.
- Реализуйте вычисление перплексии и покажите на своём тексте, что у триграммы она ниже, чем у биграммы. Объясните, почему это не означает, что триграмма «лучше» в любом смысле.
- Реализуйте выборку с top-p и покажите, при каком значении \(p\) исчезают нелепые результаты, но текст ещё не скатывается к жадной стратегии.
- Возьмите таблицу вероятностей своей модели, огрубите её до 4 и 2 бит, постройте зависимость перплексии от числа бит. Найдите точку обвала.
- Намеренно подмешайте фрагмент теста в обучающую выборку и измерьте, насколько занизилась перплексия на нём. Это ваша собственная демонстрация загрязнения бенчмарка.
Пятый пункт — тот, который невозможно списать, и он же наиболее полезный: вы своими руками получите завышенный балл на утёкших данных и увидите, насколько легко он получается.
Проверка усвоения¶
- Что предсказывает языковая модель и почему для этого не нужна ручная разметка?
- Прочитайте перплексию словами. Что означает перплексия, равная размеру словаря?
- Что делает температура и с какой ручкой из модуля 10 она совпадает?
- Чем SFT отличается от обучения на предпочтениях? Где здесь возникает понятие награды?
- Почему квантизация до 8 бит почти не ухудшает качество, тогда как несколько весов-выбросов его ухудшают?
- Почему низкая перплексия не означает, что модель полезна?
- Как загрязнение бенчмарка связано с утечкой данных из модуля 7 и почему его труднее обнаружить?
Что дальше¶
Часть III закончена: от полносвязной сети до языковой модели, и всё — на NumPy вручную, с честным сравнением на каждом шаге. В части IV появляется обучение с подкреплением, а с ним — среда, награда и политика. Мостик уже перекинут: обучение на предпочтениях из этого модуля — это по сути RL, а взлом награды, которого мы здесь коснулись, станет отдельной темой.
Языковая модель — это распределение следующего токена, обученное на тексте, который размечает сам себя. Обучить её стало просто. Честно утверждать, что она лучше другой, — нет.
Принцип
Высокий балл на бенчмарке, который был доступен в интернете, — это память, а не способность. Прежде чем верить числу с лидерборда, задайте те же вопросы, что в модуле 1: с чем сравнивают, сколько раз запускали и не видела ли модель ответ заранее.