В данной статье кратко рассматривается архитектура нейронного стека.
Нейронный стек - это одна из моделей нейронных сетей с внешней памятью.
Подробнее о нейронных сетях с внешней памятью можно прочитать здесь.
Часть 1: Что такое нейронный стек?
Основная идея заключается в том, чтобы научить рекуррентную нейронную сеть (в частности, LSTM) управлять стеком, состоящим из чисел.
Данная модель обучается с помощью метода обратного распространения ошибки (Backpropagation). А так как используется рекуррентная нейронная сеть в качестве контроллера,то метод будет называться Backpropagation through time.
Разработчики данной модели решили задачу научить нейронню сеть добавлять в стек и извлекать из стека числа.
В исходной статье авторы рассматривают не только нейронный стек, но и нейронную очередь и нейронный дек.
Пусть внешняя память (нейронный стек) дифференцируемую структуру, в которую и из которой добавляются и извлекаются вещественные числа. Эти дискретные операции (push и pop) мы умышленно делаем непрерывными, позволяя операциям push и pop иметь вещественный множитель, который принимает значения в интервале (0, 1).
Интуитивно мы можем интерпретировать эти значения как степень уверенности, с которой контроллер хочет поместить число в стек или извлечь вершину стека.
Формально стек, полностью параметризованный размером вложения , описывается на некотором временном шаге матрицей значенийи вектором прочности (силы)
Эта матрица образует ядро рекуррентного уровня, на который воздействует контроллер. Нейронный стек получает от контроллера значения , сигнал pop и сигнал push .
Контроллер выводит вектор считывания .
Рекуррентность этого слоя обусловлена тем фактом, что он будет получать в качестве предыдущего состояния стека пару и выдавать в качестве следующего состояния пару , следуя динамике, описанной далее.
Здесь Vt[i] представляет i-ю строку (m-мерный вектор) , а st[i] представляет -е значение .
Уравнение 1
Уравнение 1 показывает обновление рекуррентного слоя, представленного в виде матрицы . Количество строк растет с течением времени.
Сохраняются значения, помещаемые в стек на каждом временном шаге (независимо от того, логически они все еще находятся в стеке или нет). Значения добавляются в нижнюю часть матрицы (верхнюю часть стека) и никогда не изменяются.
Уравнение 2
Уравнение 2 показывает влияние сигналов push и pop на обновление вектора силы (интенсивности) для получения .
Сначала операция pop удаляет объекты из стека.
Мы можем рассматривать значение pop как начальную величину удаления для операции.
а) Мы перемещаем вектор силы от самого первого индекса до последнего.
b) Если следующий скаляр силы меньше, чем оставшееся количество удалений , он вычитается из оставшегося количества удалений и его значение устанавливается равным 0.
c) Если оставшееся количество удалений меньше следующего значения , то оставшееся количество удалений вычитается из этого значения, и удаление прекращается.
Затем значение push устанавливается в качестве значения, добавленного на текущем временном шаге.
Уравнение 3
Уравнение 3 показывает динамику операции считывания, которая аналогична операции pop.
Фиксированное начальное значение считывания, равное 1, устанавливается в верхней части временнОй копии вектора силы .
Вектор перемещается от самого большого индекса к наименьшему.
Если следующий показатель прочности меньше оставшегося считываемого значения, его значение сохраняется для этой операции и вычитается из оставшегося считываемого значения.
Если нет, то оно временно устанавливается равным оставшемуся считываемому значению, а значения скаляров прочности всем нижним индексам временно присваивается значение 0.
Результат операции чтения представляет собой взвешенную сумму строк , масштабированную по временным скалярным значениям, созданным во время обхода.
Пример вычисления считывания из стека за три временных шага, после нажатий и "хлопков", как описано выше, показан на рисунке 1а.
На третьем шаге показано, как установка значения в 0 для логически удаляет из стека и как это игнорируется во время чтения.
На этом мы завершаем описание прямой динамики нейронного стека, представленного в виде рекуррентного слоя, как показано на рисунке b. Все операции, описанные в этом разделе, являются дифференцируемыми. Уравнения , описывающие обратную динамику, приведены ниже.
Архитектуры нейронной очереди и нейронного дека возможно будут рассмотрены позже.
Анализ обратной динамики нейронного стека
Здесь мы рассмотрим частные производные выходных данных по отношению ко входным данным.
Мы будем использовать символ Кронекера (, если , в противном случае).
Приведенные ниже уравнения справедливы для любых допустимых номеров строк и .
Все частные производные, отличные от тех, которые получены с помощью цепного правила для производных, можно принять равными 0.
Начальная инициализация параметров модели
В оригинальной статье описано, что наилучшие результаты работы модели обеспечивает следующая инициализация: смещения (bias) для операции pop отрицательным числом.
Результаты работы модели
Рассмотрим задачу вывода строки в обратном порядке.
Пример:
В качестве примера входных и целевых данных предположим, что '$' — это начальный символ, '|' — разделитель, а '&' — символ завершения. Входные данные могут быть:
$A string to reverse|
и ожидаемый результат будет следующим:
esrever ot gnirts A&