Практическое руководство по созданию историй с помощью машинного обучения.

Краткое введение

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

Вкратце, новинкой LSTM по сравнению с простой рекуррентной нейронной сетью (RNN) является включение специального блока, называемого Cell.

Ячейка – это единица, содержащая несколько ворот, определяющих правила прохождения информации. Кроме того, каждая ячейка имеет собственную внутреннюю систему убеждений. Подробное описание смотрите в этой статье:



Содержание этой статьи

В этой статье у нас мало теории. Вместо этого мы перейдем непосредственно к созданию истории с Керасом на основе «Алисы в стране чудес».

Поток этой статьи следующий:

  1. Получение базовой истории/текста;
  2. Предварительно обработайте текст для машинного обучения:
    2.1. Импорт библиотек;
    2.2. Загрузка текста;
    2.3. Уборка;
    2.4. Токенизация текста;
  3. Создание нашего набора данных;
  4. Создание собственного Keras RNN с использованием модулей LSTM;
  5. Обучение и создание новой истории;
    5.1 Модель обучения;
    5.2 Сохранение нашей модели;
    5.3 Создание новой истории!

Вы готовы?

Затем следуйте за мной в этом путешествии.

1. Получение базовой истории/текста

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

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

Я получил общедоступный текст и сохранил его в моем репозитории GitHub в виде текстового (.txt) файла.

Чтобы сохранить папку нашего проекта в чистоте, давайте загрузим или скопируем и вставим всю историю в файл с именем data.txt и сохраним файл в папке с именем data.

Мы готовы начать предварительную обработку.

2. Предварительная обработка текста

Этот раздел содержит несколько подразделов для облегчения восприятия.

Я бы рекомендовал использовать Jupyter Notebook для этой задачи, чтобы визуализировать каждый шаг процесса.

В качестве примечания: если вы считаете, что ваш компьютер/машина недостаточно мощный, вы можете использовать облако Google Colaboratory (Colab). Я описал, как использовать его и его ограничения в следующей статье:



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

С этого момента я буду показывать свой код и все результаты работы Colab. Они немного отличаются от тех, что в моем локальном Jupyter Notebook, но это не меняет выводов.

2.1. Импорт библиотек

В любом случае, давайте запустим нашу записную книжку и начнем импортировать все библиотеки:

Если вы получаете сообщение об ошибке: ModuleNotFoundError: No module named ‘keras’

Вам нужно установить Керас. В принципе, эти шаги должны работать в каждом случае:

Для сред Linux или Mac выполните следующую команду: sudo pip install keras.

Для Windows или виртуальных сред избегайте sudo.

Если вы работаете в Colab, на этом этапе не должно возникнуть никаких проблем — обычно в Colab по умолчанию уже установлено множество библиотек.

Надеюсь, это поможет, и вы сможете делать импорт.

Перейдем к предварительной обработке текста.

2.2. Загрузка текста

Это должно вывести что-то вроде:

2.3. Убираться

Это уже преображает нашу историю. Вывод должен быть весь в нижнем регистре, многие символы/символы заменены на выделенные символы, что поможет в процессе обучения:

Последним шагом в нашей предварительной обработке будет процесс токенизации.

2.4. Токенизация текста

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

Чтобы узнать больше о различиях, пожалуйста, ознакомьтесь с этой статьей:



Возвращаясь к нашим данным, давайте выполним токенизацию, вызвав соответствующий метод из библиотеки keras.preprocessing.text.

В результате мы получаем три выхода: количество токенизированных слов, словарь/карту между номером токена и соответствующим словом и тот же текст, записанный токенами.

Теперь вся наша предварительная обработка завершена.

Пришло время создать наш набор данных и персональный LSTM с нуля, используя Keras.

3. Создание нашего набора данных

Прежде чем что-то строить, давайте вспомним, что мы хотим сделать.

Учитывая слово или последовательность слов, мы хотим, чтобы сеть LSTM RNN могла предсказывать следующее слово в последовательности. Это процесс изучения того, какие слова/токены с большей вероятностью будут следующими.

Какие параметры мы хотим использовать?

Мы будем использовать параметр, называемый длиной последовательности, для обучения нашей модели. Например, 20, что означает, что мы делим наш текст на блоки/фрагменты по 20 слов.

Переменная ответа (Y) для каждой последовательности — это последующее/следующее слово. Мы используем горячее кодирование в вектор длиной 2656 (количество различных слов в словаре). Помните, что горячее кодирование означает двоичное (истина или ложь, 0 или 1 и т. д.).

Другими словами, мы будем перебирать текст несколько раз, каждый раз выбирая по 20 слов. Это дает нам 35564 возможных последовательности, когда мы повторяем каждое слово, например, размер шага равен 1.

Чтобы проверить это число, просто вычтите длину последовательности (20) из списка токенов (35584), например print(len(token_list) — seq_length).

В коде это выглядит так:

Это приводит к двум массивам, X и y, функциям и переменной ответа:

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



4. Создание собственного Keras RNN с использованием модулей LSTM

Теперь, пожалуй, самая интересная часть этой статьи — создание собственной рекуррентной нейронной сети (RNN) LSTM с нуля.

