Преодоление нестабильности при обучении трансформеров

Оглавление

  1. Проблемы, связанные с тонкой настройкой модели Transformer
  2. Нестабильная тренировка
  3. Факторы, на которые влияет случайность
  4. Количественная оценка случайных факторов
  5. Приемы преодоления влияния случайных факторов

Проблемы, связанные с тонкой настройкой модели Transformer

На момент написания этой статьи, 15 ноября 2021 года, Transformers по-прежнему являются самыми современными моделями для задач обработки естественного языка. Глядя на скорость, с которой вещи развиваются в машинном обучении, через год или около того, это может быть не так. В любом случае, библиотека трансформеров чрезвычайно упростила начало работы с моделями трансформеров. Модели трансформаторов имеют миллионы параметров (например, базовая модель BERT имеет 110 миллионов параметров, а большая модель BERT имеет 340 миллионов параметров). Несмотря на то, что начать обучение трансформеров стало очень легко, есть одна серьезная проблема, с которой сталкиваются практические практики при обучении моделей трансформеров на наборах данных небольшого размера (выборки ‹10K). В следующих разделах мы обсудим, в чем проблема, и мы разработали проект с открытым исходным кодом, с помощью которого можно очень легко решить эту проблему.

Нестабильная тренировка

Нестабильное обучение — это явление, при котором точная настройка больших моделей преобразователей с тривиальными изменениями, такими как изменение случайного начального числа, может резко изменить производительность модели. Вот снимок экрана с тонкой настройкой набора данных CoLA из задач GLUE с двумя разными случайными начальными значениями, примененными только к исключению модели трансформатора.

Мой друг Шахул и я сильно пострадали от этой проблемы нестабильной тренировки во время нашего соревнования Kaggle Commonlit. Вот — это описание того, как мы это преодолели. Вскоре после соревнований мы решили вместе изучить причины этой нестабильной тренировки и методы ее преодоления. Мы наткнулись на эту прекрасную статью под названием Пересмотр нескольких образцов тонкой настройки BERT. Мы использовали эту статью в качестве отправной точки нашего исследования.

Воспроизводимость против стабильности

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

Стабилизатор

Если вы хотите быстро приступить к работе, посетите этот репозиторий github. Пожалуйста, установите пакет с pip install stabilizer

Факторы, на которые влияет случайность

Первое, что мы хотели определить, это все факторы, на которые влияет случайность в обучении трансформеров. Одна из основных проблем, с которой мы столкнулись при определении факторов, заключается в том, что в Pytorch случайность контролируется глобальным случайным начальным числом, поэтому нам пришлось сегментировать код на несколько разделов, чтобы правильно определить, на какие факторы обучения модели влияет случайное начальное число. Мы определили, что есть три фактора, на которые влияет случайное начальное число, а именно:

  1. Загрузчик данных: последовательность, в которой элементы загружаются загрузчиком данных.
  2. Отсев: Отсев применяется к параметрам модели трансформатора.
  3. Инициализация веса: веса конкретного слоя задачи поверх скрытого вектора кодировщика.

Прежде чем углубляться в факторы, на которые влияет случайность, давайте быстро рассмотрим концепцию модели Finetuning BERT и вспомним определение ключевых терминов.

БЕРТ Архитектура

Архитектура модели BERT основана на оригинальной реализации модели Transformer, представленной в статье Внимание — это все, что вам нужно. Как следует из названия, представления двунаправленного кодировщика из модели Transformer основаны только на кодере модели Transformer. Вот архитектура модели Transformer из статьи Внимание — это все, что вам нужно. Модель BERT состоит из трех типов слоев:

  1. Слой внедрения, который принимает маркеры входного текста
  2. Слои кодировщика, которые содержат заголовки внимания и сети прямой связи.
  3. Выходной слой, который изучает конкретные параметры задачи.

Предварительное обучение модели BERT

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

Тонкая настройка модели BERT

Выходной слой поверх слоев кодировщика, который изучил конкретные параметры задачи предварительной подготовки, заменяется новым слоем для изучения конкретных параметров текущей задачи. Вот упрощенная архитектура модели BERT, чтобы вы могли получить общее представление о ней.

Выходной слой, специфичный для задачи, принимает скрытый векторный вывод последнего слоя кодировщика и обрабатывает его. Вот пример того, как выглядит скрытая матрица из последнего слоя энкодера:

Первый вектор скрытой матрицы соответствует токену CLS. Считается, что этот вектор сжимает и обобщает информацию, представленную на входе. Этот вектор называется вектором пулера. Вот фрагмент кода, показывающий простой линейный классификатор, построенный поверх вектора пулера (скрытый вектор, соответствующий токену CLS).

Инициализация веса

Теперь, когда мы понимаем, как спроектирован слой, специфичный для задачи, мы можем увидеть, как случайная инициализация влияет на слой, специфичный для задачи.

Количественная оценка случайных факторов

Чтобы количественно оценить влияние случайности на три упомянутых выше фактора, а именно загрузчик данных, отсев и инициализацию веса, мы провели эксперименты, изолировав каждый из этих факторов и обучив несколько моделей, просто изменив случайное начальное число, соответствующее этому фактору. Например, чтобы количественно оценить эффект случайности выпадения, мы устанавливаем загрузчик данных и константу инициализации веса, а также изменяем случайное начальное число, соответствующее выпадению.

Экспериментальная установка

