Основы больших языковых моделей. BERT

Модели пост.
Сегодня хочу рассказать про первую языковую модель, с которой мне довелось познакомиться – BERT. Семья у этой модели большая, и используют ее много где, хотя по ряду параметров она уступает современным лидерам (GPT, Llama, Claude, PaLM и другим).
Некоторые специалисты даже не относят BERT к большим языковым моделям. Во-первых, она значительно меньше «типичных» больших моделей: у BERT всего 110 млн. параметров в базовой конфигурации и 340 млн. – в конфигурации large. «Всего» – это по сравнению с десятками и сотнями миллиардов параметров, которыми могут похвастаться современные большие модели. Во-вторых, BERT не предназначена для генерации текста. Типичная задача, которую она решает – классификация (разумеется, еще она может отвечать на вопросы и анализировать тональность текста, но именно для классификации ее используют чаще. Или мне просто такие статьи все время попадаются).
BERT требует обучения и не работает «из коробки», да и сам процесс обучения тоже имеет особенности, но об этом мы поговорим позже.
Я склоняюсь все же к тому, чтобы считать BERT большой языковой моделью. Изменение отношения к ней связано скорее с тем, что языковые модели развились и стали более способными, но структурно изменились не так уж сильно, чтобы составить отдельный класс. Впрочем, мнение свое никому я не навязываю.

Статья, с которой все началось

BERT – это «Bidirectional Encoder Representations from Transformers». Я не знаю, как это вменяемо перевести на русский язык так, чтобы вас не накрыло флешбеками гугл-переводчика в его ранние годы, поэтому просто объясню, что это значит.
Первое и самое важное здесь – двунаправленность (Bidirectional). В отличие от той же GPT, которая генерирует текст токен за токеном и не «видит», что будет дальше (мы разбирали этот механизм здесь), BERT видит контекст с двух сторон. Ее задача состоит в том, чтобы предсказать токен, опираясь на другие токены, которые предшествуют данному и следуют за ним. Пускай для примера токен будет словом: «Кошка <MASK> на диване». <MASK> – это токен, который надо предсказать. В то время как GPT будет знать только о существовании «кошки» и попытается предсказать следующее слово на основании этой информации, BERT будет иметь в виду, что кошка «на диване».
Одно это уже позволяет предположить некоторые сильные и слабые стороны BERT в сравнении с GPT. Но мы не будем спешить.
BERT – это трансформер (Transformers), который состоит только из кодировщика (Encoder). GPT, напротив, декодировщик (Decoder).
Representations – это векторные представления токенов, тут, думаю, все понятно. Если не совсем понятно, подробнее можно почитать здесь.
BERT была представлена миру в далеком 2018 году в статье «BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding» («BERT: предобучение глубоких двунаправленных трансформеров для понимания текста»).
На вход BERT принимает последовательность токенов, организованную специальным образом. Последовательность содержит токены-разделители [SEP] и [CLS].
[SEP] разделяет последовательность токенов, относящихся к разным предложениям: «Кошка сидит на диване [SEP] Она лежит на футболке, которую я только что постирала». Наличие такого разделителя важно, например, когда мы тренируем модель для ответов на вопросы: «Где моя только что постиранная футболка? [SEP] Она на диване под кошкой». Без разделителя BERT нас не поймет.

[CLS] стоит в начале последовательности. То есть, целиком предыдущий пример будет выглядеть так: «[CLS] Где моя только что постиранная футболка? [SEP] Она на диване под кошкой». Этот токен нужен, чтобы придержать место для векторной формы всего текста, полученного на вход. Векторное представление каждого токена (пусть будет слово для упрощения, но на самом деле BERT слова разбивает на части) включает в себя семантический вектор («смысл» слова), его позицию в предложении и информацию о том, в каком именно предложении он находится (BERT понимает это с помощью токена [SEP]).

<i>(Вот так. Обратите внимание на то, что слово «играть» – playing – разбито на части: «play» и «##ing». BERT и другие современные модели обращаются со словами примерно так)</i>
(Вот так. Обратите внимание на то, что слово «играть» – playing – разбито на части: «play» и «##ing». BERT и другие современные модели обращаются со словами примерно так)

Токен [CLS] «собирает» векторные представления всех токенов в одно представление и передает его в слой, который осуществляет классификацию. То есть, например, определяет, является ли фраза «Она на диване под кошкой» ответом на вопрос «Где моя только что постиранная футболка?». Это задача бинарной классификации, где выбирается класс «является» или «не является».
Процесс предварительного обучения выглядит так: взяли текст, спрятали некоторую часть токенов (в статье 15%) и дали BERT их предсказать. Здесь есть некоторая сложность: когда модель обучают для конкретной задачи (скажем, ответов на вопросы), там никаких скрытых токенов уже нет (а есть пары вопрос-ответ, собственно). Чтобы все работало как положено, авторы придумали маскировать токены по-разному: 80% токенов (из 15% случайно отобранных для того, чтобы спрятать) закрывали токеном [MASK], еще 10% – другим случайным токеном, и 10% оставляли неизменными.
Еще одна важная часть обучения – предсказание следующего предложения (Next Sentence Prediction, NSP). Здесь модели передавали пары предложений, где в половине случаев второе предложение логически следует за первым, а в половине второе предложение выбрано случайно и с первым не связано.

Семейство BERT

Архитектура BERT оказалась весьма успешной, так что ее много по-разному дорабатывали, получая новые, более совершенные версии. Перечислим их здесь кратко:

  • RoBERTa (Robustly Optimized BERT). Помимо того, что ее обучили на большем наборе данных, в процесс маскирования токенов добавили динамики. Мы ранее сказали, что BERT предсказывает «скрытые» токены. Обучение проходит в несколько итераций, и на каждой скрыты одни и те же токены, но BERT учитывает ошибки, сделанные на предыдущем этапе, и старается предсказать точнее. А вот у RoBERTa на каждой итерации скрытые токены меняются случайным образом (то одно слово закрыто, то другое). Это повысило стабильность и точность;
  • DeBERTa (Decoding-enhanced BERT). Изменили векторное представление слов: каждое слово представлено двумя векторами, первый из которых отвечает за содержание, второй – за позицию в тексте. Улучшили процесс предсказания скрытых токенов;
  • узкоспециализированные модели (SciBERT, BioBERT, FinBERT – адаптированы к научным публикациям, биологии и медицине, финансам соответственно. Есть и варианты, адаптированные к другим областям);
  • вариации, обученные на разных языках (в том числе мультиязычные модели);
  • уменьшенные варианты (DistilBERT, distilRoBERTa). Модели меньшего размера, которые удобнее использовать локально.

Это, конечно, не полный список, но достаточный, чтобы понять, что семья у BERT большая и применений у этих моделей немало.

Заключение

Несмотря на появление больших и мощных языковых моделей, BERT все еще остается востребованной. Она легче других (в смысле вычислительных ресурсов), быстро обучается и хорошо адаптируется к новым задачам. При наличии достаточно большого объема данных можно достичь очень достойных результатов в классификации, ответах на вопросы, выделении сущностей и анализе тональности текста.
BERT часто используют в научных исследованиях, например для юридических, научных или других специфических задач. В конце концов, не везде нужны огромные модели, чтобы получить высокую точность.

11
Начать дискуссию