Перейти к содержимому
TelegramGitHub

Machines that Think, глава 4: Большие языковые модели

Главная мысль: LLM стали возможны благодаря трём вещам: архитектуре transformer, огромному числу параметров и огромным данным. Масштаб даёт силу, но делает модели дорогими. Поэтому их сжимают, дообучают по частям и делят на экспертов. А цена создания LLM решает, кто вообще может их строить.

Путь LLM от обучения до использования: pretraining на большом тексте, затем адаптация (full finetuning или LoRA), затем сжатие (distillation, quantization), затем инференс через API или свой сервер. Сбоку цена: обучение дорого один раз, инференс стоит каждый день

Transformer появился в 2017 году (статья «Attention Is All You Need»). Attention был и раньше, но как помощник для RNN. Transformer сделал его главным механизмом.

  • Токены общаются напрямую, на любом расстоянии.
  • Весь вход обрабатывается параллельно, а не по одному слову.
  • Архитектура собрана из нескольких повторяющихся блоков.

Attention сам по себе не видит порядок. Перемешайте слова — для него ничего не изменится. Поэтому к embedding каждого токена добавляют positional encoding.

  • В оригинале использовали синусы и косинусы. Близкие позиции похожи, далёкие отличаются.
  • Сейчас часто используют RoPE: позиция встроена прямо в расчёт attention.
  • Пример: в «отчёт за май и отчёт за июнь» два слова «отчёт» начинают с одного embedding, но после позиции становятся разными.

Каждый токен превращается в три вектора:

ВекторРоль
queryЧто токен ищет в контексте
keyЧто токен может предложить другим
valueКакую информацию он передаст

Шаги:

  1. Сравниваем query одного токена с key всех токенов (dot product). Получаем оценки.
  2. softmax превращает оценки в веса. Сумма весов = 1.
  3. Складываем value всех токенов с этими весами.
  4. Получаем новое представление токена — hidden state. Оно уже учитывает контекст.

Предложение «отчёт по продажам упал». Смотрим глазами слова «упал». Оценки придуманы.

import math
tokens = ["отчёт", "по", "продажам", "упал"]
# Сырые оценки query("упал") · key(каждого токена). Числа придуманы.
scores = [2.0, 0.1, 1.5, 1.0]
def softmax(xs):
exps = [math.exp(v) for v in xs]
total = sum(exps)
return [e / total for e in exps]
weights = softmax(scores)
for t, w in zip(tokens, weights):
print(f"{t:10s} {w:.2f}")
print("сумма:", round(sum(weights), 2))
# Causal mask: токен "по" (позиция 1) не видит будущие токены
masked = [scores[0], scores[1], float("-inf"), float("-inf")]
print("с маской:", [round(v, 2) for v in softmax(masked)])

Результат:

отчёт 0.47
по 0.07
продажам 0.29
упал 0.17
сумма: 1.0
с маской: [0.87, 0.13, 0.0, 0.0]

«Упал» берёт больше всего от «отчёт» (кто упал) и почти ничего от «по». С маской токен видит только себя и прошлые токены.

Одна «голова» видит один тип связей. В языке их много: кто делает действие, где, к чему относится местоимение.

  • Несколько голов работают параллельно, у каждой свои веса для query, key, value.
  • Каждая голова сама учится смотреть на своё. Никто не задаёт это вручную.
  • Выходы голов склеивают и смешивают одним линейным слоем.

Attention работает в паре с feedforward слоем (обычный dense слой из главы 3). Чтобы глубокий стек учился стабильно, нужны две детали:

ДетальЧто делает
residual connectionДобавляет вход слоя к его выходу. Слой дополняет, а не заменяет. Ранние связи не теряются
layer normalizationВозвращает значения в нормальный диапазон. Один сигнал не забивает остальные

Без них большие модели просто не обучаются.

  • Encoder видит весь вход сразу. Каждый токен смотрит на все.
  • Decoder генерирует по одному токену. Causal mask закрывает будущие токены. Иначе модель подсмотрит ответ, как на экзамене со шпаргалкой.
  • Cross-attention связывает их: query идёт от decoder, key и value от encoder.
  • В конце линейный слой и softmax дают вероятность каждого токена из словаря.
