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

Режимы применения рекуррентных сетей

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

Synchronized Many-to-Many

Синхронизированная many-to-many архитектура (synchronized many-to-many) представляет собой классическое и простейшее применения рекуррентной сети, описанный ранее. В этой архитектуре для каждого входа xtx_t строится соответствующий выход y^t\hat{y}_t, по которому сразу можно посчитать функцию потерь L(y^t,yt)\mathcal{L}(\hat{y}_t,y_t). Потери от обработки всей последовательности считаются как среднее от потерь на каждом её элементе:

L(Y^,Y)=1Tt=1TL(y^t,yt)\mathcal{L}(\widehat{Y},Y)=\frac{1}{T}\sum_{t=1}^{T}\mathcal{L}(\hat{\mathbf{y}}_{t},\mathbf{y}_{t})

Примеры использования:

  • синхронная разметка частей речи,

  • синхронная обработка фреймов видеопотока,

когда нужно динамически по поступающим входам сразу генерировать их обработку.

Особенность этой архитектуры в том, что длина выходной последовательности в точности равна длине входной последовательности.

В приведённых выше обозначениях эта схема будет выглядеть как

Many-to-One

В архитектуре many-to-one на вход поступает последовательность, для которой нужно произвести однократный прогноз.

Примеры использования:

  • анализ тональности (sentiment analysis), когда по текстовому отзыву необходимо понять, положительный он, отрицательный или нейтральный;

  • классификация текста по темам, например, классификация новостей по рубрикам "экономика", "политика", "спорт" и т.д.;

  • распознавание заболеваний: например, по временным данным сердцебиения определить, болен пациент или здоров;

  • классификация видео по категориям, в этом случае видео представляется как последовательность фреймов, а категориями могут выступать "новости", "образовательный контент", "развлекательный контент" и т.д.

Прогноз рекуррентной сети может представлять собой

  • вещественный прогноз (для регрессии);

  • CC рейтингов классов (в задаче классификации), которые потом пропускаются через SoftMax преобразование;

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

Реализовать архитектуру many-to-one можно двумя способами.

Учёт последнего прогноза

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

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

Учёт всех прогнозов

Альтернативная реализация архитектуры many-to-one заключается в том, что мы считываем выходы сети для каждого шага обработки последовательности, а потом агрегируем прогнозы сети некоторой функцией агрегации:

y^=aggregate(y^1,y^2,...y^T)\hat{\mathbf{y}}=\text{aggregate}(\hat{\mathbf{y}}_1,\hat{\mathbf{y}}_2,...\hat{\mathbf{y}}_T)

В качестве функции агрегации можно использовать усреднение или взятие поэлементного максимума.

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

Графически обе реализации схемы many-to-one показаны ниже:

One-to-Many

В архитектуре one-to-many нужно по по эмбеддингу запроса (т.е. по вектору фиксированного размера, кодирующему запрос) сгенерировать выходную последовательность (ответ).

Примеры использования:

  • Написать музыку в заданном жанре (music generation). Жанр задаётся эмбеддингом, например кодировкой one-hot, а музыка представляет собой последовательность нот.

  • Описать текстом, что изображено на фотографии (image captioning). Фотография пропускается через свёрточный кодировщик, выдающий эмбеддинг фотографии, а на выходе ожидаем текстовое описание изображения как последовательность слов.

  • Сгенерировать видео по начальному фрейму (video generation from initial frame). Фрейм также задаётся эмбеддингом из свёрточного кодировщика. На выходе ожидаем последовательность последующих фреймов видео.

Реализовать эту архитектуру также можно двумя способами.

Запрос через начальное состояние

В простейшем случае эмбеддинг запроса подаётся как начальное внутреннее состояние h0h_0 рекуррентной сети, генерирующей выход. Первым входом генератору подаётся эмбеддинг токена [SOS] (start of sequence). В дальнейшем сеть генерирует ответ по генеративной схеме.

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

Запрос на каждом входе

Чтобы рекуррентная сеть, последовательно генерирующая выходную последовательность, не забывала исходный запрос (фото, которое нужно описать; жанр, в котором нужно сгенерировать музыку и т.д.), рекомендуется ей "напоминать" об этом запросе на каждом шаге генерации. Для этого сеть работает в генеративном режиме, но помимо предыдущего выхода сети (или эмбеддинга выходного объекта, если он дискретный, как слово языка) на вход подаётся каждый раз эмбеддинг входного запроса.

Оба подхода реализации архитектуры one-to-many показаны ниже:

Many-to-Many

В архитектуре many-to-many (называемой также seq2seq и encoder-decoder) требуется по входной последовательности сгенерировать выходную последовательность.

Примеры использования:

  • Машинный перевод (machine translation). Входом является предложение на исходном языке, а выходом - предложение на целевом.

  • Система автоматических ответов на вопросы (question answering). Входом является вопрос пользователя, а выходом - ответ системы.

  • Распознавание речи (speech recognition, speech2text). Входом является последовательность звуков речи, представленная в виде wav-файла или спектрограммы (последовательности сил звучания каждой звуковой частоты в каждый момент времени), а выходом - распознанная речь в виде текста.

  • Генерация речи (speech synthesis). Входом является текст для озвучивания (например, ответ голосового помощника), а выходом - озвучивание этого текста в виде спектрограммы или итогового wav-файла.

Реализуется эта архитектура двумя рекуррентными сетями, называемыми кодировщиком (encoder) и декодировщиком (decoder). Кодировщик решает задачу many-to-one, а декодировщик - задачу one-to-many.

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

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

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

Можно объединить оба подхода:

  • начальное состояние декодировщика инициализировать последним состоянием кодировщика (если размерности не совпадают, то можно преобразовать линейным слоем),

  • а последний выход кодировщика конкатенировать к каждому входу декодировщика.

Дополнительные параметры

Для улучшенной обработки входной последовательности помимо её эмбеддинга можно передавать декодировщику дополнительную информацию, например, длину входной последовательности.

Напомним, что существует два способа, как в схемах one-to-many и many-to-many понять, когда следует останавливать генерацию выходной последовательности - либо по специальному токену [EOS], либо по сравнению вероятности конца генерации с порогом.