Забудьте слой в периодической нейронной сети (RNN) -

13

Я пытаюсь выяснить размеры каждой переменной в RNN в слое забудьте, однако я не уверен, что я на правильном пути. Следующая картинка и уравнение взяты из поста Колы в блоге «Понимание сетей LSTM» :

введите описание изображения здесь

где:

  • xt - ввод вектора размера m1
  • ht1 - скрытое состояние вектора размера n1
  • [xt,ht1] является конкатенацией (например, если , то )xt=[1,2,3],ht1=[4,5,6][xt,ht1]=[1,2,3,4,5,6]
  • wf - это весов размера , где - количество состояний ячейки (если и в приведенном выше примере, а если у нас есть 3 состояния ячейки, то матрицы)k m = 3 n = 3 w f = 3 3k(m+n)km=3n=3wf=33
  • bf - это смещение вектора размера , где - количество состояний ячейки (поскольку как в приведенном выше примере, тогда - вектор ).k k = 3 b f 3 1k1kk=3bf31

Если мы установим : [ 1 2 3 4 5 6 5 6 7 8 9 10 3 4 5 6 7 8 ]wf

[1234565678910345678]

И быть: [ 1 , 2 , 3 ]bf[1,2,3]

ТогдаWf.[ht1,xt]=

[1234565678910345678].[123456]=[91175133]

Тогда мы можем добавить смещение,Wf.[ht1,xt]+bf=

[91175133]+[123]=[92177136]

Затем мы передаем их в сигмовидную функцию: , где , поэтому мы выполняем этот элемент функции и получим .11+exx=[92177136]

[111]

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

Является ли приведенное выше предположение правильным?

Это также означает, что номер состояния ячейки и скрытого состояния одинаковы?

user1157751
источник

Ответы:

14

Отличный вопрос!

tl; dr: состояние ячейки и скрытое состояние - две разные вещи, но скрытое состояние зависит от состояния ячейки, и они действительно имеют одинаковый размер.

Более длинное объяснение

Разницу между ними можно увидеть на диаграмме ниже (часть того же блога):

Состояние ячейки - это жирная линия, идущая с запада на восток через вершину.

Состояние ячейки - это жирная линия, идущая с запада на восток через вершину. Весь зеленый блок называется «клетка».

Скрытое состояние с предыдущего временного шага обрабатывается как часть ввода на текущем временном шаге.

Тем не менее, немного сложнее увидеть зависимость между ними без полного прохождения. Я сделаю это здесь, чтобы представить другую перспективу, но под сильным влиянием блога. Моя запись будет такой же, и я буду использовать изображения из блога в своем объяснении.

Мне нравится думать о порядке операций немного иначе, чем то, как они были представлены в блоге. Лично нравится начинать со входных ворот. Я изложу эту точку зрения ниже, но, пожалуйста, имейте в виду, что блог вполне может быть наилучшим способом настройки LSTM в вычислительном отношении, и это объяснение является чисто концептуальным.

Вот что происходит:

Входные ворота

введите описание изображения здесь

Входной сигнал в момент времени равен и . Они объединяются и передаются в нелинейную функцию (в данном случае сигмовидную). Эта сигмовидная функция называется «входными воротами», потому что она действует в качестве временного промежутка для входа. Он решает стохастически, какие значения мы собираемся обновить на этом временном шаге, основываясь на текущем вводе.tч т - 1xtht1

То есть (следуя вашему примеру), если у нас есть входной вектор и предыдущее скрытое состояние , то входной вентиль делает следующее:h t = [ 4 , 5 , 6 ]xt=[1,2,3]ht=[4,5,6]

а) Объединить и чтобы дать намh t - 1 [ 1 , 2 , 3 , 4 , 5 , 6 ]xtht1[1,2,3,4,5,6]

b) Вычислить умноженное на конкатенированный вектор, и добавить смещение (в математике: , где - весовая матрица из входного вектора в нелинейность; - входной смещение).W i[ x t , h t - 1 ] + b iWiWi[xt,ht1]+biWibi

Давайте предположим, что мы идем от шестимерного ввода (длина каскадного входного вектора) к трехмерному решению о том, какие состояния обновлять. Это означает, что нам нужна весовая матрица 3x6 и вектор смещения 3x1. Давайте дадим эти некоторые значения:

Wi=[111111222222333333]

bi=[111]

Расчет будет:

[111111222222333333][123456]+[111]=[224262]

c) эти предыдущие вычисления в нелинейность:it=σ(Wi[xt,ht1]+bi)

σ(x)=11+exp(x) (мы применяем это поэлементно к значениям в векторе )x

σ([224262])=[11+exp(22),11+exp(42),11+exp(62)]=[1,1,1]

На английском это означает, что мы собираемся обновить все наши штаты.

Входной вентиль имеет вторую часть:

d)Ct~=tanh(WC[xt,ht1]+bC)