Если вы новичок в Keras, вот пошаговое руководство с подробными объяснениями принципов и архитектуры библиотеки Keras, информацией о том, как построить что-то похожее на блоки LEGO, и дополнительным алгоритмом классификации изображений:



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

Ради этого урока давайте не будем делать ничего слишком сложного, а начнем с основ:

Уровни включают Input, Embedding и LSTM (как часть архитектуры LSTM) и, наконец, слой Dense.

Наша модель включает категориальную функцию кросс-энтропийной потери (поскольку мы работаем с категориями, y, помните однократное кодирование).

Краткое изложение этого довольно простого LSTM (который все же лучше, чем ванильный RNN) приведено ниже:

Мы в одном шаге от создания новых историй!

Перед этим нам нужно только обучить нашу модель на входных данных X и на выходе y.

5. Обучение и создание романа

5.1 Модель обучения

Как обычно, с помощью метода .fit() мы можем запустить процесс обучения:

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

Когда вы запускаете этот код, вы можете легко пойти вздремнуть или приготовить напиток с бутербродом.

Важно: если вы запускаете его в Colab, периодически (раз в 15–25 минут) щелкайте где-нибудь внутри среды Jupyter, чтобы он продолжал работать.

Результат этого процесса выглядит следующим образом:

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

5.2 Сохранение нашей модели

С официального сайта TensorFlow:

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

Мы можем просто сохранить всю модель в формате .h5. Подробнее о разных форматах и ​​о том, как с ними работать, я напишу в одной из следующих статей, если кому интересно. Пожалуйста, дайте мне знать в комментариях!

В результате мы видим, что сохраненная и повторно загруженная модель имеет ту же summary(), то есть архитектуру, что и наша исходная модель.

Итог: не забывайте всегда сохранять свою модель, особенно после долгого обучения!

Теперь пришло время для момента истины.

Давайте посмотрим, что реально возможно с таким базовым LSTM RNN с 3 часами обучения.

5.2 Создание истории!

Вот два метода: основной generate_text() и дополнительный sample_with_temp().

Идею использования этой дополнительной функции разделил Дэвид Форстер, партнер-основатель консалтинговой компании Applied Data Science Partners.

Короче говоря, этот параметр температуры определяет, насколько детерминированным должен быть процесс генерации текста.

Идея генерации текста состоит в том, чтобы заставить эту обученную сеть выводить набор вероятностей для каждого слова, из которого мы можем сделать выборку.

  • Низкая температура делает этот процесс более жестким/детерминированным — это означает, что слова с наибольшей вероятностью будут (скорее всего) добавлены после данного слова.
  • Высокая температура (max = 1) означает, что каждое слово выбирается с той вероятностью, которую выдала модель. Другими словами, более авантюрный текст.

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

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

Это только начало каждой истории, но мы можем заметить несколько вещей.

  1. Во-первых, это не «Война и мир», так сказать. Я не ожидал ничего экстраординарного от этой базовой архитектуры и времени обучения (всего 100 эпох, около 3 часов). Если вы не продлите обучение значительно дольше, в результате получится не бестселлер, а оригинальная история! Это реалистичный результат, и он определенно демонстрирует силу генеративного письма — у него огромный потенциал. Помните, это был только базовый LSTM RNN.
  2. диалоговые части истории окружены кавычками и глаголами, такими как сказал и спросил.
  3. Модель чувствительна к вводимому тексту. В нашем примере мы начали с пустой страницы (seed_text=””). Но прогнозы модели будут зависеть от этого ввода. Вы можете попробовать поиграть с этим, изменив этот параметр.

Краткое содержание

В этой статье мы рассмотрели пошаговое руководство о том, как:

  • предварительно обработать (очистить и разметить) заданный текст;
  • преобразовать этот вывод в обучаемый набор функций;
  • построить архитектуру LSTM RNN в Keras;
  • обучить модель;
  • сохранить и загрузить обученную модель;
  • создать новую историю на основе этой обученной модели.

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

Я могу с радостью сказать, что я достиг этой цели.

Спасибо, что дочитали до конца. Надеюсь, вам понравилось и вы узнали что-то новое!

Удачи в вашем путешествии по генеративному машинному обучению. Оставайтесь в целости и сохранности!

P.S. Если вы разочарованы этой сгенерированной историей, я полностью понимаю. Но в то же время меня лично этот результат больше вдохновляет, чем история-бестселлер. Насколько нереально было бы сгенерировать бестселлер за 3 часа со своего ноутбука, пока в этой сфере многомиллиардные инвестиции. Верно? Помните, это только начало. Сфера развивается, и развивается быстро. Все возможно.

Контакт

Свяжитесь со мной в LinkedIn.

P.S. Если вам нравится непрерывное чтение на прекрасной платформе Medium.com, подумайте о том, чтобы поддержать авторов этого сообщества, подписавшись на членство ЗДЕСЬ. Он стоит всего 5 долларов США в месяц и поддерживает всех авторов.

Запланируйте сеанс DDIChat с Русланом Бриленковым по ссылке ниже.



Подайте заявку на участие в программе DDIChat Expert здесь.
Работайте с DDI: https://datadriveninvestor.com/collaborate
Подпишитесь на DDIntel здесь.