Не успели отшуметь новости о нейросети BERT от Google, показавшей state-of-the-art результаты на целом ряде разговорных (NLP) задач в машинном обучении, как OpenAI выкатили новую разработку: GPT-2. Это нейронная сеть с рекордным на данный момент числом параметров (1.5 млрд, против обычно используемых в таких случаях 100-300 млн) оказалась способна генерировать целые страницы связного текста.
Генерировать настолько хорошо, что в OpenAI отказались выкладывать полную версию, опасаясь что эту нейросеть будут использовать для создания фейковых новостей, комментариев и отзывов, неотличимых от настоящих.
Тем не менее, в OpenAI выложили в общий доступ уменьшенную версию нейросети GPT-2, со 117 млн параметров. Именно ее мы запустим через сервис Google Colab и поэкспериментруем с ней.
Немного предыстории
Для тех кто не следил за развитием прогресса в обработке естественной речи (NLP).
Летом 2018 года OpenAI предобучили на большом объеме текста нейронную сеть GPT, построенную на архитектуре Transformer. Оказалось, что если заменить пару последних слоев и дообучить ее под конкретную задачу (такой подход называется Fine Tuning и широко используется в машинном обучении), то это бьет предыдущие рекорды сразу по широкому спектру разговорных задач.
На основе этой разработки, в конце 2018 года в Google создали свою нейросеть BERT. Они серьезно улучшили результат, сделав нейросеть двунаправленной, в отличие от GPT.
Не желая сдаваться, в феврале 2019 года в OpenAI увеличили свою GPT сразу в 10 раз и обучили ее на еще большем объеме текста — на 8 млн интернет страницах (суммарно на 40 Гб текста). Получившаяся таким образом сеть GPT-2 является на данный момент самой большой нейросетью, с беспрецендентным числом параметров 1.5 млрд (у BERT в самой крупной модели было 340 млн, а у стандартной BERT 110 млн).
Как результат, GPT-2 оказалась способной генерировать целые страницы связного текста. С повторными упоминаниями имен действующих лиц по ходу повествования, цитатами, отсылками к связанным событиям и так далее. Примеры приводить здесь не буду, а отсылаю желающих к оригинальной статье в блоге OpenAI: Better Language Models and Their Implications.
Генерация связного текста такого качества это само по себе впечатляюще, но самое интересное здесь другое. GPT-2 без всякого дообучения сразу показала близкие к state-of-the-art результаты на целом ряде разговорных задач. Повторяю, кто пропустил важность момента — без всякого дообучения под конретную задачу!
Как они этого добились? Просто задавая нейросети правильные вопросы.
Архитектура GPT-2
GPT-2 обучена предсказывать следующее слово в предложении. Это классический подход для генерации текста. Сначала пальму первенства в этой области держали рекуррентные (RNN) сети, в частности, LSTM. Но после изобретения летом 2017 года архитектуры Transformer, в разговорных задачах постепенно она стала преобладать. Хотя у оригинального Transformer есть проблема с запоминанием длинных последовательностей (LSTM помнят более длинные), но быстрота обучения и глубина сети с лихвой компенсировала это. Кстати, сейчас уже появился целый ряд модификаций трансформера — с введением в него рекуррентности (Universal Transformers), модификация для более длинных последовательностей (Transformer-XL) и другие, но в Google и OpenAI пока используют лишь слегка тюнингованный оригинальный Transformer.
BERT от Google, напомню, обучался немного иначе: предсказывать не следующее слово в предложении, а пропущенные (закрытые маской) слова в предложении. А также определять, являются ли два последовательных предложения логичным продолжением друг друга, или они никак не связаны между собой по смыслу. Это позволило BERT быть языковой моделью, понимающей смысл слов в зависимости от их окружения (от контекста). Что и определило успех BERT в NPL задачах. Но только после дообучения (Fine Tuning) под конкретную задачу. Просто предсказание слов в базовой модели в нем работает не очень. Можете сами поиграться с BERT в браузере (через Google Colab): https://habr.com/ru/post/436878.
GPT-2 дообучать не нужно. Это не просто языковая модель, как BERT, это генератор текста. Просто подайте ей на вход начало фразы, а дальше она дополнит ее слово за словом.
Интересная деталь: исследования OpenAI показали, что массивы текстов Wikipedia и литературных книг (на которых обучался BERT, в частности) имеют предвзятый стиль. Поэтому обученные только на них нейросети не очень хорошо генерируют текст. Чтобы разнообразить входные данные и стили, в OpenAI для обучения GPT-2 использовали обычные интернет страницы, собранные с 8 млн сайтов (суммарно 40 Гб текста). А чтобы отбросить рекламные и спамерские сайты, они включали в выборку сайты, ссылки на которые в реддите имеют хороший рейтинг. То есть сайты, которые живые пользователи сочли содержащими какую-то полезную информацию.
Правильный вопрос содержит половину ответа
Итак, GPT-2 благодаря беспрецедентному размеру, оказалась способна генерировать страницы связного текста. Но самое удивительное, что задавая ей правильный вопрос (т.е. правильное начало фразы), она смогла отвечать на различные вопросы! Просто потому что продолжение такого начала является самым естественным.
Для примера, чтобы получить ответ на вопрос "Что такое Земля?", можно подать на вход этой нейросети начало фразы: "Земля это...". И она дополнит эту фразу до конца. Потому что ответ будет естественным продолжением такого начала.
Более того, формируя правильным образом начало фразы, можно получить объяснения для разной целевой аудитории с учетом ее интеллекта, возраста и образования. Представьте себе продолжения фраз: "Я, как ученый, считаю что Земля это...". Или "Я, как плоскоземельщик, утверждаю что Земля это...". Или: "Я, будучи воспитателем в детском саду, сейчас объясню вам, дети, что Земля это...".
Как видите, формируя правильные вопросы (правильное начало фразы), можно получить ответы совершенно разного уровня и разной детализации. В некотором роде, похожее происходит и у людей. Врач должен объяснить пациенту протекание болезни так, чтобы тот понял. На уровне пациента. Если у пятилетнего ребенка спросить, почему он поступил так, то он не может сразу ответить (что и естественно, дети живут чувствами и эмоциями). Но чтобы дать ответ, который от него ждут, ребенок начинает его придумывать — генерировать текст. Исходя из того, чтобы ответ устроил родителя и чтобы хоть как-то соответствовал произошедшему. Сначала, как знают многие родители, это будут нелепые ответы. Но путем поощрения и наказания ("рассказывай подробнее", "не придумывай оправданий") ребенок научится давать развернутые и полные ответы.
Эта разработка OpenAI и способность сети GPT-2 давать ответы на разговорных задачах без специального дообучения под конкретную задачу, открывают два интересных вопроса:
1) Может ли интерпретируемость нейронных сетей быть достигнута таким элементарным генератором текста и правильным началом фразы. Где ответ будет естественным продолжением. Пусть, например, нейронная сеть указывает котиков на фотографии не числами-координатами x и y, а объясняет его положение обычным текстом. Тогда в ходе уточнения задав ей правильный вопрос, например: "Я пришла к этому выводу, потому что...", можно в теории получить объяснение как она нашла котика на фото. И это объяснение в предельном случае может быть не хуже человеческого. Что решает глобальную проблему интерпретируемости нейронных сетей.
2) Может ли предобученная нейронная сеть на больших объемах текста быть универсальной, обладать общим здравым смыслом и не требовать дообучения под конкретные задачи. Здесь имеется ввиду, что пытаясь имитировать человеческую речь (человеческие ответы на вопросы), нейросеть неизбежно должна выучиться здравому смыслу, чтобы давать эти самые похожие на человеческие ответы. Давать односложные фиктивные ответы, в целом, не характерно для людей. В большинстве своем люди дают развернутые адекватные ответы, а значит сеть должна научиться делать так же.
Оба эти вопроса остаются открытыми, но первый шаг в их утверждении определенно сделан.
А точнее?
Если вы сейчас стоите, то лучше сядьте. Потому что вот как OpenAI с помощью нейросети GPT-2 получили свои результаты в разговорных задачах для разных доменов:
Ответы на вопросы по тексту
Ну, это просто. Либо скармливали сети несколько абзацев с описанием, включающем в себя где-нибудь посередине, например "яблоко лежит на столе", а в конце приписывали: "яблоко лежит на..." и сеть дописывала "столе". Потому что способна помнить контекст нескольких абзацев.
Либо скармливали сети в качестве начальной фразы несколько примеров вида "Вопрос: какой-то вопрос, Ответ: какой-то ответ", а в конце после реального вопроса добавляли: "Ответ:". И нейросеть дописывала ответ! Так как выявила структуру документа по предыдущим Вопрос-Ответ. Это удивительно.
Краткая версия (Summarization) текста
На входе подается длинный текст из нескольких абзацев или даже страниц, а нейросеть должна написать короткое содержание. Как такое поведение получили от GPT-2? Просто после текста добавили "TL;DR". И все! Этого оказалось достаточно, чтобы после этих символов GPT-2 дописала краткое содержание статьи! Потому что такими символами в интернете часто обозначают кратное содержание поста.
Перевод текста
На вход GPT-2 подали текст в виде: "hello = привет, dog = собака, wind = ветер, cat = ...". И нейросеть дописала перевод последнего слова: "кошка" (в оригинале на французском). Потому что выявила структуру документа и просто дополнила его наиболее логичным продолжением. Если у вас до сих пор не отвисла челюсть от всего этого, то у меня для вас две новости, и обе плохие =).
Запуск GPT-2 через Google Colab
К сожалению, полную версию GPT-2 в OpenAI отказались выкладывать в общий доступ. Мотивируя это тем, что с помощью этой нейросети будет слишком просто генерировать фейковые новости и отзывы в магазинах. Судя по их заявлению, обсуждение целесообразности выкладывания этой модели будут продолжаться ближайшие 6 месяцев, в после OpenAI решат окончательно, выкладывать или нет. Впрочем, для крупной организации повторить модель не составляет труда (похоже, что они обучали ее на 256 TPU несколько дней, и по предварительным подсчетам это обошлось им около 45 тыс. $)
Однако они выложили уменьшенную версию GPT-2 со 117 млн параметрами (а не 1.5 млрд, как в полной модели): https://github.com/openai/gpt-2. Попробуем запустить ее и поиграться с этой моделью.
Проще всего это сделать через Google Colab:
- Откройте ссылку
http://colab.research.google.com/github/blade1780/bert/blob/master/Gpt-2.ipynb
- В меню Runtime выберите Run All, чтобы в первый раз запустились все ячейки, скачалась модель и подключились нужные библиотеки. Согласитесь сбросить все Runtime, если потребуется. Вводите текст после появления "Model prompt >>>" и нажимайте Enter.
Убедитесь, что в меню Runtime -> Change runtime type выбрано GPU и Python 3
Если кнопка подключения не активна, нажмите ее, чтобы стало Connected.
Или создайте весь код вручную:
- Перейдите на https://colab.research.google.com
- Нажмите на синюю кнопку NEW PYTHON 3 NOTEBOOK
- В меню Runtime -> Change runtime type выберите Python 3 и GPU (последнее чтобы запускать нейросеть на GPU)
- В первой ячейке введите:
!git clone https://github.com/openai/gpt-2
%cd gpt-2
!sh download_model.sh 117M
!pip3 install -r requirements.txt
И нажмите черный значок Play слева от ячейки. Это загрузит нейросеть GPT-2 и установит необходимые зависимости.
Во второй ячейке (добавить ее можно через меню Insert -> Code cell или наведя мышь под центром текущей ячейки, всплывут кнопки добавления):
!python3 src/interactive_conditional_samples.py
Это запустит интерактивный режим. Дождитесь пока загрузится нейросеть и внизу появится окошко для ввода текста, с надписью ""Model prompt >>>". Вводите начало фразы и нажимайте Enter. Через некоторое время появится сгенерированный текст под заголовком SAMPLE.
Можно также запустить режим генерации полностью случайного текста. Текст будет генерироваться бесконечное время небольшими кусками SAMPLE 1, SAMPLE 2 и так далее, пока не нажмете кнопку Stop у ячейки. Для этого создайте новую ячейку с кодом:
!python3 src/generate_unconditional_samples.py | tee samples.txt
Результат будет сохранен в файл samples.txt. Его можно скачать следующими командами (снова создайте новую ячейку и запустите ее после генерации текста):
from google.colab import files
files.download('samples.txt')
Можно менять параметры генерации текста (коэфф. случайности и т.д., описание смотрите в оригинальной работе):
!python3 src/generate_unconditional_samples.py --top_k 40 --temperature 0.7 | tee samples.txt
Так как это сильно уменьшенная модель, то не ждите от нее чудес. Большинство генерируемых образцов будут бредом. Но попадаются и осмысленные участки. Текст должен быть на английском языке, с другими языками GPT-2 пока не умеет работать.
Ссылки
Оригинальная статья в блоге OpenAI: Better Language Models and Their Implications
Github с выложенной 117М моделью: https://github.com/openai/gpt-2
Обсуждение на reddit основной новости
Обсуждение на reddit отказа выложить полную модель: Пора OpenAI переименоваться в CloseAI
Google Colab notebook для запуска GPT-2 (117M) в браузере: http://colab.research.google.com/github/blade1780/bert/blob/master/Gpt-2.ipynb
Автор: DesertFlow