Какова интуиция, лежащая в основе рекуррентной нейронной сети с долговременной памятью (LSTM)?

11

Идея, лежащая в основе Recurrent Neural Network (RNN), мне ясна. Я понимаю это следующим образом: у
нас есть последовательность наблюдений ( ) (или, другими словами, многомерный временной ряд). Каждое отдельное наблюдение является числовым вектором. В рамках RNN-модели мы предполагаем, что следующее наблюдение является функцией предыдущего наблюдения а также предыдущего "скрытого состояния" , где скрытые состояния также представлены числовым векторы (размеры наблюдаемого и скрытого состояний могут быть разными). Предполагается, что сами скрытые состояния также зависят от предыдущего наблюдения и скрытого состояния:o1,o2,,onoiNoi+1oihi

oi,hi=F(oi1,hi1)

Наконец, в модели RNN предполагается , что функция является нейронной сетью. Мы обучаем (приспосабливаем) нейронную сеть, используя доступные данные (последовательность наблюдений). Наша цель в обучении - максимально точно предсказать следующее наблюдение, используя предыдущие наблюдения.F

Теперь сеть LSTM является модификацией сети RNN. Насколько я понял, мотивация за LSTM состоит в том, чтобы решить проблему короткой памяти, которая свойственна RNN (обычные RNN имеют проблемы с связанными событиями, которые слишком далеко разделены во времени).

Я понимаю, как работают сети LSTM. Вот лучшее объяснение LSTM , что я нашел. Основная идея заключается в следующем:

В дополнение к вектору скрытого состояния мы вводим так называемый вектор «состояния ячейки», который имеет тот же размер (размерность), что и вектор скрытого состояния ( ). Я думаю, что вектор «состояния ячейки» вводится для моделирования долговременной памяти. Как и в случае обычного RNN, сеть LSTM получает наблюдаемое и скрытое состояние в качестве входных данных. Используя этот вход, мы вычисляем новое «состояние ячейки» следующим образом:ci

ci+1=ω1(oi,hi)ci+ω2(oi,hi)cint(oi,hi),

где функции , и моделируются нейронными сетями. Чтобы упростить выражение, я просто удалил аргументы:ω1ω2cint

ci+1=ω1ci+ω2cint

Итак, мы можем видеть, что новый «вектор состояния ячейки» ( ) является взвешенной суммой вектора старого состояния ( ) и «промежуточного» вектора состояния ячейки ( ). Умножение между векторами является компонентным (мы умножаем два N-мерных вектора и получаем, в результате, еще один N-мерный вектор). Другими словами, мы смешиваем два вектора состояний ячейки (старый и промежуточный), используя веса, специфичные для компонента.cici1cint

Вот интуиция между описанными операциями. Вектор состояния ячейки можно интерпретировать как вектор памяти. Второй вектор весов (рассчитанный нейронной сетью) является воротами "держать" (или забыть). Его значения определяют, будем ли мы сохранять или забыть (стереть) соответствующее значение из вектора состояния ячейки (или вектора долговременной памяти). Первый вектор весов ( ), который вычисляется другой нейронной сетью, называется «записывать» или «запоминать» логические элементы. Он решает, должна ли быть сохранена новая память («промежуточный» вектор состояния ячейки) (или, точнее, если ее конкретный компонент должен быть сохранен / записан). «Промежуточный»ω2ω1ω1вектор). На самом деле, было бы точнее сказать, что с двумя векторами весов ( и ) мы «смешиваем» старую и новую память.ω1ω2

Итак, после вышеописанного смешивания (или забывания и запоминания) у нас появляется новый вектор состояния ячейки. Затем мы вычисляем «промежуточное» скрытое состояние, используя другую нейронную сеть (как и раньше, мы используем наблюдаемое состояние и скрытое состояние качестве входных данных). Наконец, мы объединяем новое состояние ячейки (память) с «промежуточным» скрытым состоянием ( ), чтобы получить новое (или «конечное») скрытое состояние, которое мы фактически выводим:oihihint

hi+1=hintS(ci+1),

где - сигмовидная функция, применяемая к каждому компоненту вектора состояния ячейки.S

Итак, мой вопрос: почему (или как именно) эта архитектура решает проблему?

В частности, я не понимаю следующее:

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

Добавлено:

Вот видео, которое может помочь прояснить, как организованы разные ворота («держать», «писать» и «читать»).

Роман
источник
1
Похоже, вы понимаете LSTM лучше, чем я, поэтому я не буду публиковать фактический ответ, поскольку он может быть не тем, что вы ищете: ворота LSTM (в основном, забывающие) позволяют ему сохранять активации и градиенты так долго как необходимо. Таким образом, информация в момент времени t может оставаться доступной до момента времени t + n для произвольно больших n.
rcpinto
@rcpinto, я также думаю, что основная идея предлагаемой «архитектуры» заключается в том, чтобы обеспечить хранение информации в течение длительного времени (много временных шагов). Но я не понимаю, что именно делает это возможным. Сети двух шлюзов («держать» и «записать») могут узнать, что веса удержания должны быть большими, а веса записи - маленькими (тогда мы сохраняем память в течение длительного времени). Но разве это не может быть достигнуто только одной сетью? Разве нейронная сеть (которая принимает скрытое состояние (память) и наблюдаемое состояние в качестве входных данных) не может узнать, что скрытое состояние должно сохраняться без изменений?
Роман
В самом деле, просто установите для матрицы рекуррентного веса идентификатор, и он всегда будет сохранять последнюю активацию. Проблема - это всегда , что означает, что новые входы будут накапливаться и быстро насыщать активацию нейрона, что также является своего рода забвением. Таким образом, способность стереть предыдущую память или заблокировать формирование новой памяти имеет решающее значение.
rcpinto
@rcpinto, но не может ли быть достигнута «способность стереть предыдущую память или заблокировать формирование новой» в пределах одной нейронной сети? Нейронная сеть получает вектор памяти (или вектор скрытого состояния) и наблюдаемый вектор состояния в качестве входных данных. Разве такая сеть не может «решить» сохранить или заменить некоторые компоненты скрытого состояния (свою память) на основе значений компонентов в наблюдаемом векторе состояния?
Роман
LSTM могут сделать это, потому что ворота открываются или закрываются в соответствии с текущим входом и состоянием. Такого понятия нет в простых RNN. В этом случае само состояние всегда реагирует на ввод / состояние напрямую и немедленно, не позволяя ему «выбирать» сохранять или нет новую информацию. Кроме того, отсутствует механизм удаления некоторой сохраненной памяти, он всегда будет накапливаться в соответствии с входными весами для нейрона, и эти веса не могут измениться после тренировки. Поскольку ворота LSTM являются мультипликативными, они моделируют изменение веса во время вывода, реагируя на текущий вход / состояние.
rcpinto

Ответы:

1

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

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

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

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

Джанни
источник
0

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

Я не знаю недостатков использования одной нейронной сети. По моему мнению, мы можем использовать одну нейронную сеть с сигмоидальной нелинейностью, которая правильно изучает вектор, который будет использоваться надлежащим образом (добавленный в состояние ячейки в первом случае или переданный как скрытое состояние во втором случае).

Однако, как мы это делаем сейчас, мы разбиваем задачу на две части, одна из которых использует сигмоидальную нелинейность, чтобы узнать объем данных, которые нужно сохранить. Другая часть, которая использует tanh как нелинейность, просто выполняет задачу изучения информации, которая важна.

Говоря простым языком, сигмоид учит, сколько сэкономить, а тот, что экономит, разбивая его на две части, облегчит обучение.

ученик
источник