Мы следовали экспериментальной установке, описанной в этой статье. Вот фрагмент конфигурации:

Количественная оценка эффекта случайного отсева

Количественная оценка эффекта случайного загрузчика данных

Количественная оценка эффекта случайной инициализации веса слоя для конкретной задачи

Суммируя влияние случайных факторов

В приведенной выше таблице обобщается влияние случайности, создаваемой соответствующими факторами, на оценку проверки. Из-за этой изменчивости специалисты-практики обычно используют большой ансамбль и другую технику, называемую валидацией каждые n итераций. Запустить в производство одну модель уже очень сложно, давайте забудем об ансамбле. В следующем разделе давайте обсудим проверку каждой n итерации.

Проверка каждые n итераций

Прежде чем обсуждать это, давайте договоримся о некоторых терминах.

  1. Итерация. Модель обрабатывает данные пакетами. Каждый раз, когда пакет загружается и обрабатывается, называется итерацией.
  2. Эпоха. Эпоха состоит из нескольких итераций. Эпоха состоит из одного полного цикла всех данных. Таким образом, через эпоху модель видела все данные ровно один раз.

Обычно мы обучаем модель для эпохи на обучающем наборе, а затем оцениваем ее на проверочном наборе и сохраняем модель. Вот псевдокод, показывающий процесс:

Поскольку случайные факторы сильно влияют на производительность модели, специалисты-практики обычно склонны проверять каждые n итераций, где n может составлять всего 1, 5 или 10. Вот псевдокод, показывающий это:

Недостатки проверки каждые n итераций

Я лично считаю, что проверка каждых n итераций похожа на стрельбу в темноте.

  1. Это приведет к переоснащению обучающих данных
  2. Это резко увеличивает время обучения и, следовательно, стоимость.
  3. Это делает невозможным научное сравнение

Приемы преодоления влияния случайных факторов

Для получения подробного списка техник используйте эту статью в качестве отправной точки. Теперь давайте обсудим два наиболее многообещающих метода, которые мы реализовали в библиотеке Stabilizer, и вы можете быстро приступить к работе с ними.

Повторная инициализация

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

Было обнаружено, что, поскольку исходные параметры верхних слоев кодировщика изучили более предварительно обученные параметры, специфичные для задачи, они могут быть недостаточно хорошими, и повторная инициализация последних n верхних слоев с использованием исходного нормального распределения BERT может уменьшить нестабильность. Количество слоев, которые необходимо повторно инициализировать, является гиперпараметром.

Вот фрагмент кода, показывающий, как это можно сделать в библиотеке стабилизатора:

Вот экспериментальные результаты влияния повторной инициализации на случайную инициализацию веса

Снова добавляем вклад инициализации случайного веса для целей сравнения:

Послойное снижение скорости обучения

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

Как следует из названия, в этой технике послойного снижения скорости обучения мы назначаем определенные скорости обучения каждому слою. Одна эвристика для назначения LLRD:

  1. Назначьте пиковую скорость обучения конкретному слою задачи.
  2. Затем, начиная с последнего уровня кодировщика, который является верхним уровнем, каждый уровень кодировщика получает скорость обучения (lr), определяемую
current_layer_lr = prev_layer_lr * multiplicative_factor

3. Слой внедрения получает:

embedding layer_lr = first_encoder_layer_lr * multiplicative factor

Вот фрагмент кода, показывающий, как это можно сделать с помощью библиотеки Stabilizer:

Резюмируя эффекты методов стабилизации

Вот краткое изложение результатов после стабилизации

Мы можем ясно видеть, что при повторной инициализации эффект случайности, создаваемый инициализацией веса конкретного слоя Задачи, резко снижается с 0,020 до 0,006. Это огромное улучшение. В то время как с LLRD мы не замечаем хорошего улучшения. Поэтому, как мы уже говорили ранее, не существует универсального решения для смягчения влияния случайных факторов, но мы могли бы использовать методы стабилизации, уже предлагаемые библиотекой Stabilizer, чтобы в значительной степени преодолеть их.

Как вы можете внести свой вклад

Если вы зашли так далеко, я уверен, что вы были бы рады внести свой вклад в эту библиотеку. Пожалуйста, напишите мне сюда, и мы сможем немного пообщаться. Вот несколько идей для участия:

  1. Добавление дополнительных техник для стабилизации тренировки
  2. Напишите примеры сценариев для обучения новых наборов данных с помощью уже реализованных методов стабилизации.
  3. Добавление эквивалентных кодов TensorFlow/Jax для существующего кода Pytorch

Заключительные слова

Хотя автором этой статьи был я, весь этот проект был построен мной вместе с моим другом Шахулом. Пожалуйста, не стесняйтесь писать нам, если у вас есть какие-либо вопросы. Если у вас есть интересные идеи, мы с нетерпением ждем возможности их услышать и реализовать вместе с вами!

Нажмите здесь, чтобы найти меня в LinkedIn. Нажмите здесь, чтобы найти Шахула в LinkedIn.

Обо мне

Ранее я возглавлял исследовательскую группу по машинному обучению в Дартс-ИП. Сейчас я сосредоточен на создании собственного стартапа. Я взволнован больше, чем когда-либо, так как это мой первый опыт предпринимательства. Пожалуйста, не стесняйтесь, присылайте мне электронное письмо по адресу [email protected], если у вас есть какие-либо вопросы, предложения или отличные идеи для создания.