СемействоПримерДля чего
Encoder-onlyBERTПонимание: классификация, извлечение
Encoder–decoderОригинальный transformerПеревод: вход в выход
Decoder-onlyGPTГенерация. Стал стандартом для LLM

Сейчас почти все задачи сводят к предсказанию следующего токена. Одна модель делает и перевод, и суммаризацию. Связный текст рождается из выбора вероятного продолжения шаг за шагом. Для одних это значит «модель не думает». Для других — это путь к новому виду интеллекта.

Три составляющие работают вместе:

СоставляющаяЧто даёт
ParametersЁмкость. Ширина слоёв и глубина. Модель может различать больше тонких ситуаций
Training dataКакие структуры модель вообще увидит. Разнообразие важнее повторов
ОбучаемостьАрхитектура, которая не ломается при росте
  • Модели на RNN и LSTM имели миллионы или десятки миллионов параметров. BERT — сотни миллионов. GPT-3 — сотни миллиардов.
  • Scaling laws: ошибка падает плавно и предсказуемо, если вместе растут параметры, данные и вычисления. Но каждый следующий шаг даёт меньше.
  • Больше параметров — это потолок, а не гарантия качества.
  • Transformer выиграл, потому что его вычисления — большие матричные операции. Это ровно то, что умеют GPU и TPU.

Учить модель нужно на большом масштабе. Использовать на таком масштабе часто невозможно. Поэтому модель адаптируют и сжимают.

МетодЧто меняетсяИдея
PretrainingВсе веса, с нуляПредсказание следующего токена на огромном тексте
Full finetuningВсе весаДообучение под задачу или домен. Дорого
LoRAНебольшие добавки к замороженным весамМаленькая поправка рядом с большими матрицами. Стандарт для open-source моделей
DistillationНовая маленькая модельStudent учится повторять распределение вероятностей teacher, а не только правильный ответ
QuantizationТочность чиселВеса хранятся в 8 или 4 битах вместо 16-32. Меньше памяти, быстрее
  • Pretraining похож на опыт в одном виде спорта с ракеткой: в другом такой человек учится быстрее новичка.
  • В distillation teacher показывает не только ответ, но и как он взвешивает варианты. Поэтому student учится лучше, чем с нуля.
  • Quantization не меняет структуру модели. Но грубая квантизация снижает точность. Помогает калибровка и выборочное применение.
  • Главная мысль раздела: исполнять выученное можно с меньшей точностью, чем учиться.

В обычной (dense) модели каждый параметр работает на каждом токене. С ростом модели это всё менее выгодно.

MoE меняет feedforward блок на набор независимых подсетей — экспертов:

  1. Маленькая gating network смотрит на токен.
  2. Выбирает несколько лучших экспертов (top-k) и даёт им веса.
  3. Выбранные эксперты считают параллельно, их выходы складываются.
  4. Остальные эксперты не работают и не учатся на этом токене.

Как семейный врач, который направляет пациента к нужному специалисту.

  • Специализация не задаётся руками. Она появляется сама: эксперт чаще получает похожие токены и становится в них лучше.
  • Нужен баланс. Если gate шлёт всё двум экспертам, остальные не учатся. Если поровну, специализации нет.
  • Плюс: ёмкость растёт быстрее, чем цена одного токена. Примеры: Mixtral и, по слухам, GPT-4.
  • Минус: токены идут разными путями. Batching хуже, нагрузка на железо неровная.
  • MoE обычно ставят только вместо feedforward слоёв. Attention остаётся общим.

Текст — это пересказ мира, а не сам мир. Модель может объяснить, как поменять колесо, ни разу его не видев. Но задачи с картинками, схемами, видео упираются в grounding: связь слов с реальными сигналами.

  • У каждой модальности свой encoder: текст, картинка, звук.
  • Все представления переводят в общее пространство.
  • Обучение contrastive: подпись и её картинку сближают, чужие пары разводят.
  • Потом текст может найти картинку, а картинка — повлиять на ответ.
СтратегияКакПлюсМинус
Late fusionМодальности объединяют у выходаПросто, стабильноМало взаимного влияния
Early fusionОбъединяют сразу после encoderБогатое взаимодействиеСложно, капризно в обучении
Transformer с cross-attentionОдна модальность делает запрос к другойГибко, связи учатся самиНужно много парных данных

