Найти тему

RNN в Машинном обучении простыми словами

Рекуррентная нейронная сеть – Модель (Model) Машинного обучения (ML), работающая по принципу сохранения слоя и его переподачи.

Нейронные сети

Нейронная сеть (Neural Network) состоит из разных слоев, связанных друг с другом и работающих над функциями человеческого мозга. Последний учится на огромных объемах данных и использует сложные алгоритмы для обучения нейронной сети.

Вот пример того, как нейронные сети могут определять породу собаки по ее характеристикам:

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

Такие сети не требуют запоминания прошлых результатов. Такие алгоритмы помогают решить разные бизнес-задачи. Давайте посмотрим на некоторые из них.

Популярные нейронные сети

  • Нейронная сеть с прямой связью (Feed-Forward Neural Network) используется для задач Регрессии (Regression) и Классификации (Classification).
  • Сверточная нейронная сеть (CNN) – для обнаружения объектов и классификации изображений.
  • Сеть глубокого убеждения (Deep Belief Network) – в секторах здравоохранения для обнаружения рака.
  • Рекуррентная нейронная сеть используется для распознавания речи, распознавания голоса, прогнозирования временных рядов и обработки естественного языка.

Ниже показано, как преобразовать нейронную сеть с прямой связью в рекуррентную:

-2

Узлы на разных уровнях нейронной сети сжимаются, чтобы сформировать единый рекуррентный слой. A, B и C – параметры сети.

-3

Здесь x – входной слой, h – скрытый слой, y – выходной слой. A, B и C используются для улучшения вывода модели. В любой момент времени t текущий вход представляет собой комбинацию входов в x(t) и x(t-1). Выходные данные в любой момент времени возвращаются в сеть для улучшения выходных данных.

-4

Почему RNN?

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

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

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

Приложения рекуррентных нейронных сетей

RNN используются для:

  • Распознавания предметов на изображениях:
RNN узнает собаку с мячом. Фото: Anna Dudkova / Unsplash
RNN узнает собаку с мячом. Фото: Anna Dudkova / Unsplash
  • Прогнозирования временных рядов: любую задачу временных рядов, такую ​​как прогнозирование цен акций в конкретном месяце, можно решить с помощью RNN.
  • Обработка естественного языка (NLP): эмоциональная оценка, анализ тональности.
  • Машинный перевод: текст с одного языка переводится на несколько из них.

RNN: Torch

Рекуррентная нейросеть вполне доступно реализована на Keras. Для начала импортируем все необходимые библиотеки:

-6

Объединим все предложения и вычленим уникальные символы, затем создадим словарь из символов и их порядковых номеров и его инверсированную версию:

-7

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

-8

Создадим списки для входных и целевых последовательностей. В цикле удалим первые символ и букву первой последовательности:

-9

Вот так странновато выглядят входная и целевая последовательности символов:

-10

Преобразуем с помощью цикла символы в целочисленные значения-псевдонимы:

-11

Инициируем функцию one_hot_encode и создадим многомерный ряд нулей с желаемым разрешением. Создадим для каждой буквы по объекту, где заменим единицами вхождения этой буквы в предложении и нолями – другие буквы:

-12

Входное разрешение -> (Размер пакета, длина последовательности, масштаб Горячего кодирования (One-Hot Encoding)):

-13

Инициируем объекты – входную и целевую последовательности:

-14

torch.cuda.is_available() возвращает булевое True, если графический процессор доступен. Создадим переменную, обозначающую доступность графического процессора, чтобы в дальнейшем использовать ее.

-15

Cuda недоступен:

-16

Создадим класс модели. Определим некоторые параметры и определим слои RNN. Инициализируем скрытое состояние для первой порции входных данных используя метод ниже. Передаем входные данные и скрытое состояние в модель и получим вывод. Изменим разрешение выходных данных так, чтобы их можно было передать в полносвязный слой. Метод init_hidden генерирует первое скрытое состояние из нолей. Отправим тензор со скрытым состоянием в процессор:

-17

Создадим экземпляр модели с заданными гиперпараметрами. Подадим модель процессору (центральный по умолчанию). Определим гиперпараметры. Определим тип потерь, функцию оптимизации:

-18

Запустим тренировку:

-19

Потери становятся очень показательными, когда рассматриваются в сравнении. И вот теперь отчетливо заметна динамика снижения потерь:

-20

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

-21

Эта функция принимает желаемую длину выходные данных и входные символы как аргументы, возвращая сгенерированное предложение:

-22

Теперь посмотрим, какие символы модель ожидает увидеть после слова good:

-23

Разобраться в таком игрушечном датасете просто, потому и ответ приходит сразу:

-24

Ноутбук, не требующий дополнительной настройки на момент написания статьи, можно скачать здесь.

Фото: @grantritchie

Автор оригинальной статьи: Avijeet Biswal

Понравилась статья? Поддержите нас, поделившись статьей в социальных сетях и подписавшись на канал. И попробуйте курсы на Udemy.