Смысл этой части состоит в том, чтобы вычислить, как бы мы обновляли состояние, если бы мы это делали. Это вклад нового входа в данный момент времени в состояние ячейки. Вычисление следует той же процедуре, которая проиллюстрирована выше, но с единицей танга вместо сигмовидной единицы.

Выходные данные умножаются на этот двоичный вектор , но мы рассмотрим это, когда перейдем к обновлению ячейки.Ct~it

Вместе сообщает нам, какие состояния мы хотим обновить, а сообщает нам, как мы хотим их обновить. Он говорит нам, какую новую информацию мы хотим добавить в наше представление.itCt~

Затем идут ворота забвения, которые были сутью вашего вопроса.

Ворота забыть

введите описание изображения здесь

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

Как и входной слой, слой забытия берет скрытое состояние с предыдущего временного шага и новый вход с текущего временного шага и объединяет их. Дело в том, чтобы стохастически решить, что забыть и что запомнить. В предыдущих вычислениях я показал выход сигмовидного слоя всех 1, но в действительности он был ближе к 0,999, и я округлил.

Вычисления очень похожи на то, что мы делали на входном слое:

ft=σ(Wf[xt,ht1]+bf)

Это даст нам вектор размера 3 со значениями от 0 до 1. Давайте представим, что он дал нам:

[0.5,0.8,0.9]

Затем мы стохастически решаем, основываясь на этих ценностях, какую из этих трех частей информации забыть. Один из способов сделать это состоит в том, чтобы сгенерировать число из равномерного (0, 1) распределения и, если это число меньше, чем вероятность «включения» устройства (0,5, 0,8 и 0,9 для блоков 1, 2 и 3) соответственно), затем мы включаем эту единицу. В этом случае это будет означать, что мы забудем эту информацию.

Краткое примечание: входной слой и слой забывания независимы. Если бы я был игроком на пари, я бы поспорил, что это хорошее место для распараллеливания.

Обновление состояния ячейки

введите описание изображения здесь

Теперь у нас есть все, что нужно для обновления состояния ячейки. Мы берем комбинацию информации из входных данных и ворот забвения:

Ct=ftCt1+itCt~

Теперь это будет немного странно. Вместо умножения, как мы делали раньше, здесь обозначает продукт Адамара, который является начальным продуктом.

В сторону: продукт Адамара

Например, если бы у нас было два вектора и и мы хотели бы взять произведение Адамара, мы бы сделали это:x1=[1,2,3]x2=[3,2,1]

x1x2=[(13),(22),(31)]=[3,4,3]

Конец в сторону.

Таким образом, мы объединяем то, что мы хотим добавить в состояние ячейки (вход), с тем, что мы хотим убрать из состояния ячейки (забыть). Результатом является новое состояние ячейки.

Выходные ворота

введите описание изображения здесь

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

Выходной слой снова принимает тот же ввод, но затем учитывает обновленное состояние ячейки:

ot=σ(Wo[xt,ht1]+bo)

Опять же, это дает нам вектор вероятностей. Затем мы вычисляем:

ht=ottanh(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=σ(Wht)

Диаграмма показывает, что идет в два места: в следующую ячейку, а в «выход» - на экран. Я думаю, что вторая часть не является обязательной.ht

Существует множество вариантов LSTM, но это самое важное!

StatsSorceress
источник
Спасибо за Ваш ответ! У меня есть еще один вопрос: ты не возражаешь? Глубокая нейронная сеть может быть глубокой, потому что производная ReLU равна 1 (если выход больше 0). То же самое относится и к этой камере? Я не уверен, как Тан и Сигмоид могут иметь постоянную производную от 1?
user1157751
С удовольствием! Нейронная сеть считается «глубокой», когда она имеет более одного скрытого слоя. Производные функций активации (tanh, sigmoid, ReLU) влияют на то, как обучается сеть. Как вы говорите, поскольку ReLU имеет постоянный наклон, если его вход больше 0, его производная равна 1, если мы находимся в этой области функции. Тан и сигмовидные единицы имеют производную, близкую к 1, если мы находимся в середине их области активации, но их производная не будет постоянной. Может быть, я должен сделать отдельный пост в блоге о производных ....
StatsSorceress
Можете ли вы показать пример их производной, близкой к 1 в области активации? Я видел много ресурсов, которые говорят о производной, но математика не делается?
user1157751
Хорошая идея, но мне потребуется некоторое время, чтобы написать правильный пост об этом. А пока подумайте о форме функции tanh - это удлиненная буква «S». В середине, где производная самая высокая. Там, где S плоский (хвосты S), производная равна 0. Я видел один источник, у которого сигмоиды имеют максимальную производную 0,25, но у меня нет эквивалентной границы для tanh.
StatsSorceress
Часть, которую я не понимаю, отличается от ReLU с постоянной производной 1, где x> 0, но сигмоид и tanh имели переменное значение для обеих своих производных. Как это может быть "постоянным"?
user1157751