Прежде чем вызывать API, вам нужно понять, как работает LSTM.

машинное обучение TensorFlow
Эта статья начинается с ограничений RNN, описывает основные принципы LSTM с помощью простых концепций и подробных операционных процедур, а затем использует примеры генерации текста, чтобы лучше понять этот вариант RNN. В настоящее время LSTM является очень широко используемой моделью. Мы используем библиотеки глубокого обучения, такие как TensorFlow или PyTorch, чтобы вызывать ее, даже не зная процесса ее работы. Я надеюсь, что эта статья поможет читателям просмотреть или просмотреть LSTM.


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


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


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


Примечание. Чтобы понять эту статью, вам потребуются базовые знания о рекуррентных нейронных сетях и Keras (популярная библиотека глубокого обучения).


Как используются RNN? Небольшой мастер-класс для начинающих

LSTM, GRU и нейронные машины Тьюринга: объяснение самых популярных рекуррентных нейронных сетей глубокого обучения

Прогнозирование многомерных временных рядов LSTM на основе Keras

Получите последовательное обучение Keras за десять минут (с реализацией кода)


содержание


1. Введение в рекуррентные нейронные сети (RNN)

2. Ограничения RNNS

3. Повышение производительности RNN: долговременная кратковременная память (LSTM)

4. Архитектура LSTM

4.1 Забытые ворота

4.2 Входные ворота

4.3 Выходной шлюз

4.4 Общий процесс LSTM

5. Используйте LSTM для генерации текста


1. Введение в рекуррентные нейронные сети (RNN)


Рассмотрим непрерывные данные, такие как цена акции на фондовом рынке. Простая модель машинного обучения (или искусственная нейронная сеть) может предсказывать будущие цены, изучая определенную информацию об истории цен на акции: количество акций, цена открытия акции и так далее. Цена акции зависит от этих характеристик акции, а также имеет высокую корреляцию с ценой акции за последние несколько дней. Фактически, для трейдера цена (или тренд) последних нескольких дней является одним из факторов, определяющих будущие прогнозы цен на акции.


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


Эта временная корреляция достигается рекуррентной нейронной сетью. Типичная RNN выглядит так:



Если его развернуть, то это будет выглядеть так:



Прежде чем прогнозировать цены на акции сегодня, нам теперь проще показать, как эти сети предсказывают тенденции цен на акции. Здесь каждый прогноз в момент времени t (h_t) зависит от всех предыдущих прогнозов и информации, полученной из них.


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


Зачем? Давайте исследовать.


2. Ограничения RNN


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



RNN доказали свою эффективность. Это потому, что вопрос не имеет ничего общего с контекстом утверждения. RNN не нужно запоминать предыдущую информацию или ее значение, ему просто нужно знать, что большую часть времени небо синее. Итак, прогноз будет:



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



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


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


Аналогичная ситуация возникает и в RNN. RNN имеют только кратковременную память, то есть если нам нужна эта информация через короткий промежуток времени, она работает, но как только вводится большое количество слов, информация где-то теряется. Эту проблему можно решить, применив слегка измененную RNN — Long Short-Term Memory Network.


3. Повышение производительности RNN: долговременная кратковременная память (LSTM)


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


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


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


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


Тенденция акций за последние несколько дней, например, рост или падение, то есть состояние единицы или информация памяти о предыдущем временном шаге;

Цена закрытия предыдущего дня, поскольку она тесно связана с ценой открытия текущего дня, то есть со скрытым состоянием единицы или информацией о памяти предыдущего временного шага;

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


Еще одной важной особенностью LSTM является его метод обработки последовательности, LSTM использует этот метод для сбора дополнительной информации и контекстных отношений. На следующем рисунке показана эта последовательная обработка LSTM:



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


4. Архитектура LSTM


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


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


Если в поле зрения появляется совершенно новый подозреваемый, а подозреваемый когда-то затаил обиду на жертву, возможно ли, что он убийца? Поэтому нам нужно «ввести» его в наши новости для дальнейшего анализа.


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


Ниже мы подробно расскажем об архитектуре сети LSTM:



Эта архитектура полностью отличается от известной нам упрощенной версии, но эта статья объяснит ее подробно. Типичная сеть LSTM состоит из разных ячеек или блоков памяти, желтых прямоугольников, которые мы видим на изображении выше. Модули LSTM обычно выводят два состояния для следующего модуля: состояние модуля и скрытое состояние. Блок памяти отвечает за запоминание каждого скрытого состояния или событий предыдущего временного шага.Этот метод памяти обычно реализуется с помощью трех механизмов ворот, а именно входных ворот, забывающих ворот и выходных ворот.


4.1 Забытые ворота


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



Когда модель встречает первую точку после слова «человек», ворота забывания могут понять, что контекст следующего утверждения может измениться. Поэтому подлежащее в предложении, возможно, придется забыть, и место подлежащего освободится. И когда мы говорим о «Дан», освободившуюся ранее субъектную позицию следует отнести к «Дан». Процесс забывания подлежащего «Боб» в предыдущем предложении контролируется воротами забывания.



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


