Содержание курса 20 / 37

20 / 37 · Предобученные языковые модели

BERT и маскированное языковое моделирование

Энкодер нельзя обучать как языковую модель слева направо, не выдав ему ответ, поэтому BERT скрывает 15% токенов и предсказывает их по контексту с обеих сторон. Заметка приводит цель обучения, формат входа, архитектуру в числах, объясняет, что такое контекстный вектор токена, и показывает, что умеет сам по себе предобученный выходной слой маскированной языковой модели.

На этой странице 12

Каждая модель курса до сих пор обучалась на данных своей задачи. Трансформер, обученный с нуля на 120 000 новостных статей в заметке об архитектуре, не превзошёл мешок счётчиков. Неразмеченного же текста сколько угодно, и заметка о Word2Vec показала, что задача предсказания на нём даёт переиспользуемые представления. BERT (Devlin et al., 2019) применяет ту же идею к полному энкодеру трансформера: предобучить его заполнять пропуски, а затем переиспользовать всю сеть.

Обозначения. Входные токены w1:nw_{1:n}, из которых для предсказания выбирается подмножество MM; искажённый вход — w~\tilde w; выход энкодера в позиции tt — ht∈Rdh_t \in \mathbb R^d.

Отправная точка: цель языковой модели для энкодера#

Естественная задача обучения с самоконтролем — предсказание следующего токена, которое даёт модели из одного декодера из следующей заметки. Энкодер же двунаправленный: позиция tt смотрит на каждую позицию, включая t+1t + 1. Если обучать его предсказывать wt+1w_{t+1} по hth_t, сеть может скопировать ответ со входа через одну голову внимания; функция потерь уходит в ноль, и ничего не выучивается. Предсказание слева направо и двунаправленный контекст в одном стеке несовместимы.

Маскированное языковое моделирование#

Для каждой обучающей последовательности 15% позиций выбираются в MM. Входной токен в позиции из MM заменяется на [MASK] с вероятностью 0.8, на случайный токен словаря с вероятностью 0.1 и остаётся без изменений с вероятностью 0.1. Модель предсказывает исходный токен в каждой позиции из MM через softmax по словарю, а функция потерь — кросс-энтропия только по этим позициям:

LMLM=−∑t∈Mlog⁡P(wt∣w~1:n),P(⋅∣w~)=softmax⁡(Wout g(ht)),\mathcal L_{\text{MLM}} = -\sum_{t \in M} \log P(w_t \mid \tilde w_{1:n}), \qquad P(\cdot \mid \tilde w) = \operatorname{softmax}(W_{\text{out}}\, g(h_t)),

где gg — небольшое преобразование (линейный слой, GELU и LayerNorm), а WoutW_{\text{out}} связана с матрицей входных эмбеддингов. Правило 80/10/10 нужно потому, что при дообучении [MASK] никогда не встречается: если бы в немаскированных позициях модель видела только настоящие токены, она научилась бы их игнорировать, а случаи со случайным и неизменённым токеном заставляют её строить полезное представление каждой позиции.

В последовательности из 128 токенов выбирается около 19 позиций; примерно 15 из них становятся [MASK], 2 — случайным токеном и 2 остаются как были. Модель обучается на 19 предсказаниях на каждые 128 прочитанных токенов, и из-за этой доли маскированное языковое моделирование (MLM) сходится в пересчёте на токен медленнее, чем предсказание следующего токена, которое обучается на всех 128.

Рисунок

Маскированное языковое моделирование на одном предложении

Схема маскированного языкового моделированияПредложение the cat sat on the warm mat. На входе cat заменён на [MASK], warm — на случайный токен blue, mat оставлен как есть. Двунаправленный энкодер предсказывает в этих трёх позициях cat, warm и mat; функция потерь считается только по ним.текствходэнкодерцельвыбор 15%thethe—cat[MASK]catsatsat—onon—thethe—warmbluewarmmatmatmatдвунаправленный энкодер: каждая позиция видит все остальные[MASK] (80%)случайный токен (10%)без изменений (10%)потери: −log P(cat) − log P(warm) − log P(mat) — только по выбранным позициямСхема маскированного языкового моделированияПредложение the cat sat on the warm mat. На входе cat заменён на [MASK], warm — на случайный токен blue, mat оставлен как есть. Двунаправленный энкодер предсказывает в этих трёх позициях cat, warm и mat; функция потерь считается только по ним.текствход · выбор 15% позицийцельthethe—cat[MASK]catsatsat—onon—thethe—warmbluewarmmatmatmatдвунаправленный энкодер[MASK] (80%)случайный токен (10%)без изменений (10%)потери: −log P(cat) − log P(warm) − log P(mat),только по выбранным позициям
Из каждой обучающей последовательности случайно выбирается 15% позиций (здесь три из семи, чтобы показать все три случая). Выбранный токен на входе заменяется на [MASK] с вероятностью 0.8, на случайный токен словаря с вероятностью 0.1 и остаётся прежним с вероятностью 0.1. Энкодер видит всё предложение в обе стороны и в каждой выбранной позиции предсказывает исходный токен; функция потерь — кросс-энтропия только по этим позициям, остальные позиции её не дают. Случайная замена и оставленный токен заставляют модель строить полезное представление каждой позиции, ведь при дообучении [MASK] не встречается.

