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