Перейти к основному содержимому

Усложнения рекуррентных сетей

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

Многослойные сети

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

Эта схема позволяет извлекать более сложные зависимости, основанные на нескольких нелинейных преобразованиях и называется многослойной рекуррентной сетью (multilayer RNN, stacked RNN) [1].

Комбинация низкоуровневых и высокоуровневых признаков

В многослойной рекуррентной сети можно добавлять тождественные преобразования (identity connections) с более низких слоёв рекуррентной сети сразу на более высокие, минуя промежуточную обработку. Тогда входы вышестоящей рекуррентной сети будут состоять одновременно из выходов нескольких нижестоящих рекуррентных блоков.

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

Схема архитектуры:

С этим подходом мы уже сталкивались в модели DenseNet при обработке изображений.

Сlockwork RNN

Подход clockwork RNN [2] позволяет обрабатывать последовательности на разных временных масштабах. Основная идея состоит в том, что рекуррентные блоки многослойной рекуррентной сети (stacked RNN) обновляются с различной частотой, что позволяет лучше суммаризовать информацию о длинных входных последовательностях.

Ниже приведён пример такой архитектуры:

Эта схема позволяет лучше помнить историю и качественнее агрегировать информацию о длинных входных последовательностях.

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

Двунаправленная сеть

Часто необходимо что-то предсказать для каждого элемента последовательности, когда вся последовательность нам уже известна целиком. Например, при разборе слов предложения на части речи мы знаем всё предложение от начала и до конца. Это позволяет строить более точные прогнозы, учитывающий как левый, так и правый контекст каждого элемента последовательности.

Для этого используется архитектура двунаправленной рекуррентной сети (bidirectional RNN, [3]), состоящей из 2-х независимых рекуррентных сетей:

  • первая сеть обрабатывает элементы последовательности слева-направо,

  • а вторая - справа-налево.

Первая сеть кодирует входы состояниями h1,h2,...hT\overrightarrow{h}_{1},\overrightarrow{h}_{2},...\overrightarrow{h}_{T}, вторая - состояниями h1,h2,...hT\overleftarrow{h}_{1},\overleftarrow{h}_{2},...\overleftarrow{h}_{T},

Далее для каждого момента времени tt состояния обеих рекуррентных сетей конкатенируются в один вектор, кодирующий как левый, так и правый контекст

tht=[ht;ht]R2Dt\to h_t=[\overrightarrow{h}_{t};\overleftarrow{h}_{t}]\in \mathbb{R}^{2D}

Это агрегированное состояние подаётся как вход в вышестоящую сеть f3()f_3(\cdot), для их последующей обработки:

У этого подхода возможны вариации:

  • Сама сеть f3()f_3(\cdot) при этом тоже может быть рекуррентной.

  • Вместо скрытых состояний рекуррентных сетей можно использовать их прогнозы.

  • Перед подачей на вход конкатенацию состояний можно преобразовать линейным слоем, чтобы снизить её размерность:

xt=W[ht;ht]+bRDx'_t=W[\overrightarrow{h}_{t};\overleftarrow{h}_{t}]+b \in \mathbb{R}^D

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

Динамическая сеть

В традиционной рекуррентной сети веса для пересчёта состояний на всех итерациях обработки одинаковы. В работе [4] предлагается сделать их динамическими, предсказывая эти веса дополнительной сетью, называемой гиперсетью (hypernetwork). Эта сеть реализует мягкую, а не жесткую общность весов (soft weight sharing) через общность параметров гиперсети. Такая схема позволяет более гибко обрабатывать последовательности разных типов, приспосабливая под них параметры основной рекуррентной сети, выдающей итоговые результаты.

Эта схема показана на рисунке [4]:

Литература

  1. Hihi S., Bengio Y. Hierarchical recurrent neural networks for long-term dependencies //Advances in neural information processing systems. – 1995. – Т. 8.

  2. Koutnik J. et al. A clockwork rnn //International conference on machine learning. – PMLR, 2014. – С. 1863-1871.

  3. Schuster M., Paliwal K. K. Bidirectional recurrent neural networks //IEEE transactions on Signal Processing. – 1997. – Т. 45. – №. 11. – С. 2673-2681.

  4. Ha D., Dai A., Le Q. V. Hypernetworks //arXiv preprint arXiv:1609.09106. – 2016.