Этот вентиль забывания принимает два входа: h_t-1 и x_t. h_t-1 — скрытое состояние или выходное состояние предыдущего блока, а x_t — вход на конкретном временном шаге, т. е. t-й элемент входной последовательности x. Произведение заданного входного вектора и матрицы весов, а также члена смещения для подачи в сигмовидную функцию. Сигмовидная функция выведет вектор значений от 0 до 1, соответствующий каждому значению в состоянии ячейки. По сути, сигмовидная функция решает, какие значения оставить, а какие забыть. Если состояние ячейки принимает конкретное нулевое значение, то ворота забывания требуют, чтобы состояние ячейки полностью забыло информацию. Этот выходной вектор сигмовидной функции, наконец, умножается на состояние ячейки.


4.2 Входной шлюз


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



Теперь мы знаем, что более важной информацией является то, что «Боб» умеет плавать, и он служил на флоте четыре года. Это может быть добавлено к состоянию ячейки, поэтому этот процесс добавления новой информации может быть выполнен через входной вентиль.



Входной вентиль отвечает за добавление информации в состояние устройства.Этот процесс добавления информации можно разделить на три этапа:


  • Значение, которое необходимо добавить к состоянию ячейки, корректируется функцией Sigmoid, которая очень похожа на ворота забывания, которые действуют как фильтр для фильтрации информации от h_t-1 и x_t.
  • Создайте вектор всех возможных значений, которые можно добавить к состоянию ячейки. Процесс реализуется с помощью функции tanh, которая выводит значение от -1 до 1.
  • Умножьте значение настраивающего фильтра (сигмоидальный вентиль) на созданный вектор (функция тангенса) и добавьте эту полезную информацию к состоянию ячейки.


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


4.3 Выходной шлюз


Не вся информация, которая работает в состоянии ячейки, пригодна для вывода в конкретный момент времени. Продемонстрируем на примере:



В этом заявлении есть много вариантов пробелов. Но мы знаем, что ввод «храбрый» перед пробелом — это прилагательное, изменяющее существительное. Так или иначе, в пробелах есть сильная склонность к существительным. Так что Боб может быть правильным выходом.


Работа по выбору полезной информации из текущего состояния ячейки и отображению ее в качестве вывода выполняется через выходные элементы. Его структура выглядит следующим образом:



Функцию выходного затвора можно снова разделить на три этапа:


1. Создайте вектор после применения функции tanh к состоянию ячейки, чтобы масштабировать значения между -1 и +1.

2. Сгенерируйте фильтр, используя значения h_t-1 и x_t, чтобы он мог настроить значения, которые необходимо вывести из созданного выше вектора. Этот фильтр снова использует сигмовидную функцию.

3. Умножьте значение этого обусловливающего фильтра на вектор, созданный на шаге 1, и отправьте его в качестве вывода в скрытое состояние следующего блока.


Фильтр в приведенном выше примере гарантирует, что он уменьшает все значения, кроме «Боба», поэтому фильтр необходимо построить на входных и скрытых значениях состояния и применить к вектору состояния ячейки.


4.4 Общий процесс LSTM


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


Ниже приведена подробная структура блока LSTM, где Z — входная часть, а Z_i, Z_o и Z_f — значения, управляющие тремя вентилями, то есть они будут фильтровать входную информацию через функцию активации f . Общая функция активации может быть выбрана как сигмовидная функция, поскольку ее выходное значение составляет от 0 до 1, что указывает на степень, в которой открыты три ворот.


Изображение взято из конспектов лекций по машинному обучению Ли Хунъи.


Если мы вводим Z, то произведение g(Z) f(Z_i) входного вектора g(Z), полученного функцией активации, и входной вентиль f(Z_i) представляет собой информацию, сохраненную после фильтрации входных данных. Ворота забывания, управляемые Z_f, будут контролировать, сколько ранее запомненной информации необходимо сохранить, а сохраненная память может быть представлена ​​уравнением c*f(z_f). Ранее сохраненная информация плюс текущая входная значимая информация будут сохранены для следующего модуля LSTM, то есть мы можем использовать c' = g(Z)f(Z_i) + cf(z_f) для представления обновленной памяти, обновленной памяти c ' также означает всю полезную информацию, сохраненную ранее и в настоящее время. Затем мы берем значение активации этой обновленной памяти. h(c') В качестве возможного выхода, как правило, может быть выбрана функция активации tanh. В итоге остается выходной вентиль, управляемый Z_o, который решает, какие из выходов, активированных текущей памятью, полезны. Таким образом, окончательный результат LSTM можно выразить как a = h(c')f(Z_o).


5. Используйте LSTM для генерации текста


