Азбука LSTM

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

LSTM, как и в стандартной RNN, получает входные данные от входа текущего временного шага x<t> и от активации скрытого состояния предыдущего временного шага a<t-1>. Основными конструктивными различиями между двумя агрегатами являются:

  • введение состояния ячейки памяти c<t>,
  • введение трех сигмовидных ворот (забыть ворота σf<t>, обновить ворота σu<t>,выходных воротσo<t>),
  • и возможность удалять или добавлять информацию о состоянии ячейки памяти.

Давайте разберем происходящее на отдельные этапы:

Шаг 1: вентиль забывания σf<t> действует как переключатель и решает, следует ли отбрасывать информацию о состоянии ячейки памяти, полученную на предыдущем временном шаге c<t-1>. Он делает это, применяя линейное преобразование к своим входам x<t> и a<t-1>, а затем передает выходные данные через логистическую функцию, которая затем выводит значение от 0 до 1.

Шаг 2: Затем вычислите активацию временной памяти ∫č<t>, которая содержит информацию ячейки временной памяти о текущем временном шаге. Это вычисляется путем передачи входных данных x<t> и a<t-1> через линейный слой, а затем через функцию активации tanh, которая затем выводит значение от -1 до 1.

Шаг 3: Затем у нас есть ворота обновления σu<t>, которые имеют ту же вычислительную форму, что и ворота забывания (т. е. линейно-логистические), и, как и ворота забывания, его задача состоит в том, чтобы решить, отбрасывать или нет активация временной памяти ∫č<t>.

Шаг 4: Затем мы обновляем состояние ячейки памяти c<t>, которое является ядром конструкции LSTM, потому что это то, что позволяет LSTM запоминать информацию на большом расстоянии. Мы делаем это, умножая информацию о состоянии ячейки, полученную на предыдущем временном шаге c<t-1>, на вентиль забывания σf<t> и прибавляя это к умножению шлюза обновления σu<t> и активации временной памяти ∫č<t>.

В зависимости от значений вентилей забывания и обновления состояние ячейки памяти может демонстрировать различное поведение, например, если вентиль забывания σf<t> включен (1), а вентиль обновления σu<t> выключен (0), состояние ячейки памяти будет вычислять что-то близкое к функция идентификации: c<t> = c<t-1>

Шаг 5. Затем мы вычисляем активацию памяти ∫c<t>, которая представляет собой просто состояние ячейки памяти c<t>, переданное через функцию tanh.

Шаг 6. Затем у нас есть выход σo<t>, который, как и шлюзы забывания и обновления, имеет ту же линейно-логистическую вычислительную форму и определяет, будет ли активация памяти ∫c<t> передана в остальная часть сети.

Шаг 7: Наконец, мы вычисляем активацию скрытого состояния a<t> путем умножения выходного логического элемента σo<t> на активацию памяти ∫c<t> и передаем выходные данные следующему временному шагу и предсказанному выходному линейному слою.

Заключение

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