Отличный вопрос!
tl; dr: состояние ячейки и скрытое состояние - две разные вещи, но скрытое состояние зависит от состояния ячейки, и они действительно имеют одинаковый размер.
Более длинное объяснение
Разницу между ними можно увидеть на диаграмме ниже (часть того же блога):
Состояние ячейки - это жирная линия, идущая с запада на восток через вершину. Весь зеленый блок называется «клетка».
Скрытое состояние с предыдущего временного шага обрабатывается как часть ввода на текущем временном шаге.
Тем не менее, немного сложнее увидеть зависимость между ними без полного прохождения. Я сделаю это здесь, чтобы представить другую перспективу, но под сильным влиянием блога. Моя запись будет такой же, и я буду использовать изображения из блога в своем объяснении.
Мне нравится думать о порядке операций немного иначе, чем то, как они были представлены в блоге. Лично нравится начинать со входных ворот. Я изложу эту точку зрения ниже, но, пожалуйста, имейте в виду, что блог вполне может быть наилучшим способом настройки LSTM в вычислительном отношении, и это объяснение является чисто концептуальным.
Вот что происходит:
Входные ворота
Входной сигнал в момент времени равен и . Они объединяются и передаются в нелинейную функцию (в данном случае сигмовидную). Эта сигмовидная функция называется «входными воротами», потому что она действует в качестве временного промежутка для входа. Он решает стохастически, какие значения мы собираемся обновить на этом временном шаге, основываясь на текущем вводе.tч т - 1xtht−1
То есть (следуя вашему примеру), если у нас есть входной вектор и предыдущее скрытое состояние , то входной вентиль делает следующее:h t = [ 4 , 5 , 6 ]xt=[1,2,3]ht=[4,5,6]
а) Объединить и чтобы дать намh t - 1 [ 1 , 2 , 3 , 4 , 5 , 6 ]xtht−1[1,2,3,4,5,6]
b) Вычислить умноженное на конкатенированный вектор, и добавить смещение (в математике: , где - весовая матрица из входного вектора в нелинейность; - входной смещение).W i ⋅ [ x t , h t - 1 ] + b iWiWi⋅[xt,ht−1]+biWibi
Давайте предположим, что мы идем от шестимерного ввода (длина каскадного входного вектора) к трехмерному решению о том, какие состояния обновлять. Это означает, что нам нужна весовая матрица 3x6 и вектор смещения 3x1. Давайте дадим эти некоторые значения:
Wi=⎡⎣⎢123123123123123123⎤⎦⎥
bi=⎡⎣⎢111⎤⎦⎥
Расчет будет:
⎡⎣⎢123123123123123123⎤⎦⎥⋅⎡⎣⎢⎢⎢⎢⎢⎢⎢⎢123456⎤⎦⎥⎥⎥⎥⎥⎥⎥⎥+⎡⎣⎢111⎤⎦⎥=⎡⎣⎢224262⎤⎦⎥
c) эти предыдущие вычисления в нелинейность:it=σ(Wi⋅[xt,ht−1]+bi)
σ(x)=11+exp(−x) (мы применяем это поэлементно к значениям в векторе )x
σ(⎡⎣⎢224262⎤⎦⎥)=[11+exp(−22),11+exp(−42),11+exp(−62)]=[1,1,1]
На английском это означает, что мы собираемся обновить все наши штаты.
Входной вентиль имеет вторую часть:
d)Ct~=tanh(WC[xt,ht−1]+bC)
Смысл этой части состоит в том, чтобы вычислить, как бы мы обновляли состояние, если бы мы это делали. Это вклад нового входа в данный момент времени в состояние ячейки. Вычисление следует той же процедуре, которая проиллюстрирована выше, но с единицей танга вместо сигмовидной единицы.
Выходные данные умножаются на этот двоичный вектор , но мы рассмотрим это, когда перейдем к обновлению ячейки.Ct~it
Вместе сообщает нам, какие состояния мы хотим обновить, а сообщает нам, как мы хотим их обновить. Он говорит нам, какую новую информацию мы хотим добавить в наше представление.itCt~
Затем идут ворота забвения, которые были сутью вашего вопроса.
Ворота забыть
Цель ворот забвения - удалить ранее извлеченную информацию, которая больше не актуальна. Пример, приведенный в блоге, основан на языке, но мы также можем подумать о скользящем окне. Если вы моделируете временные ряды, которые естественным образом представлены целыми числами, такими как число инфекционных людей в области во время вспышки заболевания, то, возможно, после того, как заболевание вымерло в области, вам больше не нужно беспокоиться о том, чтобы рассмотреть эту область, когда думать о том, как болезнь будет путешествовать дальше.
Как и входной слой, слой забытия берет скрытое состояние с предыдущего временного шага и новый вход с текущего временного шага и объединяет их. Дело в том, чтобы стохастически решить, что забыть и что запомнить. В предыдущих вычислениях я показал выход сигмовидного слоя всех 1, но в действительности он был ближе к 0,999, и я округлил.
Вычисления очень похожи на то, что мы делали на входном слое:
ft=σ(Wf[xt,ht−1]+bf)
Это даст нам вектор размера 3 со значениями от 0 до 1. Давайте представим, что он дал нам:
[0.5,0.8,0.9]
Затем мы стохастически решаем, основываясь на этих ценностях, какую из этих трех частей информации забыть. Один из способов сделать это состоит в том, чтобы сгенерировать число из равномерного (0, 1) распределения и, если это число меньше, чем вероятность «включения» устройства (0,5, 0,8 и 0,9 для блоков 1, 2 и 3) соответственно), затем мы включаем эту единицу. В этом случае это будет означать, что мы забудем эту информацию.
Краткое примечание: входной слой и слой забывания независимы. Если бы я был игроком на пари, я бы поспорил, что это хорошее место для распараллеливания.
Обновление состояния ячейки
Теперь у нас есть все, что нужно для обновления состояния ячейки. Мы берем комбинацию информации из входных данных и ворот забвения:
Ct=ft∘Ct−1+it∘Ct~
Теперь это будет немного странно. Вместо умножения, как мы делали раньше, здесь обозначает продукт Адамара, который является начальным продуктом.∘
В сторону: продукт Адамара
Например, если бы у нас было два вектора и и мы хотели бы взять произведение Адамара, мы бы сделали это:x1=[1,2,3]x2=[3,2,1]
x1∘x2=[(1⋅3),(2⋅2),(3⋅1)]=[3,4,3]
Конец в сторону.
Таким образом, мы объединяем то, что мы хотим добавить в состояние ячейки (вход), с тем, что мы хотим убрать из состояния ячейки (забыть). Результатом является новое состояние ячейки.
Выходные ворота
Это даст нам новое скрытое состояние. По сути, задача выходного вентиля состоит в том, чтобы решить, какую информацию мы хотим, чтобы следующая часть модели учитывала при обновлении последующего состояния ячейки. Пример в блоге снова, язык: если существительное во множественном числе, спряжение глагола в следующем шаге изменится. В модели заболевания, если восприимчивость людей в определенной области отличается от другой области, вероятность заражения может измениться.
Выходной слой снова принимает тот же ввод, но затем учитывает обновленное состояние ячейки:
ot=σ(Wo[xt,ht−1]+bo)
Опять же, это дает нам вектор вероятностей. Затем мы вычисляем:
ht=ot∘tanh(Ct)
Таким образом, текущее состояние ячейки и выходной вентиль должны согласовать, что выводить.
То есть, если результат равен после того, как стохастическое решение было принято относительно того, ли каждая единица или нет, и результат равен , затем, когда мы возьмем продукт Адамара, мы получим , и только единицы, которые были включены как выходным вентилем, так и в состоянии ячейки, будут частью окончательного вывода.[ 0 , 1 , 1 ] o t [ 0 , 0 , 1 ] [ 0 , 0 , 1 ]tanh(Ct)[0,1,1]ot[0,0,1][0,0,1]
[РЕДАКТИРОВАТЬ: в блоге есть комментарий, в котором говорится, что снова преобразуется в фактический вывод с помощью , что означает, что фактический вывод на экран (если он у вас есть) является результатом другое нелинейное преобразование.]y t = σ ( W ⋅ h t )htyt=σ(W⋅ht)
Диаграмма показывает, что идет в два места: в следующую ячейку, а в «выход» - на экран. Я думаю, что вторая часть не является обязательной.ht
Существует множество вариантов LSTM, но это самое важное!