Азбука 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.