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

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

Перенос обучения в NLP

Три способа использовать один предобученный энкодер на одной задаче, измеренные на AG News: промпт с пропуском без обучения (46%, а с названием метки, выбранным по тестовым статьям, — 61%), замороженные векторы [CLS] под логистической регрессией (90%) и полное дообучение (95% на отложенной десятой части обучающей выборки). Заметка объясняет, что переносит каждый способ и чего он стоит.

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

У курса один сквозной бенчмарк: классификация AG News по четырём темам, где TF-IDF набрал 0.918, а каждая модель, обученная с нуля, — меньше. Предобученный энкодер меняет вопрос с «какая архитектура» на «как использовать то, что выучено на 3 млрд слов». Эта заметка пробует три стандартных ответа на одной и той же модели и одних и тех же данных в порядке роста цены и получает первый результат выше базового уровня — с оговоркой о разбиениях, которую разбирает сравнение ниже.

Обозначения. Предобученный энкодер fθf_\theta отображает последовательность токенов в векторы h1,…,hnh_1, \dots, h_n; hCLSh_{\text{CLS}} — вектор в первой позиции. Выходной слой задачи gϕg_\phi отображает вектор в логиты. «Заморожен» значит, что θ\theta не обновляется.

Отправная точка: предобученная модель как чёрный ящик#

Контрольная точка — это набор весов и токенизатор. С ней можно сделать три вещи, не обучая с нуля: задавать ей вопросы на её собственном языке (промптинг), читать её выходы как признаки для другой модели или продолжить её обучение на задаче. Каждый способ переносит свою часть того, чему научило предобучение.

Рисунок

Три способа использовать один предобученный энкодер

Zero-shot, замороженные признаки и полное дообучениеzero-shot: заполнение пропуска: статья + шаблон → BERT заморожен → выход MLM, 4 слова-метки; 0.613. замороженные признаки: статья → BERT заморожен → лог. регрессия по [CLS]; 0.902. полное дообучение: статья → BERT обучается → линейный слой по [CLS]; 0.949. TF-IDF 0.918.zero-shot: заполнение пропускастатья +шаблонBERTзамороженвыход MLM,4 слова-метки0.613замороженные признакистатьяBERTзамороженлог. регрессияпо [CLS]0.902полное дообучениестатьяBERTобучаетсялинейный слойпо [CLS]градиент0.949TF-IDF 0.918Zero-shot, замороженные признаки и полное дообучениеzero-shot: заполнение пропуска: статья + шаблон → BERT заморожен → выход MLM, 4 слова-метки; 0.613. замороженные признаки: статья → BERT заморожен → лог. регрессия по [CLS]; 0.902. полное дообучение: статья → BERT обучается → линейный слой по [CLS]; 0.949. TF-IDF 0.918.zero-shot: заполнение пропускастатья +шаблонBERTзамороженвыход MLM,4 слова-метки0.613замороженные признакистатьяBERTзамороженлог. регрессияпо [CLS]0.902полное дообучениестатьяBERTобучаетсялинейный слойпо [CLS]градиент0.949TF-IDF 0.918
Одна и та же модель bert-base-uncased на AG News. Zero-shot ничего не обучает: к статье дописывается шаблон с [MASK], и ответом служит то из четырёх слов-меток, которое выходной слой MLM считает самым вероятным. Замороженные признаки обучают только логистическую регрессию поверх вектора [CLS]. Полное дообучение обучает и выходной слой, и весь энкодер (красная стрелка — градиент, проходящий в энкодер) с маленьким шагом обучения. Справа — доля правильных ответов; пунктир отмечает базовый уровень TF-IDF, 0.918 на тесте. Выше него лежит только последний путь, но его столбец — доля верных на отложенной десятой части обучающей выборки, а столбец zero-shot получен со словом-меткой, выбранным по тестовым статьям, так что оба сравнения ориентировочные. Серые блоки заморожены, цветные обучаются.

Zero-shot-классификация через выходной слой MLM#

Что переносится: умение модели заполнить пропуск правдоподобным словом, показанное в заметке о BERT.

Допишем к каждой статье шаблон This news is about [MASK]. и прочитаем распределение MLM в маскированной позиции, ограниченное четырьмя словами-кандидатами, по одному на класс: world, sports, business, technology. Предсказание — кандидат с наибольшей вероятностью. Ни один параметр не обучается; «обучение» — это выбор шаблона и слов.

ПостановкаДоля верных
Метки world / sports / business / technology0.456
по классам: World 0.03, Sports 0.51, Business 0.96, Sci/Tech 0.32
Метки politics / sports / business / technology, выбранные по тестовым статьям0.613

