Идея, лежащая в основе Recurrent Neural Network (RNN), мне ясна. Я понимаю это следующим образом: у
нас есть последовательность наблюдений ( ) (или, другими словами, многомерный временной ряд). Каждое отдельное наблюдение является числовым вектором. В рамках RNN-модели мы предполагаем, что следующее наблюдение является функцией предыдущего наблюдения а также предыдущего "скрытого состояния" , где скрытые состояния также представлены числовым векторы (размеры наблюдаемого и скрытого состояний могут быть разными). Предполагается, что сами скрытые состояния также зависят от предыдущего наблюдения и скрытого состояния:
Наконец, в модели RNN предполагается , что функция является нейронной сетью. Мы обучаем (приспосабливаем) нейронную сеть, используя доступные данные (последовательность наблюдений). Наша цель в обучении - максимально точно предсказать следующее наблюдение, используя предыдущие наблюдения.
Теперь сеть LSTM является модификацией сети RNN. Насколько я понял, мотивация за LSTM состоит в том, чтобы решить проблему короткой памяти, которая свойственна RNN (обычные RNN имеют проблемы с связанными событиями, которые слишком далеко разделены во времени).
Я понимаю, как работают сети LSTM. Вот лучшее объяснение LSTM , что я нашел. Основная идея заключается в следующем:
В дополнение к вектору скрытого состояния мы вводим так называемый вектор «состояния ячейки», который имеет тот же размер (размерность), что и вектор скрытого состояния ( ). Я думаю, что вектор «состояния ячейки» вводится для моделирования долговременной памяти. Как и в случае обычного RNN, сеть LSTM получает наблюдаемое и скрытое состояние в качестве входных данных. Используя этот вход, мы вычисляем новое «состояние ячейки» следующим образом:
где функции , и моделируются нейронными сетями. Чтобы упростить выражение, я просто удалил аргументы:
Итак, мы можем видеть, что новый «вектор состояния ячейки» ( ) является взвешенной суммой вектора старого состояния ( ) и «промежуточного» вектора состояния ячейки ( ). Умножение между векторами является компонентным (мы умножаем два N-мерных вектора и получаем, в результате, еще один N-мерный вектор). Другими словами, мы смешиваем два вектора состояний ячейки (старый и промежуточный), используя веса, специфичные для компонента.
Вот интуиция между описанными операциями. Вектор состояния ячейки можно интерпретировать как вектор памяти. Второй вектор весов (рассчитанный нейронной сетью) является воротами "держать" (или забыть). Его значения определяют, будем ли мы сохранять или забыть (стереть) соответствующее значение из вектора состояния ячейки (или вектора долговременной памяти). Первый вектор весов ( ), который вычисляется другой нейронной сетью, называется «записывать» или «запоминать» логические элементы. Он решает, должна ли быть сохранена новая память («промежуточный» вектор состояния ячейки) (или, точнее, если ее конкретный компонент должен быть сохранен / записан). «Промежуточный»вектор). На самом деле, было бы точнее сказать, что с двумя векторами весов ( и ) мы «смешиваем» старую и новую память.
Итак, после вышеописанного смешивания (или забывания и запоминания) у нас появляется новый вектор состояния ячейки. Затем мы вычисляем «промежуточное» скрытое состояние, используя другую нейронную сеть (как и раньше, мы используем наблюдаемое состояние и скрытое состояние качестве входных данных). Наконец, мы объединяем новое состояние ячейки (память) с «промежуточным» скрытым состоянием ( ), чтобы получить новое (или «конечное») скрытое состояние, которое мы фактически выводим:
где - сигмовидная функция, применяемая к каждому компоненту вектора состояния ячейки.
Итак, мой вопрос: почему (или как именно) эта архитектура решает проблему?
В частности, я не понимаю следующее:
- Мы используем нейронную сеть для генерации «промежуточной» памяти (вектор состояния ячейки), которая смешивается со «старой» памятью (или состоянием ячейки), чтобы получить «новую» память (состояние ячейки). Весовые коэффициенты для микширования также рассчитываются нейронными сетями. Но почему мы не можем использовать только одну нейронную сеть для вычисления «нового» состояния ячейки (или памяти). Или, другими словами, почему мы не можем использовать наблюдаемое состояние, скрытое состояние и старую память в качестве входных данных для нейронной сети, которая вычисляет «новую» память?
- В конце мы используем наблюдаемое и скрытое состояния, чтобы вычислить новое скрытое состояние, а затем мы используем «новое» состояние ячейки (или (долгосрочную) память), чтобы исправить компонент вновь вычисленного скрытого состояния. Другими словами, компоненты состояния ячейки используются так же, как веса, которые просто уменьшают соответствующие компоненты вычисленного скрытого состояния. Но почему вектор состояния клетки используется именно таким образом? Почему мы не можем вычислить новое скрытое состояние, помещая вектор состояния ячейки (долговременную память) на вход нейронной сети (которая также принимает наблюдаемое и скрытое состояния в качестве входных данных)?
Добавлено:
Вот видео, которое может помочь прояснить, как организованы разные ворота («держать», «писать» и «читать»).