Ограничение: модель учит, что встречается вместе, а не почему. Она связывает дым с огнём, но не знает, что огонь вызывает дым. Мультимодальность сближает язык и восприятие. Но не сближает восприятие и понимание.

ФазаЧто происходитЦена
TrainingForward и backward проходы, обновление весов на тысячах ускорителейДесятки и сотни миллионов долларов. Энергия как у небольшого города за год
InferenceТолько forward pass, веса замороженыДешевле за запрос, но платится каждый день и растёт с числом пользователей
  • Обучение — это одна большая ставка. Прервать дорого, повернуть назад почти нельзя.
  • Инференс чувствителен к задержке. Железа нужно на пик, а не на среднюю нагрузку.
  • Поэтому большинство компаний не держит frontier-модели у себя. Они используют API или небольшие open-source модели в облаке.
  • Много инноваций сейчас про то, как сделать модели дешевле, а не больше.
  • Энергия на одну операцию падает. Но общее потребление растёт, потому что растут модели и спрос.
  • Цена влияет на науку: меньше экспериментов, больше осторожных улучшений, меньше смелых идей.
  • Знания открыты: архитектуры и методы опубликованы. Барьер не в секретах, а в исполнении.
  • Полный цикл обучения frontier-модели доступен немногим компаниям. Остальные работают «ниже по течению»: адаптируют и встраивают.
  • Зависимость. Если ваш продукт стоит на чужом API, то поведение модели, цена и правила меняются без вас.
  • Неравенство знаний. Владельцы моделей видят внутренности и могут экспериментировать. Остальные судят только по выходам. Многие заявления о моделях нельзя проверить независимо.
  • Пользоваться LLM могут все. Определять, какими они будут, — единицы.
ТерминЗначение
transformerАрхитектура, где attention — главный механизм
positional encodingДобавка к embedding, которая сообщает позицию токена
self-attentionКаждый токен собирает информацию от других по весам
query, key, valueЧто ищу, что предлагаю, что передаю
multi-head attentionНесколько голов внимания параллельно, каждая видит свои связи
residual connectionВход слоя добавляется к выходу
causal maskЗапрет смотреть на будущие токены
decoder-onlyСемейство моделей, как GPT. Основа современных LLM
scaling lawsПлавный рост качества при росте параметров, данных и вычислений
LoRAДешёвое дообучение через маленькие добавки к замороженным весам
distillationМаленькая модель учится у большой
quantizationХранение весов с меньшей точностью
MoEНабор экспертов, на каждом токене работают лишь некоторые
multimodalityРабота с текстом, картинками, звуком в одном пространстве
  • Выбор модели. Число параметров не равно качеству. Сравнивайте модели на своих задачах, а не по размеру.
  • MoE и цена. У MoE-модели «полный» размер большой, а активных параметров мало. Цена и скорость ближе к активным. Но память GPU нужна под все веса, если хостите сами.
  • Промпт, LoRA или full finetuning. Начинайте с промпта и примеров. LoRA — когда нужен стабильный стиль или формат на своих данных. Full finetuning редко оправдан.
  • Quantization для своего сервера. 4-битная версия open-source модели часто помещается на одну GPU. Проверьте качество на своих примерах: точность может упасть на SQL и числах.
  • Маленькая distilled модель часто хватает для классификации тикетов, извлечения полей, разметки. Она дешевле и быстрее большой.
  • Контекст стоит денег. Attention сравнивает каждый токен с каждым. Длинный промпт — это больше вычислений, задержки и счёта. Не кладите в контекст всю схему DWH, если нужна одна таблица.
  • Зависимость от API. Модель за API может поменяться без предупреждения. Фиксируйте версию модели, храните набор тестовых промптов и прогоняйте их после обновлений.
  • Корреляция, а не причина. LLM хорошо находит, что встречается вместе. Объяснение «почему упала метрика» от модели — это гипотеза, а не вывод. Проверяйте на данных.
  1. Зачем transformer нужен positional encoding, если у RNN его не было?
  2. Что делают query, key и value? Что меняет causal mask?
  3. Чем LoRA отличается от distillation и quantization? Когда выбрать каждый метод?
  4. Почему MoE-модель дешевле в инференсе, чем dense-модель того же полного размера, и в чём её минусы?

Предыдущая: Как устроены нейросети. Следующая: Снова о человеке.