Первый результат похож на слабый классификатор; числа по классам говорят, что он сломан. Почти каждая статья World получает другую метку, потому что world — не то слово, которым завершают «This news is about ___» для статьи о выборах. Если посчитать 100 самых вероятных заполнителей модели по 1900 тестовым статьям World, чаще всего встречаются us, it, america, me, you, politics и news; если отбросить местоимения, естественная метка — politics или название страны. Замена world на politics поднимает долю правильных ответов с 0.456 до 0.613 без всяких других изменений. Метод работает в той мере, в какой название класса — это слово, которое модель употребила бы естественно, а это свойство шаблона и словаря, а не статей.

0.613 получено с подсказкой от теста. Новое слово нашли, читая заполнители тестовых статей World и ошибки по классам на тесте, а затем оценили на том же тесте. Выбор, сделанный с оглядкой на оценочные данные, оптимистичен, и насколько — этот прогон измерить не может. Чистый протокол выбирает шаблон и слова-метки на отдельной выборке для разработки (чтобы посчитать заполнители, хватит нескольких сотен размеченных обучающих статей) и оценивает на тесте один раз. Здесь 0.456 — единственное zero-shot-число, полученное без взгляда на тестовые метки; 0.613 показывает, насколько важно слово-метка, а не то, чего стоит ждать от zero-shot-классификатора.

Zero-shot — самый дешёвый и самый слабый путь: 0.613 намного ниже TF-IDF. Его ценность — в том, что не нужны размеченные обучающие данные (хотя для честного выбора слов-меток всё же нужна небольшая размеченная выборка для разработки), и в задачах, метки которых — обычные слова. Для модели из одного декодера та же идея превращается в промптинг с несколькими примерами (заметка о GPT), что сильнее, но это по-прежнему предсказание из предобученного распределения, а не из данных задачи.

Замороженные признаки и линейная модель#

Что переносится: контекстные векторы.

Прогоним каждую статью через замороженный энкодер, возьмём hCLSh_{\text{CLS}} (768 чисел) и обучим многоклассовую логистическую регрессию на 120 000 векторах. Это конвейер TF-IDF, в котором разреженный вектор счётчиков размерности 29 350 заменён плотным размерности 768.

ПризнакиДоля верных у линейной модели (тест)
TF-IDF, размерность 29 3500.918
Замороженный [CLS] BERT, размерность 7680.902

Вектор энкодера несёт тему, хотя его этому никогда не обучали: линейное считывание восстанавливает 90% меток. Базовый уровень на счётчиках он не превосходит по причине, которую уже встретила заметка о CNN: набор признаков, подогнанный под задачу (каждое слово со своим весом), трудно превзойти набором признаков общего назначения, а [CLS] предобучался предсказывать соседство предложений, а не тему. Для замороженного энкодера усреднение векторов токенов обычно работает лучше [CLS], но в это сравнение оно не входит.

Цена: один прямой проход на документ, один раз, а затем модель, которая обучается за секунды и, если векторы закэшированы, работает при инференсе без энкодера. Это путь для случаев, когда энкодер должен оставаться неизменным (общим для нескольких задач или обслуживаемым один раз для многих потребителей), и именно им идёт поиск по эмбеддингам предложений в заметке о семантическом поиске.

Дообучение всего энкодера#

Что переносится: сами веса как инициализация.

Поставим на [CLS] новый линейный выходной слой и обучим все параметры, энкодер и выходной слой, на размеченных данных с маленьким шагом обучения. Предобученные веса — отправная точка, а функция потерь задачи их сдвигает.

МодельОбучаемые параметрыДоля верных (валидация)
BERT-base + линейный выходной слой, 3 эпохи, шаг 2×10−52 \times 10^{-5}, батч 16110 млн0.949

Отложено 10% обучающей выборки (12 000 статей), потому что у AG News нет валидационной части. Три прохода по 108 000 статьям с шагом обучения в 50 раз меньше, чем при обучении с нуля, дают 0.949 на этих 12 000 отложенных статьях. Это на три пункта выше 0.918 у TF-IDF и примерно на четыре выше лучшей модели, обученной с нуля, но те числа — доля верных на 7600 тестовых статьях. Примеры разные, так что разница ориентировочная, а не парное сравнение: чтобы говорить о выигрыше, обе модели нужно оценить на одних и тех же нетронутых тестовых статьях. Маленький шаг обучения здесь главное: цель — подправить предобученное представление, а не переписать его, и бо́льшие шаги стирают его (катастрофическое забывание) прежде, чем выходной слой успеет чему-либо научиться.