BERT предобучается и на второй задаче — предсказании следующего предложения (next-sentence prediction): на вход подаются два фрагмента, и классификатор на первой позиции предсказывает, шёл ли второй за первым в корпусе. Позже выяснилось, что она не нужна (Liu et al., 2019); от неё остался формат входа BERT.

Вход#

Вход BERT — [CLS] фрагмент A [SEP] фрагмент B [SEP], дополненный до длины батча. Суммируются три таблицы эмбеддингов: токенов (WordPiece, 30 522 записи у английской модели без учёта регистра), позиций (выученная таблица из 512 строк, так что 512 токенов — жёсткий максимум) и сегментов (token_type_ids, 2 строки, отмечающие A или B). Сумма нормализуется и подаётся в энкодер. [CLS] — токен без содержания, выходной вектор которого через предсказание следующего предложения обучается подытоживать пару; это условная «ручка» для задач уровня предложения.

Архитектура в числах#

BERT-base — это 12 блоков энкодера post-norm с d=768d = 768, 12 головами ширины 64, dff=3 072d_{\text{ff}} = 3\,072 и GELU:

КомпонентПараметры
Эмбеддинги токенов 30 522×76830\,522 \times 76823.4 млн
Эмбеддинги позиций 512×768512 \times 7680.4 млн
12 блоков × 12d212 d^284.9 млн
Пулер (один линейный слой на [CLS])0.6 млн
Всего≈ 110 млн

Арифметика та же, что в заметке об архитектуре. BERT-large удваивает глубину и расширяется до 1024 (340 млн). Предобучение шло на 3.3 млрд слов из книг и Википедии; получившаяся контрольная точка общедоступна и загружается одной строкой.

От статических к контекстным эмбеддингам#

Выход hth_t — это вектор для токена tt в этом предложении. Он вычислен двенадцатью раундами внимания по всем остальным токенам, поэтому от них зависит. Слово bank получает разные векторы в «river bank» и «bank account»; вектор Word2Vec из заметки об эмбеддингах был один на оба случая. В этом смысле предобученный энкодер даёт контекстные эмбеддинги (contextual embeddings), и поэтому одна и та же сеть полезна для задач, с которыми статические векторы справиться не могли:

  • Вектор токена можно классифицировать линейным слоем, чтобы присвоить ему тег (заметка о NER) или отметить его как начало или конец ответа (заметка о QA).
  • Вектор [CLS] или среднее всех векторов дают по одному вектору на предложение, и их можно сравнивать по косинусному сходству. Но одно усреднение не даёт полезной геометрии: сырые векторы [CLS] BERT плохо упорядочивают пары предложений, и осмысленное пространство предложений требует обучения на уровне предложений, обычно контрастного (заметка о сходстве предложений). На таком обученном пространстве и строит поиск заметка о семантическом поиске.
  • Весь стек можно дообучить на размеченной задаче; это измеряет заметка о переносе обучения.
Рисунок

Модель из одного энкодера: контекстный вектор на каждый токен и два вида выходных слоёв

Трансформер из одного энкодера с выходным слоем для предложения и для токеновЧетыре токена внизу идут в полосу эмбеддингов, затем в полосу блоков энкодера, затем в четыре выходных вектора. Первый выходной вектор направлен в блок linear + softmax, дающий метку предложения. Небольшие стрелки над средними выходными векторами обозначают метки токенов.[CLS]riverbank[SEP]эмбеддинги токенов + позицийL × блок энкодераself-attention по всем токенам, полносвязный блокh1h2h3h4метки токеновlinear + softmaxметка предложенияТрансформер из одного энкодера с выходным слоем для предложения и для токеновЧетыре токена внизу идут в полосу эмбеддингов, затем в полосу блоков энкодера, затем в четыре выходных вектора. Первый выходной вектор направлен в блок linear + softmax, дающий метку предложения. Небольшие стрелки над средними выходными векторами обозначают метки токенов.[CLS]riverbank[SEP]эмбеддинги токенов + позицийL × блок энкодераself-attention по всем токенам, полносвязный блокh1h2h3h4метки токеновlinear + softmaxметка предложения
Входные токены с [CLS] впереди и [SEP] в конце превращаются в эмбеддинги токенов и позиций и проходят через L блоков энкодера, где каждая позиция смотрит на каждую. На выходе — вектор на каждый токен, зависящий от всего предложения: вектор bank здесь не тот, что в bank account. Вектор [CLS] (или среднее всех векторов) читается линейным слоем с softmax для метки всего предложения; отдельные векторы читаются линейным слоем каждый для меток токенов, например тегов сущностей или границ фрагмента-ответа.

