Как настроить большие модели трансформаторов на одном графическом процессоре в PyTorch

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

GPT-2

Недавно команда OpenAI опубликовала статью Лучшие языковые модели и техническую статью Языковые модели - это неуправляемые многозадачные ученики об обучении более крупных и лучших языковых моделей. Они исследуют возможности языковой модели для генерации связного текста и решения задач НЛП с нулевым выстрелом, что означает использование модели для решения задач, для которых она не была специально обучена.

Они создали основанную на преобразователе языковую модель, которую назвали GPT-2, и обучили ее огромному набору текстовых данных в Интернете объемом 40 ГБ. Они обучили модель задаче языкового моделирования, которая заключается в прогнозировании вероятностей следующего слова в последовательности слов. Обучение моделей НЛП для языкового моделирования с последующей тонкой настройкой под конкретную задачу - один из наиболее распространенных способов обучения моделей НЛП. Предварительная подготовка модели для языкового моделирования удобна, поскольку не требует размеченных данных для изучения структуры языка - для этого требуется только простой текст, который открыто доступен в огромных количествах. Большинство общедоступных предварительно обученных моделей НЛП обучены языковому моделированию.

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

Доработка плана эксперимента

Поэтому я решил немного поэкспериментировать с GPT-2. Я подумал, что будет интересно научить модель отпускать какие-нибудь шутки. Для этого мне нужен набор данных шуток и предварительно обученная модель GPT-2 для точной настройки.

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

Huggingface сделал множество предварительно обученных моделей Transformer доступными для удобного использования в PyTorch. Я воспользуюсь их предварительно обученным GPT-2 и настрою его на этом наборе данных Short Jokes, опубликованном на Kaggle.

GPT-2 выпускается в 4 различных размерах - малом, среднем, большом и XL, с параметрами 124M, 355M, 774M и 1.5B соответственно. Я обнаружил, что модель GPT-2 среднего размера - самая большая из моделей, которые я мог точно настроить с разумной длиной входной последовательности на одном графическом процессоре.

Тестирование предварительно обученной модели путем генерации текста

Прежде чем настраивать модель на шутки, я протестирую ее на генерации текста.

В следующей сущности я демонстрирую, как сгенерировать текст с помощью предварительно обученного среднего размера GPT-2 из huggingface. Я скармливаю модели следующие фрагменты текста для начала, а остальное пусть она сгенерирует:

«Матрица повсюду. Это все вокруг нас. Даже сейчас, в этой самой комнате. Вы можете увидеть это, когда посмотрите в окно или когда включите телевизор. Вы можете почувствовать это, когда идете на работу… когда идете в церковь… когда платите налоги. Это мир, над которым вам надели глаза, чтобы скрыть от истины… »

«Общий искусственный интеллект…»

«Крестный отец:« Я собираюсь сделать ему предложение, от которого он не сможет отказаться »…»

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

Точная настройка модели на одном графическом процессоре

Модели больших преобразователей обычно обучаются в настройках с несколькими графическими процессорами (или TPU), поскольку для обучения разумному размеру пакета и длине последовательности на большой модели требуется много памяти тензорного / графического процессора. Моя машина оснащена одной видеокартой GeForce 1080 Ti с 11 ГБ памяти. Путем эмпирических тестов на модели GPT-2 среднего размера я обнаружил, что максимальное общее количество элементов последовательности в пакете для обработки моим графическим процессором составляет примерно 550, что не так много и может быть недостаточно для успешной точной настройки.

Но есть некоторые вещи, которые мы можем принять во внимание, чтобы улучшить ситуацию.

Первое, на что следует обратить внимание, это то, что размер пакета при прямом-обратном проходе модели на основе трансформатора не играет роли, потому что нормализация уровня используется вместо нормализации пакета. В Layer Normalization каждая функция нормализуется по размеру объекта, а размер пакета не задействован.

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

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

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

Итоги и выводы

Научить ИИ генерировать текст, который покажется смешным человеку, - сложная проблема, и я думаю, что это намного сложнее, чем создать связный текст. Даже человеку это сделать непросто - требуется особая креативность, понимание контекста и даже понимание человеческой психологии. Кормление языковой модели множеством шуток может оказаться недостаточным для того, чтобы модель действительно узнала, что делает что-то забавным. Для обучения моделей шутливости человеческого уровня могут потребоваться более сложные методы и гораздо больше данных.

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

* Когда я начал эксперимент, я не заметил, что значительная часть шуток в наборе данных является расистскими и грубыми, что означает, что вы можете ожидать того же в сгенерированном списке шуток от модели. Прошу прощения за это и будьте готовы.

Вот полный список сгенерированных анекдотов.

Если в сформированном списке анекдотов вы увидели что-то хорошее и смешное, опубликуйте это в комментариях. :) Я не все их прочитала.

Репост из моего оригинального блога.