ПутьЧто обучаетсяКакие нужны данныеНа чём оцененоДоля верных на AG News
Zero-shot с пропускомничегошаблонтест (слово-метка выбрано по тесту)0.456 / 0.613
Замороженные признаки + линейная модель768 × 4 весовметкитест0.902
Полное дообучение110 млнметкиотложенные 10% обучающей выборки0.949
TF-IDF + линейная модель (без предобучения)29 350 × 4меткитест0.918

Что именно переносится#

Три пути переносят соответственно предобученное выходное распределение, предобученное представление и предобученные веса как инициализацию. Дообучение выигрывает, потому что использует больше всего: каждый слой может подстроиться, а градиент функции потерь задачи проходит в шаблоны внимания и признаки полносвязных слоёв, построенные предобучением. Путь с заморозкой не может изменить то, что кодирует [CLS]; путь zero-shot не может изменить ничего.

Выигрыш эмпирический, и его многократно измеряли со времён Howard and Ruder (2018) и Devlin et al. (2019): дообученные энкодеры превосходят модели, обученные с нуля, с запасом, который растёт по мере уменьшения размеченной выборки. При 120 000 меток запас на AG News здесь — около трёх пунктов, между валидационным и тестовым числом; при 1000 меток модели с нуля разваливаются, а дообученные держатся.

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

  • Полное дообучение даёт полную копию. Каждая задача получает свои 110 млн (или 7 млрд) параметров. Эту цену снижает заметка о PEFT.
  • Нестабильность. Запуски дообучения различаются в зависимости от seed, особенно на малых выборках; практика — несколько запусков и выбор по валидации (Dodge et al., 2020).
  • Забывание. Дообученная модель хуже во всём, кроме своей задачи; предобученная общность израсходована.
  • Zero-shot зависит от формулировки. Выбор шаблона и слов-меток изменил здесь долю правильных ответов на тесте на 16 пунктов, причём слово выбиралось по тому же тесту; с ростом моделей эта чувствительность не исчезает, а переходит в промпт.
  • Замороженный [CLS] — слабый вектор предложения. Модели, предназначенные для эмбеддингов, обучают для этого с контрастной целью, а не считывают их с маскированной языковой модели.

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

  • Zero-shot через выходной слой MLM: переформулировать задачу как пропуск, ограничить словарь словами-метками; доля правильных ответов зависит от слов-меток (0.456 → 0.613 после переименования одного класса; новое название выбрано по тестовым статьям, так что 0.613 оптимистично).
  • Замороженные признаки: [CLS] + логистическая регрессия дают 0.902, ниже 0.918 у TF-IDF; предобученный вектор несёт тему, но обучен не для неё.
  • Полное дообучение с маленьким шагом даёт 0.949 на отложенной десятой части обучающей выборки — первый результат выше 0.918 базового уровня на тесте; разбиения разные, так что три пункта ориентировочные. Выигрыш даёт предобученная инициализация.
  • Приводить метрики по классам: за 0.456 скрывался класс с 3%.
  • Каждая дообученная задача стоит полной копии модели, и следующий раздел эту цену снижает.

Ноутбук#

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

  • Ячейки 31–36 строят тестовую выборку с промптом (text + " This news is about [MASK]."), запускают конвейер fill-mask с targets, равными четырём словам-меткам, и приводят 0.456.
  • Ячейки 38–39 считают долю правильных ответов по классам; ячейки 41–44 отбирают статьи World и считают 100 самых вероятных заполнителей конвейера; ячейки 46–49 переименовывают класс в politics и приводят 0.613.
  • Ячейки 52–57 переключаются на конвейер feature-extraction, берут первый выходной вектор (out[0, 0]) каждой статьи как hCLSh_{\text{CLS}}, обучают LogisticRegression на обучающих векторах (решатель останавливается на пределе итераций, о чём говорит предупреждение) и приводят 0.902 на тесте. Усреднение векторов токенов не запускается.
  • Ячейка 60 дообучает AutoModelForSequenceClassification с 4 метками через Trainer: разбиение обучающей выборки 90/10 с seed 42, обрезка до 128 токенов, 3 эпохи, шаг обучения 2×10−52\times10^{-5}, затухание весов 0.01, батч 16; в ноутбуке в том виде, в каком курс читали впервые, эта ячейка (тогда ячейка 61) сохранила долю правильных ответов при оценке 0.9486 на отложенных 10%. Код той версии передаёт в качестве compute_metrics несуществующий метод accuracy.computes, так что сохранённый выход должен был получиться из более ранней, рабочей версии этой строки; в текущем ноутбуке функция метрики определена, а у этой ячейки нет сохранённого выхода.

Дальше#

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

Литература#