Что содержат эти векторы — эмпирический вопрос, который изучают зондированием (probing): нижние слои несут в основном лексическую и синтаксическую информацию, верхние — более семантическую и связанную с задачей (Tenney, Das and Pavlick, 2019).

Что умеет предобученный выходной слой#

Выходной слой MLM сам по себе — пригодная модель. Подадим Elephants are playing in the zoo with monkeys. The story is about [MASK]. и прочитаем распределение в маскированной позиции:

ТокенPP
elephants0.216
monkeys0.109
animals0.086
elephant0.039
children0.022

Наверху — сущности предложения и их гипероним, прочитанные из модели, которой никогда не говорили, что такое «story», и не задавали вопросов. Это механизм zero-shot-использования BERT: задача классификации переформулируется как заполнение пропуска, а ответ читается из словаря; заметка о переносе обучения запускает это на AG News и находит и обещание, и пределы такого подхода. Конвейер fill-mask из библиотеки transformers объединяет токенизацию, модель и чтение top-kk в один вызов и возвращает те же числа.

Что изменилось#

Трансформер, обученный на задачеПредобученный энкодер
Обучающие данныеМетки задачи (от тысяч до миллионов)Неразмеченный текст (миллиарды токенов)
Цель обученияФункция потерь задачиЗаполнение маскированных токенов
Представление токенаВыучено для этой задачиКонтекстное, переиспользуемое
НаправлениеЛюбоеДвунаправленное
ИспользованиеОдна задачаПризнаки, zero-shot, дообучение
Цена для пользователяПолное обучениеСкачать 110 млн параметров

Ограничения#

  • Нет порождения. Энкодер предсказывает скрытые токены по остальным; продолжить текст он не может. Модели из одного декодера из следующей заметки могут.
  • Расхождение предобучения и дообучения. [MASK] встречается только при предобучении; правило 80/10/10 сокращает этот разрыв, но не убирает.
  • Неэффективность по примерам. Функцию потерь дают только 15% позиций, поэтому каждая последовательность приносит мало обучающих сигналов.
  • 512 токенов. Выученная таблица позиций фиксирует максимальную длину.
  • Статичный словарь и регистр. bert-base-uncased не отличает US от us; вариант с учётом регистра отличает ценой большего эффективного словаря.
  • Нужна адаптация. Прямо из коробки путь zero-shot слаб; ценность модели проявляется после дообучения или когда её векторы подаются в другую модель.

Что нужно запомнить#

  • MLM: скрыть 15% токенов (80% [MASK], 10% случайный, 10% без изменений), предсказать их с полным двунаправленным вниманием, функция потерь — только по маскированным позициям.
  • Вход: [CLS] A [SEP] B [SEP] с эмбеддингами токенов, позиций и сегментов; не больше 512 позиций.
  • BERT-base: 12 блоков, d=768d = 768, 12 голов, ≈ 110 млн параметров, из них 85 млн в блоках.
  • Выходные векторы контекстные: один вектор на токен в каждом предложении, пригодный для разметки, извлечения фрагментов, сходства предложений и дообучения.
  • Выходной слой MLM отвечает на промпты с пропуском без всякого обучения на задаче — это zero-shot-использование.

Ноутбук#

week06_BERT.ipynb. Номера ячеек считают все ячейки, включая текстовые, начиная с 1. Приведённые числа взяты из прогона, сохранённого в курсе; у ячеек, изменённых с тех пор под текущие версии библиотек, сохранённого выхода нет.

  • Ячейки 3–6 загружают AG News и токенизируют его bert-base-uncased; напечатанный пример показывает идентификаторы [CLS] (101) и [SEP] (102) вокруг текста.
  • Ячейка 9 загружает AutoModel.from_pretrained('bert-base-uncased') и печатает дерево модулей, по которому составлена таблица выше: три таблицы эмбеддингов, 12 слоёв BertLayer с вниманием ширины 768 и промежуточным слоем ширины 3072 и пулер.
  • Ячейка 12 загружает AutoModelForSequenceClassification с 10 метками и показывает предупреждение, что веса классификатора инициализированы заново: выходные слои задач не входят в контрольную точку.
  • Ячейки 18–23 загружают выходной слой MLM (AutoModelForMaskedLM), строят промпт про слонов, берут softmax в позиции [MASK] (индекс −3) и печатают 10 самых вероятных токенов, приведённых выше.
  • Ячейки 26–30 повторяют то же через конвейер fill-mask и получают те же вероятности.

Дальше#

Предобученный энкодер представляет текст, но не пишет его. Следующая заметка обучает компоновку с декодером на простой цели предсказания следующего токена из n-граммной заметки, только в большом масштабе, и смотрит, что делает такая модель по промпту, как её вероятности превращаются в текст и почему результат — продолжатель текста, а не ассистент.

Литература#