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

автор

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

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

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

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

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

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

Установка PyTorch

Заходим на сайт: https://pytorch.org/

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

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

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

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

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

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

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

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

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

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

Создание 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).

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


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

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

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

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

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

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

Вывод

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

Вам может быть интересно

Scroll Up