В данной статье кратко рассматривается архитектура нейронного стека.
Нейронный стек - это одна из моделей нейронных сетей с внешней памятью.

Подробнее о нейронных сетях с внешней памятью можно прочитать здесь.

Часть 1: Что такое нейронный стек?

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

Данная модель обучается с помощью метода обратного распространения ошибки (Backpropagation). А так как используется рекуррентная нейронная сеть в качестве контроллера,то метод будет называться Backpropagation through time.

Разработчики данной модели решили задачу научить нейронню сеть добавлять в стек и извлекать из стека числа.

В исходной статье авторы рассматривают не только нейронный стек, но и нейронную очередь и нейронный дек.

Пусть внешняя память (нейронный стек) дифференцируемую структуру, в которую и из которой добавляются и извлекаются вещественные числа. Эти дискретные операции (push и pop) мы умышленно делаем непрерывными, позволяя операциям push и pop иметь вещественный множитель, который принимает значения в интервале (0, 1).

Интуитивно мы можем интерпретировать эти значения как степень уверенности, с которой контроллер хочет поместить число v в стек или извлечь вершину стека.

Формулы, описывающие работу нейронного стека
Формулы, описывающие работу нейронного стека
Нейронный стек как рекуррентный слой
Нейронный стек как рекуррентный слой
Иллюстрация операций нейронного стека, рекуррентной структуры и управления
Иллюстрация операций нейронного стека, рекуррентной структуры и управления

Формально стек, полностью параметризованный размером вложения m, описывается на некотором временном шаге t матрицей V_t значений t \times mи вектором прочности (силы) s_t \in \mathbb{R}^t  .

Эта матрица образует ядро рекуррентного уровня, на который воздействует контроллер. Нейронный стек получает от контроллера значения v_t \in \mathbb{R}_m, сигнал pop u_t \in (0, 1) и сигнал push d_t \in (0, 1).

Контроллер выводит вектор считывания r_t ∈ \mathbb{R}^m.

Рекуррентность этого слоя обусловлена тем фактом, что он будет получать в качестве предыдущего состояния стека пару (V_{t−1}, s_{t−1}) и выдавать в качестве следующего состояния пару (V_t, s_t), следуя динамике, описанной далее.

Здесь Vt[i] представляет i-ю строку (m-мерный вектор) V_t, а st[i] представляет i-е значение s_t.

Уравнение 1

Уравнение 1 показывает обновление рекуррентного слоя, представленного в виде матрицы V. Количество строк растет с течением времени.

Сохраняются значения, помещаемые в стек на каждом временном шаге (независимо от того, логически они все еще находятся в стеке или нет). Значения добавляются в нижнюю часть матрицы (верхнюю часть стека) и никогда не изменяются.

Уравнение 2

Уравнение 2 показывает влияние сигналов push и pop на обновление вектора силы (интенсивности) s_{t−1} для получения s_t.

  1. Сначала операция pop удаляет объекты из стека.

Мы можем рассматривать значение pop u_t как начальную величину удаления для операции.

а) Мы перемещаем вектор силы s_{t−1} от самого первого индекса j до последнего.

b) Если следующий скаляр силы s_j меньше, чем оставшееся количество удалений u_t, он вычитается из оставшегося количества удалений u_t и его значение устанавливается равным 0.

c) Если оставшееся количество удалений u_tменьше следующего значения s_j, то оставшееся количество удалений вычитается из этого значения, и удаление прекращается.

  1. Затем значение push устанавливается в качестве значения, добавленного на текущем временном шаге.

Уравнение 3

Уравнение 3 показывает динамику операции считывания, которая аналогична операции pop.

Фиксированное начальное значение считывания, равное 1, устанавливается в верхней части временнОй копии вектора силы s_t.

Вектор s_t перемещается от самого большого индекса к наименьшему.

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

Если нет, то оно временно устанавливается равным оставшемуся считываемому значению, а значения скаляров прочности всем нижним индексам временно присваивается значение 0.

Результат r_t операции чтения представляет собой взвешенную сумму строк V_t, масштабированную по временным скалярным значениям, созданным во время обхода.

Пример вычисления считывания из стека за три временных шага, после нажатий и "хлопков", как описано выше, показан на рисунке .

На третьем шаге показано, как установка значения s3[2] в 0 для V3[2] логически удаляет v_2 из стека и как это игнорируется во время чтения.

На этом мы завершаем описание прямой динамики нейронного стека, представленного в виде рекуррентного слоя, как показано на рисунке b. Все операции, описанные в этом разделе, являются дифференцируемыми. Уравнения , описывающие обратную динамику, приведены ниже.

Архитектуры нейронной очереди и нейронного дека возможно будут рассмотрены позже.

Анализ обратной динамики нейронного стека

Здесь мы рассмотрим частные производные выходных данных по отношению ко входным данным.

Мы будем использовать символ Кронекера \sigma_{ij} (\sigma_{ij} = 1, если i = j, 0 в противном случае).

Приведенные ниже уравнения справедливы для любых допустимых номеров строк i и n.

Э
Э

Все частные производные, отличные от тех, которые получены с помощью цепного правила для производных, можно принять равными 0.

Начальная инициализация параметров модели

В оригинальной статье описано, что наилучшие результаты работы модели обеспечивает следующая инициализация: смещения (bias) для операции pop отрицательным числом.

Результаты работы модели

Рассмотрим задачу вывода строки в обратном порядке.

Пример:

В качестве примера входных и целевых данных предположим, что '$' — это начальный символ, '|' — разделитель, а '&' — символ завершения. Входные данные могут быть:

$A string to reverse|

и ожидаемый результат будет следующим:

esrever ot gnirts A&

Результат работы моделей
Результат работы моделей

Подробнее об этой модели можно узнать здесь и здесь.

Комментарии (0)