Машинное обучение
BERT, GPT и большие языковые модели
In 2018 two papers months apart (BERT in October, GPT in June) split NLP world into two camps - both turned out right. BERT for understanding, GPT for generation. Together they launched the era of foundation models.
- **Google Search** использует BERT для понимания поисковых запросов - модель определяет, что "can you get medicine for someone pharmacy" - это вопрос о получении лекарств для другого человека, а не о фармацевтике в целом, что кардинально улучшило качество результатов
- **ChatGPT** (GPT-3.5/4) обрабатывает 100+ миллионов пользовательских запросов ежедневно - от написания кода и анализа данных до creative writing, став самым быстрорастущим приложением в истории с 100M пользователей за 2 месяца
- **GitHub Copilot** (fine-tuned GPT) генерирует код в реальном времени, предсказывая следующие строки на основе контекста файла и проекта - разработчики принимают около 30% предложений, что ускоряет написание кода на 55% по данным исследований
Предварительные знания
BERT, GPT и парадигма предобучения с дообучением
2018 год окончательно принёс трансферное обучение в NLP. В июне Алек Рэдфорд с коллегами в OpenAI выпустили первый GPT: декодер Трансформера, предобученный предсказывать следующий токен на большом корпусе книг, а затем дообучаемый под каждую задачу. В октябре команда Джейкоба Девлина в Google ответила моделью BERT, энкодером Трансформера, который читал текст сразу в обе стороны и обучался на маскированном языковом моделировании, скрывая случайные слова и заставляя модель их восстанавливать. BERT за одну ночь побил рекорды на одиннадцати бенчмарках. Вместе обе работы закрепили новый рецепт: один раз предобучить большую модель на сыром тексте, а потом дёшево дообучать её под любую задачу. GPT масштабировал генеративную ветвь в сторону всё больших языковых моделей, а энкодеры в стиле BERT стали рабочей лошадкой для классификации и поиска.
BERT: предобучение
До 2018 года модели NLP обучались отдельно для каждой задачи: отдельная модель для анализа тональности, отдельная для ответов на вопросы, отдельная для NER. **BERT** (Bidirectional Encoder Representations from Transformers) предложил революционный подход: сначала **предобучить** одну модель на огромном корпусе текста, а потом **дообучить** её на конкретную задачу. Ключевая идея - BERT читает текст **в обоих направлениях одновременно** (bidirectional), в отличие от предыдущих моделей, которые читали слева направо или справа налево.
BERT использует **только encoder** из архитектуры Transformer. На вход подаётся текст с тремя типами embeddings: **token embedding** (значение слова), **segment embedding** (какое это предложение - A или B) и **position embedding** (позиция в тексте). После предобучения на 3.3 миллиарда слов (Wikipedia + BookCorpus) BERT научился "понимать" язык - распознавать синтаксис, семантику и контекст.
**BERT-base vs BERT-large:** - **BERT-base:** 12 слоёв Transformer, 768 hidden size, 12 attention heads, **110M параметров**. Обучение: 4 дня на 16 TPU v3. Подходит для большинства задач. - **BERT-large:** 24 слоя Transformer, 1024 hidden size, 16 attention heads, **340M параметров**. Даёт +2-3% accuracy, но требует в 3 раза больше памяти и вычислений. После выхода BERT появились варианты: **RoBERTa** (убрали NSP, больше данных), **ALBERT** (компактнее через sharing параметров), **DistilBERT** (дистилляция - 60% размера, 97% качества).
Главное отличие BERT от Word2Vec или GloVe: в BERT одно и то же слово получает **разные представления в зависимости от контекста**. Слово "bank" в "river bank" и "bank account" будет иметь совершенно разные векторы. Word2Vec даёт одинаковый вектор для обоих случаев. Это называется **контекстуализированные embeddings** - и именно они сделали BERT прорывом в понимании языка.
Что делает BERT при предобучении с помощью Masked Language Model (MLM)?
GPT: авторегрессивная генерация
Если BERT - это мастер **понимания** текста, то **GPT** (Generative Pre-trained Transformer) - мастер **генерации**. GPT предсказывает следующий токен, имея на входе все предыдущие. Это называется **авторегрессивная генерация**: модель генерирует текст слово за словом, и каждое новое слово зависит от всех предыдущих. GPT использует **только decoder** из Transformer (без encoder), и его attention маска не позволяет "заглядывать вперёд" - модель видит только прошлое.
GPT использует архитектуру **decoder-only Transformer**. В отличие от оригинального Transformer (encoder + decoder), GPT убирает encoder и cross-attention. Остаётся стек из masked self-attention и feed-forward слоёв. Предобучение простое: модель учится предсказывать следующий токен на огромном корпусе текста. Функция потерь - **cross-entropy** между предсказанным распределением и реальным следующим токеном.
**Эволюция GPT - масштабирование решает:** - **GPT-1** (2018): 117M параметров, 12 слоёв, обучен на BookCorpus (7000 книг). Показал, что pre-train + fine-tune работает для генерации. - **GPT-2** (2019): 1.5B параметров, 48 слоёв. OpenAI сначала не опубликовали полную модель из-за опасений misuse. Появился zero-shot - модель решает задачи без дообучения. - **GPT-3** (2020): 175B параметров, 96 слоёв, обучен на 300B токенов. Прорыв: few-shot learning через промпты. Стоимость обучения - около 4.6M. - **GPT-4** (2023): мультимодальный (текст + изображения), точные параметры не раскрыты (оценки: ~1.7T, mixture of experts). Качественный скачок в reasoning.
**Emergent abilities** - одно из самых удивительных свойств больших GPT-моделей. При увеличении размера модель внезапно начинает демонстрировать способности, которым её не обучали: арифметика, логические цепочки рассуждений, перевод на языки, которых мало в обучающих данных. Эти способности не появляются постепенно - они "включаются" при достижении определённого масштаба. GPT-3 с 175B параметрами показал few-shot learning, GPT-4 демонстрирует сложное reasoning - всё это результат масштабирования.
Почему GPT использует causal (masked) attention, а не полный bidirectional attention как у BERT?
Fine-tuning
Парадигма **pre-train + fine-tune** - фундамент современного NLP. Идея проста: сначала модель предобучается на огромном корпусе текста (миллиарды слов), изучая общие закономерности языка. Потом она дообучается (fine-tune) на **маленьком** размеченном датасете для конкретной задачи. Почему это работает? Потому что 95% знаний о языке одинаковы для всех задач: грамматика, семантика, здравый смысл. Fine-tuning только адаптирует эти знания.
Но полный fine-tuning всей модели - это дорого. Для BERT-large (340M параметров) нужно хранить и обновлять все 340M весов. Для GPT-3 (175B) полный fine-tuning практически невозможен на обычном оборудовании. Поэтому появились **эффективные стратегии** адаптации, которые обновляют только малую часть параметров.
**Стратегии fine-tuning - от простого к продвинутому:** 1. **Full fine-tuning** - обновляем ВСЕ параметры. Лучшее качество, но дорого. Подходит для BERT-base (110M). 2. **Feature extraction (freeze)** - замораживаем модель, обучаем только новый классификатор сверху. Быстро, но качество ниже. 3. **Adapter layers** - вставляем маленькие обучаемые слои между замороженными слоями Transformer. Обучаем только 2-5% параметров, качество близко к full fine-tuning. 4. **LoRA (Low-Rank Adaptation)** - вместо обновления матриц весов W, обучаем две маленькие матрицы A и B, такие что delta_W = A * B. При rank=8 это менее 1% параметров. 5. **Prefix-tuning / P-tuning** - добавляем обучаемые "виртуальные токены" перед входом. Параметров ещё меньше.
Главное преимущество fine-tuning - **малый объём данных**. Предобученный BERT достигает 93% accuracy на классификации тональности IMDB всего с 25K примеров и 3 эпохами обучения. Модель, обученная с нуля на тех же данных, едва достигает 85%. А с техниками вроде LoRA можно получить отличные результаты даже с 1000 примерами, потому что модель уже "знает" язык и нужно лишь направить эти знания на конкретную задачу.
Что делает LoRA (Low-Rank Adaptation) для эффективного fine-tuning?
Prompt Engineering
С появлением GPT-3 возникла новая парадигма: вместо fine-tuning модели на размеченных данных можно **описать задачу текстом** и получить результат. Это называется **prompt engineering** - искусство формулировать запросы так, чтобы языковая модель давала нужный ответ. Три основные стратегии: **zero-shot** (только инструкция), **few-shot** (инструкция + примеры) и **chain-of-thought** (инструкция к пошаговому рассуждению).
**System prompt** - это скрытая инструкция, которая задаёт поведение модели на протяжении всего разговора. Пользователь его не видит, но он определяет "роль" модели. Например: "You are a medical assistant. Always recommend consulting a doctor." System prompt - удобный инструмент, но не абсолютная защита: пользователь может попытаться его обойти через prompt injection.
**Temperature - контроль случайности генерации:** - **temperature=0** - модель всегда выбирает самый вероятный токен (deterministic). Для фактических вопросов, кода, анализа. - **temperature=0.3-0.5** - небольшая вариативность. Для рерайта, суммаризации, code review. - **temperature=0.7-0.9** - креативный режим. Для генерации историй, brainstorming, creative writing. - **temperature=1.0+** - высокая случайность. Результат непредсказуем, может быть бессвязным. Математически: temperature делит logits перед softmax. Низкая temperature "заостряет" распределение (топ-токен доминирует), высокая - "размывает" (все токены примерно равновероятны).
Prompt engineering - это не замена fine-tuning, а **дополнение**. Для общих задач (суммаризация, перевод, QA) промпты работают отлично. Но для специфических доменов (медицинская терминология, юридические документы, код на редком языке) fine-tuning даёт значительно лучшие результаты, потому что модель получает сотни примеров из нужного домена. Оптимальный подход часто комбинирует оба метода: fine-tuning для адаптации к домену + system prompt для контроля формата и стиля.
Prompt engineering полностью заменяет fine-tuning - достаточно правильно сформулировать запрос, и модель справится с любой задачей
Fine-tuning даёт значительно лучшие результаты для специфических доменов и форматов, потому что модель обучается на реальных примерах из целевой области, а не полагается на общие знания
Промпты ограничены длиной контекстного окна и общими знаниями модели. Для медицинской диагностики, юридического анализа или узкоспециализированных задач модель может не знать терминологию и паттерны. Fine-tuning на 1000-5000 примерах из домена встраивает эти знания в веса модели. Оптимальный подход - комбинация: fine-tuning для адаптации к домену + prompt engineering для контроля формата вывода.
Почему добавление фразы "Let's think step by step" к промпту улучшает точность GPT на математических задачах?
Итоги
- **BERT (encoder-only):** предобучается через маскирование токенов (MLM) и предсказание связности предложений (NSP), читая текст в обоих направлениях - это даёт глубокое понимание контекста для задач классификации, NER и QA
- **GPT (decoder-only):** предсказывает следующий токен авторегрессивно, видя только прошлый контекст - масштабирование от 117M до сотен миллиардов параметров порождает emergent abilities: few-shot learning, reasoning, генерация кода
- **Fine-tuning:** парадигма pre-train + fine-tune позволяет адаптировать модель к задаче с малым количеством данных - стратегии от полного обновления весов до LoRA (менее 1% параметров) делают адаптацию доступной даже на обычном GPU
- **Prompt engineering:** zero-shot, few-shot и chain-of-thought - три уровня управления моделью через текст, но для специфических доменов fine-tuning остаётся незаменимым - как и в 2018 году, BERT и GPT дополняют друг друга: понимание + генерация вместе создали фундамент foundation models
Связанные темы
BERT и GPT стоят на фундаменте Transformer и word embeddings, связывая классический NLP с эрой больших языковых моделей:
- Transformers — Архитектурная основа BERT и GPT: BERT использует encoder часть Transformer, GPT - decoder часть. Self-attention и positional encoding из оригинальной статьи 'Attention Is All You Need' лежат в основе обеих моделей
- Word Embeddings — Эволюция представления слов: Word2Vec и GloVe дают статические векторы (одно слово = один вектор), BERT создаёт контекстуализированные embeddings (один вектор для каждого употребления слова в контексте). GPT идёт дальше - генерирует новый текст из этих представлений
- Seq2Seq и Attention — Предшественник BERT и GPT: Seq2Seq с attention показал, что модель может фокусироваться на релевантных частях входа. BERT обобщил attention на весь текст (self-attention), а GPT использует causal attention для авторегрессивной генерации
- RNN и LSTM — Архитектуры, которые BERT и GPT заменили: RNN обрабатывают текст последовательно (медленно, проблема длинных зависимостей), Transformer - параллельно. BERT на задаче GLUE превзошёл лучшие LSTM-модели на 7+ процентных пунктов
Вопросы для размышления
- BERT читает текст в обоих направлениях и отлично понимает контекст, но не умеет генерировать. GPT генерирует текст, но видит только прошлое. Можно ли создать модель, которая объединяет оба подхода, и какие компромиссы это потребует?
- GPT-3 показывает emergent abilities при масштабировании до 175B параметров. Означает ли это, что увеличение размера модели - единственный путь к улучшению, или существуют альтернативные подходы (лучшие данные, архитектуры, алгоритмы обучения)?
- LoRA позволяет адаптировать модель, обучая менее 1% параметров. Почему такая маленькая доля параметров достаточна для адаптации, и что это говорит о структуре знаний внутри большой языковой модели?
Связанные уроки
- ml-36-seq2seq — LLM выросли из encoder-decoder seq2seq
- ml-31-transformers — BERT и GPT - стеки трансформеров
- ml-35-word-embeddings — Контекстные эмбеддинги заменяют статические
- ml-41-transfer-learning — Pretrain и fine-tune - это transfer learning
- aie-03-llm-fundamentals — Те же модели в основе современных LLM-приложений