Рекуррентная нейронная сеть – Модель (Model) Машинного обучения (ML), работающая по принципу сохранения слоя и его переподачи.
Нейронные сети
Нейронная сеть (Neural Network) состоит из разных слоев, связанных друг с другом и работающих над функциями человеческого мозга. Последний учится на огромных объемах данных и использует сложные алгоритмы для обучения нейронной сети.
Вот пример того, как нейронные сети могут определять породу собаки по ее характеристикам:
- Пиксели изображения двух разных пород собак поступают на входной слой нейронной сети.
- Пиксели изображения обрабатываются в скрытых слоях для выделения признаков.
- Выходной слой дает результат, позволяющий определить, является ли это немецкой овчаркой или лабрадором.
Такие сети не требуют запоминания прошлых результатов. Такие алгоритмы помогают решить разные бизнес-задачи. Давайте посмотрим на некоторые из них.
Популярные нейронные сети
- Нейронная сеть с прямой связью (Feed-Forward Neural Network) используется для задач Регрессии (Regression) и Классификации (Classification).
- Сверточная нейронная сеть (CNN) – для обнаружения объектов и классификации изображений.
- Сеть глубокого убеждения (Deep Belief Network) – в секторах здравоохранения для обнаружения рака.
- Рекуррентная нейронная сеть используется для распознавания речи, распознавания голоса, прогнозирования временных рядов и обработки естественного языка.
Ниже показано, как преобразовать нейронную сеть с прямой связью в рекуррентную:
Узлы на разных уровнях нейронной сети сжимаются, чтобы сформировать единый рекуррентный слой. A, B и C – параметры сети.
Здесь x – входной слой, h – скрытый слой, y – выходной слой. A, B и C используются для улучшения вывода модели. В любой момент времени t текущий вход представляет собой комбинацию входов в x(t) и x(t-1). Выходные данные в любой момент времени возвращаются в сеть для улучшения выходных данных.
Почему RNN?
Рекуррентные нейронные сети были созданы, потому что в нейронной сети с прямой связью было несколько проблем:
- Не могут обрабатывать последовательные данные
- Учитывают только текущую вводную информацию
- Невозможно запомнить предыдущий ввод
RNN же может работать последовательно, принимая текущие и ранее полученные входные данные, а также запоминать благодаря своей внутренней памяти.
Приложения рекуррентных нейронных сетей
RNN используются для:
- Распознавания предметов на изображениях:
- Прогнозирования временных рядов: любую задачу временных рядов, такую как прогнозирование цен акций в конкретном месяце, можно решить с помощью RNN.
- Обработка естественного языка (NLP): эмоциональная оценка, анализ тональности.
- Машинный перевод: текст с одного языка переводится на несколько из них.
RNN: Torch
Рекуррентная нейросеть вполне доступно реализована на Keras. Для начала импортируем все необходимые библиотеки:
Объединим все предложения и вычленим уникальные символы, затем создадим словарь из символов и их порядковых номеров и его инверсированную версию:
Найдем наиболее длинное слово. Создадим цикл, который пройдет через список предложений и добавит столько пробелов, чтобы длина у всех предложений стала одинаковая:
Создадим списки для входных и целевых последовательностей. В цикле удалим первые символ и букву первой последовательности:
Вот так странновато выглядят входная и целевая последовательности символов:
Преобразуем с помощью цикла символы в целочисленные значения-псевдонимы:
Инициируем функцию one_hot_encode и создадим многомерный ряд нулей с желаемым разрешением. Создадим для каждой буквы по объекту, где заменим единицами вхождения этой буквы в предложении и нолями – другие буквы:
Входное разрешение -> (Размер пакета, длина последовательности, масштаб Горячего кодирования (One-Hot Encoding)):
Инициируем объекты – входную и целевую последовательности:
torch.cuda.is_available() возвращает булевое True, если графический процессор доступен. Создадим переменную, обозначающую доступность графического процессора, чтобы в дальнейшем использовать ее.
Cuda недоступен:
Создадим класс модели. Определим некоторые параметры и определим слои RNN. Инициализируем скрытое состояние для первой порции входных данных используя метод ниже. Передаем входные данные и скрытое состояние в модель и получим вывод. Изменим разрешение выходных данных так, чтобы их можно было передать в полносвязный слой. Метод init_hidden генерирует первое скрытое состояние из нолей. Отправим тензор со скрытым состоянием в процессор:
Создадим экземпляр модели с заданными гиперпараметрами. Подадим модель процессору (центральный по умолчанию). Определим гиперпараметры. Определим тип потерь, функцию оптимизации:
Запустим тренировку:
Потери становятся очень показательными, когда рассматриваются в сравнении. И вот теперь отчетливо заметна динамика снижения потерь:
Создадим функцию, которая принимает символы как аргументы и возвращает предсказание – следующий символ. Применим горячее кодирование ко входным данным для передачи в модель. Выбираем класс с наибольшей вероятностью:
Эта функция принимает желаемую длину выходные данных и входные символы как аргументы, возвращая сгенерированное предложение:
Теперь посмотрим, какие символы модель ожидает увидеть после слова good:
Разобраться в таком игрушечном датасете просто, потому и ответ приходит сразу:
Ноутбук, не требующий дополнительной настройки на момент написания статьи, можно скачать здесь.
Фото: @grantritchie
Автор оригинальной статьи: Avijeet Biswal
Понравилась статья? Поддержите нас, поделившись статьей в социальных сетях и подписавшись на канал. И попробуйте курсы на Udemy.