Как разработать двунаправленный LSTM для классификации последовательностей в Python с помощью Keras

Как разработать двунаправленный LSTM для классификации последовательностей в Python с помощью Keras

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

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

В этом руководстве вы узнаете, как разрабатывать двунаправленные LSTM для классификации последовательностей в Python с помощью библиотеки глубокого обучения Keras.

После прохождения этого урока вы будете знать:

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

Начните свой проект с моей новой книгой Long-Term Memory Networks With Python, включая пошаговые инструкции и Исходный код Python файлы для всех примеров.

Давайте начнем.

  • Обновление январь / 2020: Обновлен API для Keras 2.3 и TensorFlow 2.0.
Как разработать двунаправленный LSTM для классификации последовательностей в Python с помощью Keras

Как разработать двунаправленный LSTM для классификации последовательностей в Python с помощью Keras
Фото Криштиану Медейроса Дальбема, некоторые права защищены.

Обзор

Это руководство разделено на 6 частей; они есть:

  1. Двунаправленные LSTM
  2. Проблема классификации последовательностей
  3. LSTM для классификации последовательностей
  4. Двунаправленный LSTM для классификации последовательностей
  5. Сравните LSTM с двунаправленным LSTM
  6. Сравнение режимов двунаправленного слияния LSTM

Среда

В этом руководстве предполагается, что у вас установлена ​​среда Python SciPy. В этом примере вы можете использовать Python 2 или 3.

В этом руководстве предполагается, что у вас установлен Keras (v2.0.4 +) с серверной частью TensorFlow (v1.1.0 +) или Theano (v0.9 +).

В этом руководстве также предполагается, что у вас установлены scikit-learn, Pandas, NumPy и Matplotlib.

Если вам нужна помощь в настройке среды Python, см. Этот пост:

Нужна помощь с LSTM для прогнозирования последовательности?

Пройдите мой бесплатный 7-дневный курс электронной почты и откройте для себя 6 различных архитектур LSTM (с кодом).

Нажмите, чтобы зарегистрироваться, а также получите бесплатную электронную версию курса в формате PDF.

Начните БЕСПЛАТНЫЙ мини-курс прямо сейчас!

Двунаправленные LSTM

Идея двунаправленных рекуррентных нейронных сетей (RNN) проста.

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

Чтобы преодолеть ограничения обычной RNN […] мы предлагаем двунаправленную рекуррентную нейронную сеть (BRNN), которую можно обучить с использованием всей доступной входной информации в прошлом и будущем определенного периода времени.

Идея состоит в том, чтобы разделить нейроны состояния обычной RNN на часть, которая отвечает за положительное направление времени (прямые состояния), и часть за отрицательное направление времени (обратные состояния).

- Майк Шустер и Калдип К. Паливал, Двунаправленные рекуррентные нейронные сети, 1997 г.

Этот подход был использован для большого эффекта с рекуррентными нейронными сетями с долгосрочной краткосрочной памятью (LSTM).

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

… Полагаться на знание будущего на первый взгляд кажется нарушением причинно-следственной связи. Как мы можем основывать свое понимание того, что мы слышали, на том, что еще не было сказано? Однако слушатели-люди поступают именно так. Звуки, слова и даже целые предложения, которые поначалу ничего не значили, не имеют смысла в свете будущего контекста. Что мы должны помнить, так это различие между задачами, которые действительно находятся в режиме онлайн, требующими вывода после каждого ввода, и теми, где выводы необходимы только в конце некоторого входного сегмента.

- Алекс Грейвс и Юрген Шмидхубер, Фреймовая классификация фонем с двунаправленным LSTM и другими архитектурами нейронных сетей, 2005 г.

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

Мы обнаружили, что двунаправленные сети значительно более эффективны, чем однонаправленные…

- Алекс Грейвс и Юрген Шмидхубер, Фреймовая классификация фонем с двунаправленным LSTM и другими архитектурами нейронных сетей, 2005 г.

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

Двунаправленные LSTM в Керасе

Двунаправленные LSTM поддерживаются в Keras через оболочку двунаправленного слоя.

Эта оболочка принимает в качестве аргумента повторяющийся уровень (например, первый уровень LSTM).

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

  • 'сумма': Выходы складываются.
  • 'мул': Выходы умножаются.
  • 'concat': Выходы объединяются вместе (по умолчанию), обеспечивая удвоение количества выходов для следующего уровня.
  • 'пр.': Берется среднее значение выходов.

Режим по умолчанию - объединение, и этот метод часто используется в исследованиях двунаправленных LSTM.

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

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

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

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

Используется порог 1/4 длины последовательности.

Например, ниже представлена ​​последовательность из 10 временных шагов ввода (X):

Соответствующий результат классификации (y) будет:

Мы можем реализовать это на Python.

Первый шаг - сгенерировать последовательность случайных значений. Мы можем использовать функцию random () из модуля random.

Мы можем определить порог как четверть длины входной последовательности.

Совокупную сумму входной последовательности можно вычислить с помощью функции cumsum () NumPy. Эта функция возвращает последовательность значений совокупной суммы, например:

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

Функция ниже, названная get_sequence (), собирает все это вместе, принимая в качестве входных данных длину последовательности, и возвращает компоненты X и y нового проблемного случая.

Мы можем протестировать эту функцию с новой последовательностью 10 временных шагов следующим образом:

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

LSTM для классификации последовательностей

Мы можем начать с разработки традиционной LSTM для задачи классификации последовательностей.

Во-первых, мы должны обновить функцию get_sequence (), чтобы преобразовать входные и выходные последовательности в трехмерные, чтобы они соответствовали ожиданиям LSTM. Ожидаемая конструкция имеет размеры [samples, timesteps, features].

Задача классификации состоит из 1 выборки (например, одной последовательности), настраиваемого количества временных шагов и одной функции на каждый временной шаг.

Следовательно, мы можем изменить последовательность следующим образом.

Обновленная функция get_sequence () приведена ниже.

Мы определим последовательности как имеющие 10 временных шагов.

Затем мы можем определить LSTM для проблемы. Входной слой будет иметь 10 временных шагов с одним элементом, input_shape = (10, 1).

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

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

Вас также может заинтересовать