PyTorch RNN: Определяем язык по фамилии человека

В данном руководстве, мы построим Рекуррентную Нейронную Сеть (Recurrent Neural Network, далее — RNN) в PyTorch, которая будет классифицировать имена людей по их языкам. Предположим, что у читателя есть основы понимания PyTorch и машинного обучения в Python.

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

Набор данных имён, приведенный в данном руководстве можно скачать здесь: data.zip

Есть вопросы по Python?

На нашем форуме вы можете задать любой вопрос и получить ответ от всего нашего сообщества!

Telegram Чат & Канал

Вступите в наш дружный чат по Python и начните общение с единомышленниками! Станьте частью большого сообщества!

Паблик VK

Одно из самых больших сообществ по Python в социальной сети ВК. Видео уроки и книги для вас!

Это руководство — адаптация официальной документации PyTorch. Вы можете узнать больше из документации.

Другие статьи по PyTorch

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

Установка PyTorch

Заходим на сайт: https://pytorch.org/
PyTorch RNN: Определяем язык по фамилии человека

На сайте будет вот такая форма, где вы сможете выбрать свою операционную систему, менеджер пакетов, версия Python (Есть даже для самого нового Python 3.7) и версия CUDA (можно выбрать None если он не установлен). В зависимости от вашего выбора, вы получите инструкцию по установке.

Предварительная обработка данных

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

Чтобы загрузить все файлы одним махом, мы используем модуль Python под названием glob. Модуль glob находит все совпадения названий путей по особому шаблону, в соответствии с правилами, используемыми в оболочке Unix. Результаты возвращаются в произвольном порядке. Мы используем его для загрузки всех файлов с окончанием .txt в папку.

PyTorch RNN: Определяем язык по фамилии человека

В данный момент, названия находятся в формате Unicode. Однако, нам нужно конвертировать их в стандарт ASCII. Это поможет с удалением диакритиков в словах. Например, французское имя Béringer будет конвертировано в Beringer.

Следующий шаг — создание словаря со списком имен для каждого языка.

Мы можем ознакомиться с первыми 15 именами во французском словаре, как показано ниже.

PyTorch RNN: Определяем язык по фамилии человека

Превращение имен в тензоры PyTorch

Работая с данными в PyTorch, нам нужно конвертировать их в тензоры PyTorch. Это очень похоже на массивы NumPy. В нашем случае, нам нужно конвертировать каждую букву в тензор torch. Это будет один вектор, наполненный нулями, за исключением единицы в индексе текущей буквы. Посмотрим, как это работает, и затем конвертируем M в один вектор.

PyTorch RNN: Определяем язык по фамилии человека

Чтобы сформировать одно имя, нам нужно соединить несколько векторов, чтобы создать двухмерную матрицу в numpy.

Создание RNN

При создании нейронной сети в PyTorch, мы используем torch.nn.Module, который является основным классом для всех модулей нейронных сетей. В то же время, torch.autograd предоставляет классы и функции, реализующие автоматическое дифференцирование произвольных скалярных функций. И torch.nn.LogSoftmax применяет функцию Log(Softmax(x)) к n-мерному тензору ввода.

Тестирование RNN

Мы начнем с создания экземпляра класса RNN и передачи необходимых аргументов.

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

Наш __main__ будет выглядеть так:

Результат работы:

Тренировка RNN

Чтобы получить вероятность для каждого языка, мы используем Tensor.topk для получения индекса наибольшего значения.

Далее, нам нужен быстрый способ получить имя и его выдачу (output). На данный момент у нас такой файл main.py (мы выделили участки кода которые были добавлены):

Результат выполнения:

Следующий шаг – определение функции loss и создание оптимизатора, который будет обновлять параметры модели, в соответствии с её градиентами. Мы также устанавливаем скорость обучения нашей модели.

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

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


Построение графиков

Мы создаем графики на основе результатов при помощи pyplot от Matplotlib. График покажет нам скорость обучения нашей нейронной сети.

PyTorch RNN: Определяем язык по фамилии человека

Оценка результатов

Мы создадим запутанную матрицу в numpy, чтобы увидеть, как нейронная сеть проявляет себя в разных категориях. Яркие точки на основной оси показывают языки, которые были выбраны неправильно.

PyTorch RNN: Определяем язык по фамилии человека

Угадывание новых имен

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

PyTorch RNN: Определяем язык по фамилии человека

Вывод

Если вы хотите узнать побольше о PyTorch, есть масса руководств в официальной документации. Если вы хотите узнать больше о RNN, Брайан Мванги написал фантастический гайд на эту тему.