Мы уже достаточно знаем о теоретических концепциях и функциях LSTM. Теперь давайте попробуем построить модель, предсказывающую количество «n» символов после исходного текста Макбета. Подавляющее большинство классических текстов больше не защищены авторским правом, и вы можете найти их здесь (https://www.gutenberg.org/), а обновленные версии TXT — здесь (https://s3-ap-south-1). amazonaws.com/av-blog-media/wp-content/uploads/2017/12/10165151/macbeth.txt).

Мы используем Keras — высокоуровневый API для нейронных сетей, работающий поверх TensorFlow или Theano. Поэтому, прежде чем переходить к коду, убедитесь, что у вас установлен работающий Keras. Хорошо, давайте начнем генерировать текст!


импортировать зависимости


# Importing dependencies numpy and keras
import numpy
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import Dropout
from keras.layers import LSTM
from keras.utils import np_utils


Мы импортируем все необходимые зависимости, и это говорит само за себя.


Загрузите текстовый файл и создайте сопоставление символа с целым числом


# load text
filename = "/macbeth.txt"

text = (open(filename).read()).lower()

# mapping characters with integers
unique_chars = sorted(list(set(text)))

char_to_int = {}
int_to_char = {}

for i, c in enumerate (unique_chars):
    char_to_int.update({c: i})
    int_to_char.update({i: c})


Текстовый файл открывается со всеми символами, преобразованными в нижний регистр. Чтобы облегчить следующие шаги, мы сопоставляем каждый символ с соответствующим номером. Это сделано для упрощения вычислительной части LSTM.


Подготовьте набор данных


# preparing input and output dataset
X = []
Y = []

for i in range(0, len(text) - 50, 1):
    sequence = text[i:i + 50]
    label =text[i + 50]
    X.append([char_to_int[char] for char in sequence])
    Y.append(char_to_int[label])


Данные должны быть подготовлены в этом формате. Если мы хотим, чтобы LSTM предсказывал «O» в «HELLO», нам нужно ввести [H, E, L, L] и [O] в качестве ожидаемого результата. Точно так же здесь мы определяем желаемую длину последовательности (в данном примере она равна 50), затем сохраняем кодировку и ожидаемый результат в X для первых 49 символов, которые являются 50-м символом в Y.


изменить форму X


# reshaping, normalizing and one hot encoding
X_modified = numpy.reshape(X, (len(X), 50, 1))
X_modified = X_modified / float(len(unique_chars))
Y_modified = np_utils.to_categorical(Y)


Сеть LSTM ожидает ввода в форме [выборки, временные шаги, функции], где выборки — это количество точек данных, которые у нас есть, временные шаги — это количество зависящих от времени шагов, присутствующих в одной точке данных, а функции — это наши соответствующие значения. в Y для количества переменных со значениями истинности. Затем мы масштабируем значения в X_modified между 0 и 1 и одним горячим кодируем истинное значение в Y_modified.


Определите модель LSTM


# defining the LSTM model
model = Sequential()
model.add(LSTM(300, input_shape=(X_modified.shape[1], X_modified.shape[2]), return_sequences=True))
model.add(Dropout(0.2))
model.add(LSTM(300))
model.add(Dropout(0.2))
model.add(Dense(Y_modified.shape[1], activation='softmax'))

model.compile(loss='categorical_crossentropy', optimizer='adam')


Используйте последовательную модель с линейным стеком слоев. Первый уровень — это уровень LSTM с 300 ячейками памяти, и он возвращает последовательности. Это делается для того, чтобы следующий слой LSTM получал последовательности, а не просто случайно разбросанные данные. Слой исключения применяется после каждого слоя LSTM, чтобы избежать переобучения модели. Наконец, мы получаем последний слой как полносвязный слой с функцией активации softmax и тем же количеством нейронов, что и уникальные символы, поскольку нам нужно вывести один результат горячего кодирования.


Подгонка модели и создание персонажей


# fitting the model
model.fit(X_modified, Y_modified, epochs=1, batch_size=30)

# picking a random seed
start_index = numpy.random.randint(0, len(X)-1)
new_string = X[start_index]

# generating characters
for i in range(50):
    x = numpy.reshape(new_string, (1, len(new_string), 1))
    x = x / float(len(unique_chars))

#predicting
pred_index = numpy.argmax(model.predict(x, verbose=0))
char_out = int_to_char[pred_index]
seq_in = [int_to_char[value] for value in new_string]
print(char_out)

new_string.append(pred_index)
new_string = new_string[1:len(new_string)]


Модель подходит для более чем 100 эпох, каждая из которых имеет размер партии 30. Затем мы фиксируем случайное начальное число (для простоты воспроизводимости) и начинаем генерировать символы. Прогнозам модели присваивается кодировка предсказанного символа, которая затем декодируется в символьное значение и добавляется к шаблону.


На следующем рисунке показано, как выглядит вывод этой сети:



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


Эпилог


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


Исходная ссылка: https://www.analyticsvidhya.com/blog/2017/12/fundamentals-of-deep-learning-introduction-to-lstm/