Эпоха 5 · Эра LLM · 2018

34 BERT

BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding · Devlin, Chang, Lee, Toutanova · Google · NAACL 2019
🟧 оригинал выборочно~1.5 чоригинал ↗
Суть за 20 секунд. Глубокое ДВУнаправленное предобучение трансформера-энкодера через masked LM: маскируем токены и предсказываем по контексту с обеих сторон. Затем дообучаем под задачу. Скачок на 11 NLP-бенчмарках, закрепил парадигму «pre-train → fine-tune».

Контекст

До 2018 предобучение в NLP было однонаправленным (LM слева-направо, как GPT) или мелким (word2vec). Девлин и др. делают глубокое ДВУнаправленное предобучение.

Идея и механизм

Трансформер-ЭНКОДЕР (видит всю последовательность сразу). Предобучение на двух self-supervised задачах: Masked LM — маскируем ~15% токенов и предсказываем их по контексту с ОБЕИХ сторон; Next Sentence Prediction — идут ли два предложения подряд (позже признано малополезным). Затем под задачу добавляем небольшую «голову» и дообучаем всю модель.

теория вероятностей Masked LM vs обычная языковая модель

Обычная (causal) LM моделирует P(xt | x<t) — только левый контекст; представление токена не знает, что справа. Masked LM маскирует подмножество позиций M и предсказывает их по всему остальному:

L = − Σi ∈ M log P(xi | x\M)

Поскольку x\M включает токены и слева, и справа от i, представление каждого токена становится по-настоящему двунаправленным — чего left-to-right LM достичь не может (иначе токен «увидел бы» свой ответ). Цена: токен [MASK] есть только при обучении, а на инференсе его нет (train/test несоответствие). Фирменный приём BERT — расщепление выбранных 15%: 80% → [MASK], 10% → случайный токен, 10% → оставить исходный. Подмена и «исходники» заставляют модель строить хорошее представление для каждой позиции (она не знает, настоящий ли там токен), сглаживая разрыв с инференсом.

PyTorch Лосс masked LM
import torch.nn.functional as F
# labels = −100 на немаскированных позициях → игнорируются в лоссе
def mlm_loss(logits, labels, V):
    return F.cross_entropy(logits.view(-1, V), labels.view(-1),
                           ignore_index=-100)   # только замаскированные
кошка сидит [MASK] столе предсказать: «на» контекст с обеих сторон
Masked LM прячет токен и восстанавливает его, используя слова и слева, и справа — отсюда двунаправленные представления.
Аналогия. Задача с пропущенным словом в тексте (cloze-тест): «Кошка сидит ___ столе». Чтобы вставить «на», вы читаете предложение целиком — и до, и после пропуска. BERT учится именно так, на миллиардах таких пропусков, и в процессе выстраивает глубокое понимание языка «с двух сторон».

Почему это важно

Скачок сразу на 11 NLP-бенчмарках (GLUE +7.7), закрепил «pre-train → fine-tune» как стандарт. Encoder-стиль (понимание: классификация, NER, retrieval, экстрактивный QA) — ветка, параллельная генеративным GPT; эмбеддинги BERT-семейства до сих пор работают в поиске и RAG.

Связи

← опирается на32. Transformer

BERT — это энкодерная половина трансформера, поставленная на масштабное self-supervised предобучение. Без self-attention двунаправленность была бы неэффективной; Transformer дал и архитектуру, и параллелизм для обучения на огромных корпусах.

↔ контраст35. GPT-1

Две ветви одной идеи «предобучить трансформер на тексте». BERT — encoder-only, двунаправленный, заточен под понимание; GPT — decoder-only, авторегрессионный, заточен под генерацию. Разошлись в 2018-м и определили два класса моделей.

→ ведёт к40. CLIP

Идея «предобучить энкодер на self-supervised сигнале, потом использовать представления» обобщается за пределы текста. CLIP делает то же для пары «картинка-текст», а текстовый энкодер там — прямой потомок BERT-подхода.

Вопросы пытливого ума

Почему BERT почти не используют для генерации текста?

Он двунаправленный и обучен заполнять пропуски, а не продолжать текст слева направо. Для авторегрессионной генерации нужна causal-модель (GPT), которая на каждом шаге видит только прошлое. BERT блестящ в понимании (классификация, поиск, извлечение), но генерировать связный текст по своей конструкции не предназначен.

Маскируется только 15% токенов — почему не больше, не меньше?

Компромисс. Маскировать мало — мало сигнала на проход, обучение неэффективно. Маскировать много — слишком мало контекста остаётся, задача становится нерешаемой и портит представления. 15% эмпирически балансирует «достаточно целей / достаточно контекста». Поздние работы (например, маскирование 40% в больших моделях) показали, что оптимум зависит от размера модели.

Почему NSP (next sentence prediction) потом выкинули?

Последующие работы (RoBERTa) показали, что NSP почти не помогает, а иногда вредит — задача слишком лёгкая (различить связные и случайные предложения тривиально по теме). Убрав NSP и дольше обучая MLM на большем корпусе, RoBERTa превзошла BERT. Хороший урок: не каждая «разумная» вспомогательная задача реально полезна — это надо проверять.

Что читать в оригинале

Читать ключевое — MLM и схему fine-tune; ablations и детали NSP можно пролистать (с поправкой на то, что NSP позже признали лишним).