Home Искусственный интеллект Доступность GPT-2 — генерация текста и тонкая настройка | DeepTech

Доступность GPT-2 — генерация текста и тонкая настройка | DeepTech

0

Генерация естественного языка (NLG) хорошо изучена в сообществе НЛП. С появлением методов глубокого обучения NLG становится все лучше и лучше. Недавно OpenAI раздвинула границы, выпустив ГПТ-2 – а Трансформеры основанная на модели, которая предсказывает следующее жетон в каждом временном пространстве.

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

Сделать все это легко — нужно всего лишь установить соответствующие пакеты и запустить скрипт python. Однако, чтобы избавить вас от проблем, вы можете использовать одну из доступных платформ, таких как Заклинание – вы просто указываете, что вы хотите запустить, а Spell позаботится обо всем остальном (загрузка кода, установка пакетов, выделение вычислительных ресурсов, управление результатами).

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

Если вам также нравится играть с машинным текстом, не стесняйтесь оставлять комментарии с интересными текстами, которые у вас есть. 🙂


ОБНОВЛЯТЬ: кажется, учебник больше не доступен по вышеупомянутой ссылке. Хотя он немного устарел (API обнимающего лица сильно изменился с тех пор), вот полный текст:

Генерация естественного языка (NLG) хорошо изучена в сообществе НЛП. Один из подходов к решению проблемы генерации текста состоит в факторизации вероятности последовательности токенов (например, слов или слов). Кодирование пары байтов) \(P(x_1,\ldots,x_n)\) в произведение вероятностей получения каждого из жетонов \(х_1\)…, \(х_п\) обусловлен предшествующими ему токенами: \(\ prod_{t=1}^{n}P(x_t|x_{. Учитывая обучающий набор данных, можно обучить такую ​​модель, чтобы максимизировать вероятность следующего токена на каждом временном шаге. После обучения модели вы можете генерировать текст, выбирая из распределения по одному токену за раз. Легко, как ветер.

С появлением методов глубокого обучения NLG становится все лучше и лучше. Недавно OpenAI раздвинула границы, выпустив ГПТ-2. В этой модели используется известный Архитектура трансформеров: чтобы рассчитать распределение по следующему токену, модель одновременно использует предыдущие токены, используя механизм самоконтроля.

Недавно HuggingFace выпустил API облегчение доступа к GPT-2. Одной из его особенностей является генерация текста с использованием предварительно обученной модели:

spell run --github-url https://github.com/huggingface/transformers.git \
  --pip tqdm \
  --pip boto3 \
  --pip requests \
  --pip regex \
  --pip sacremoses \
  "python examples/run_generation.py \
    --model_type=gpt2 \
    --length=70 \
    --prompt=' ' \
    --model_name_or_path=gpt2"
💫 Casting spell #1…
✨ Stop viewing logs with ^C
✨ Machine_Requested… done
✨ Building… done
✨ Run is running
…
…
…
$5.30-$10.00

FREE SHIPPING

Items without a shipping address will be delivered to your confirmation email when you purchase your product.

Use "POOL" when ordering; deliveries to POOL addresses are completely separate from shipping.<|endoftext|>Earth's spin to new low the closer Earth takes to the Sun's
✨ Saving… done
✨ Pushing… done
🎉 Total run time: 1m7.057677s
🎉 Run 1 complete

Это было легко! OpenAI использовал различные данные, найденные в Интернете, для обучения модели, поэтому сгенерированный текст может быть практически любым естественным текстом. Но что, если вместо разнообразия мы хотим генерировать определенный вид текста? Давайте попробуем генерировать шутки! Для этого нам нужно обучить модель, используя набор данных шуток. К сожалению, получить такой набор данных было бы невероятно сложно! Чтобы обучить GPT-2, который должен изучить 124M весов (и это всего лишь уменьшенная версия архитектуры), нам нужно огромное количество данных! Но откуда нам столько шуток? Короткий ответ: мы не будем.

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

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

Мы будем использовать однострочные шутки из набор данных коротких шуток для тонкой настройки GPT-2. Будучи короче средней шутки, модели будет легче узнать их распространение. Итак, прежде всего, давайте получим данные:

spell run "wget -O data.csv https://raw.githubusercontent.com/amoudgl/short-jokes-dataset/master/data/onelinefun.csv && python -c \"import csv; f_in = open('data.csv', 'r'); f_out = open('data.txt', 'w'); f_out.write('\n'.join(row('Joke') for row in csv.DictReader(f_in)))\""
💫 Casting spell #2…
✨ Stop viewing logs with ^C
✨ Building… done
✨ Machine_Requested… done
✨ Run is running
--2019-11-09 21:36:14--  https://raw.githubusercontent.com/amoudgl/short-jokes-dataset/master/data/onelinefun.csv
Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 151.101.0.133, 151.101.64.133, 151.101.128.133, ...
Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|151.101.0.133|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 253462 (248K) (text/plain)
Saving to: ‘data.csv’

     0K .......... .......... .......... .......... .......... 20% 3.34M 0s
    50K .......... .......... .......... .......... .......... 40% 6.72M 0s
   100K .......... .......... .......... .......... .......... 60%  167M 0s
   150K .......... .......... .......... .......... .......... 80%  122M 0s
   200K .......... .......... .......... .......... .......   100% 6.55M=0.03s

2019-11-09 21:36:14 (8.14 MB/s) - ‘data.csv’ saved (253462/253462)

✨ Saving… done
✨ Pushing… done
🎉 Total run time: 13.07418s
🎉 Run 2 complete

HuggingFace уже предоставили нам скрипт для тонкой настройки GPT-2:

spell run --github-url https://github.com/huggingface/transformers.git \
  --pip tqdm \
  --pip boto3 \
  --pip requests \
  --pip regex \
  --pip sacremoses \
  -m runs/2/data.txt \
  "python examples/run_lm_finetuning.py \
    --output_dir=output \
    --model_type=gpt2 \
    --model_name_or_path=gpt2 \
    --per_gpu_train_batch_size=2 \
    --num_train_epochs=10 \
    --do_train \
    --train_data_file=data.txt"
💫 Casting spell #3…
✨ Stop viewing logs with ^C
✨ Machine_Requested… done
✨ Building… done
✨ Mounting… done
✨ Run is running
…
…
…
🎉 Total run time: 44h36m34.553059s
🎉 Run 3 complete

Обратите внимание, что загруженные данные из предыдущего запуска монтируются с помощью -m флаг. Несмотря на то, что мы использовали небольшой набор данных (примеры 3K), запуск 10 эпох на процессоре занял около 44 часов. Это только показывает, насколько велика модель. Вот почему вам следует использовать графический процессор, если вы хотите использовать больший набор данных или провести много экспериментов (например, настроить гиперпараметры).

Попробуем сгенерировать шутку, смонтировав результат предыдущего запуска:

spell run --github-url https://github.com/huggingface/transformers.git \
  --pip tqdm \
  --pip boto3 \
  --pip requests \
  --pip regex \
  --pip sacremoses \
  -m runs/3/output \
  "python examples/run_generation.py \
    --model_type=gpt2 \
    --length=70 \
    --prompt=' ' \
    --model_name_or_path=output"
💫 Casting spell #4…
✨ Stop viewing logs with ^C
✨ Machine_Requested… done
✨ Building… done
✨ Run is running
…
…
…
"I've got seven fingers! But I don't have those!"
Your childhood might be difficult, but at least it doesn't taste like your grandfather's.
Funny things never happen, in life.
Friends, We've met on the beach. What's wrong with you?
If I'm speaking honestly, I could use some
✨ Saving… done
✨ Pushing… done
🎉 Total run time: 51.047054s
🎉 Run 4 complete

Модель научилась генерировать короткие предложения, что характерно для нашего набора данных. Эта относительно простая для понимания статистика данных была хорошо изучена! Насчет того, насколько забавна модель – ну… оставлю судить вам!

LEAVE A REPLY

Please enter your comment!
Please enter your name here