В этой статье вы узнаете, как построить сеть LSTM в Керасе. Здесь я объясню все мелкие детали, которые помогут вам сразу же начать работу с LSTM.

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

Векторизация и формат ввода:

В этом разделе вы узнаете, как векторизовать данные и передать их в качестве входных данных в архитектуру. Я возьму пример, чтобы вы могли научиться вводить данные на основе вашего набора данных. Здесь я возьму набор данных Amazon Reviews, чтобы показать, как векторизовать ваши данные. Вы можете скачать набор данных здесь.

Прежде чем двигаться вперед, сначала давайте посмотрим на данные и немного их очистим. Сначала мы загрузим файл .csv с помощью библиотеки pandas. Мы возьмем те отзывы, рейтинг которых не равен 3 звездам, поскольку отзыв с рейтингом 3 звезды является нейтральным. Ниже приведен код, позволяющий сделать то же самое.

Теперь мы проведем стандартную предварительную обработку данных, удалив HTML-теги, стоп-слова и дубликаты. Вы можете увидеть подробности здесь. После очистки набора данных у нас будет два столбца. Один будет содержать отзывы, а другой будет содержать метки 1 или 0. 1 означает положительный отзыв, а 0 означает отрицательный отзыв.

Следующий шаг - векторизация данных. Мы векторизуем данные, используя класс токенизатора модуля Keras. Это присваивает каждому уникальному слову целое число. Итак, теперь каждое слово будет обозначаться целым числом. Ниже приведен код, который именно это делает.

Каждое слово должно быть представлено вектором, чтобы модель могла их понять. Есть два способа: один - использовать предварительно обученные вложения слов, такие как word2vec и glove, другой - обучить собственное встраивание слов для вашего набора данных. Мы можем сделать это, используя слой встраивания модуля Keras во время обучения нашей модели глубокого обучения. Встраиваемый слой принимает размер словарного запаса, размерность вектора слов и длину ввода каждого обзора. Здесь мы сохраним размерность 32. Тогда каждое слово будет представлено вектором длины 32 после завершения обучения. Мы уже установили максимальную длину обзоров до 150. Ниже приведен код для определения уровня внедрения.

Вы можете видеть, что слой Embedding - это первый слой модели. Мы должны указать следующие три аргумента.

  1. размер словаря: количество уникальных слов в обучающем наборе. Если слова закодированы от 0 до 100, размер словаря будет 101.
  2. output dim: это размер, в котором будет закодировано каждое слово в обучающем наборе. Вы можете выбрать любой размер. Пример: 8, 32, 100 и т. Д. Здесь мы выбрали 32.
  3. длина ввода: длина входных последовательностей. Если вся входная последовательность ваших данных - 100, тогда это значение будет 100. Для нашего случая мы выбрали 150.

Архитектура модели:

В этом разделе мы определим модель. В нашей архитектуре мы будем использовать два уровня LSTM, каждый по 128 единиц, один на другом. Обычный LSTM в 3-4 раза медленнее по сравнению с CuDNNLSTM. Поэтому, если вы тренируетесь на GPU, тренируйтесь с CuDNNLSTM. Вы увидите, что скорость обучения волшебным образом увеличится в 3-4 раза. Ниже приведен код для определения архитектуры.

Если вы хотите использовать составные слои LSTM, используйте return_sequences = True перед передачей ввода на следующий уровень LSTM. Для последнего уровня LSTM нет необходимости использовать return_sequences = True. Вы можете изменить количество используемых единиц. Здесь используется 128, вы можете использовать то, что подходит для вашего случая. Вы можете варьировать эти значения, сохраняя наилучшее значение. Вы также можете попробовать другие функции активации и посмотреть, какая из пяти лучшая производительность, а затем вы можете выбрать лучшую. Вы также можете попробовать сложить больше слоев и проверить, есть ли улучшение.

Модельное обучение:

В этом разделе мы обучим модель, которую мы определили выше. Мы можем обучить модель с помощью метода «model.fit». Это требует следующих аргументов:

  1. x_train: это векторизованные данные для обучения. Здесь мы векторизовали обзоры и сохранили их в x_train.
  2. y_train: содержит ярлыки векторизованных отзывов.
  3. batch_size: это количество точек данных, видимых моделью, после которых модель обновит веса. Не держите это на низком уровне, так как время тренировки увеличится. Попробуйте использовать набор ценностей и найдите лучшее для вашего случая. Здесь мы взяли размер партии = 1024.
  4. эпохи: сколько раз модель будет видеть данные во время обучения перед его окончанием.
  5. validation_split: это процент данных, на которых будет выполняться проверка во время обучения.
  6. обратные вызовы: это функции, которые вызываются во время обучения для отслеживания состояний модели во время обучения. Во время обучения мы не знаем, когда остановиться, так как модель остановится только после того, как будет достигнуто указанное количество эпох. Иногда может случиться так, что модель достигла оптимума раньше этого количества эпох, но продолжала тренироваться и переобучаться. Чтобы предотвратить это, мы будем использовать обратные вызовы, которые будут отслеживать потерю модели во время обучения. Если потери не уменьшаются в течение нескольких эпох, то обучение модели прекращается. В этом случае мы решили, что если убыток не уменьшится даже через 4 эпохи, мы остановимся.

Следующий код выполняет то, что было упомянуто выше.

С этой архитектурой мы получили точность 83% на тестовом наборе данных. Использование двунаправленных LSTM вместо однонаправленных LSTM дало нам точность 92%. Ниже приведен код для использования двунаправленных LSTM.

Теперь вопрос в том, какова интуиция в использовании двунаправленных LSTM. В однонаправленном LSTM мы кодируем слово, просто глядя на слова, которые находятся слева от этого слова. В двунаправленном LSTM мы кодируем слово, глядя на слова, которые находятся слева и справа от этого слова. Совершенно очевидно, что мы можем лучше закодировать слово, если будем наблюдать слова слева и справа. Верно?

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

Надеюсь, это поможет вам начать работу с LSTM. Я предоставлю ссылку на блокнот jupyter для дальнейшего использования. Вы можете просмотреть блокнот здесь.

Если у вас есть сомнения, дайте мне знать.

Использованная литература:

  1. Https://keras.io/getting-started/sequential-model-guide/
  2. Http://www.bioinf.jku.at/publications/older/2604.pdf
  3. Https://keras.io/callbacks/
  4. Https://keras.io/layers/recurrent/