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

Генерация последовательностей

Рекуррентную сеть можно использовать для генерации последовательности y^1y^2,...y^T\hat{y}_1\hat{y}_2,...\hat{y}_T, которая может представлять собой

  1. последовательность чисел (например, изменение температур);

  2. последовательность вещественных векторов (например, цены на акции завтра, послезавтра, и т.д);

  3. последовательность дискретных объектов (например, последовательность слов при генерации текста).

Простая генерация (текстов, временных рядов) не имеет прикладного значения. Однако большую применимость имеет условная генерация (conditional generation), например, когда

  • генерируется текст по заданной теме (ответ на вопрос);

  • генерируется временной ряд по условию (вероятная динамика будущих цен из текущей ситуации на рынке).

Поэтому безусловная генерация разрабатывается как предварительный этап перед условной генерацией в описанных далее архитектурах one-to-many и many-to-many.

Для этого в начале генерации сети подаётся некоторое фиксированное начальное состояние h0h_0 и фиксированный вектор начального входа y^0\hat{y}_0.

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

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

Генерация векторов чисел

При генерации векторов вещественных чисел для t=1,2,3...t=1,2,3... сеть пересчитывает внутреннее состояние и выход, принимая на вход собственный выход в предыдущий момент времени. Вводится дополнительная функция pt=s(ht)p_t=s(h_t), которая по внутреннему состоянию оценивает вероятность конца генерации ptp_t. Как только эта вероятность становится выше некоторого порогового значения, генерация останавливается.

Это формализуется в виде следующего алгоритма:

ЗАДАТЬ:

  • h0,y^0h_0,\hat{y}_0 (например, нулевыми векторами)
  • pmaxp_{max} (например, 0.9)

t:=0t:=0

ПОВТОРЯТЬ:

  • xt:=y^t1x_t:=\hat{y}_{t-1}

  • ht:=g(xt,ht1)h_{t}:=g(x_{t},h_{t-1})

  • y^t:=f(xt,ht)\hat{y}_{t}:=f(x_{t},h_{t}) 

  • pt:=s(ht)p_t:=s(h_t)

ПОКА pt<pmaxp_t<p_{max}   

ВЫХОД:

  • последовательность y^1y^2...y^t\hat{y}_1 \hat{y}_2 ... \hat{y}_t.

Графически указанный процесс генерации показан ниже:

Генерация дискретных объектов

Рассмотрим, как рекуррентная сеть генерирует дискретные объекты на примере генерации текста (как последовательности слов).

Для VV слов в словаре на каждом шаге tt рекуррентная сеть выдаёт VV рейтингов каждого слова:

r^=[r^1,r^2,...r^V]=f(xt,ht)\hat{r}=[\hat{r}_1,\hat{r}_2,...\hat{r}_V]=f(x_t,h_t)

Эти рейтинги преобразуются в вероятности слов, используя SoftMax преобразование.

SoftMaxτ(r^1,...r^V)=1ier^i/τ(er^1/τer^2/τer^V/τ),\text{SoftMax}_{\tau}\left(\widehat{r}_{1},...\widehat{r}_{V}\right)=\frac{1}{\sum_{i}e^{\widehat{r}_{i}/\tau}}\cdot\left(\begin{array}{c} e^{\widehat{r}_{1}/\tau}\\ e^{\widehat{r}_{2}/\tau}\\ \cdots\\ e^{\widehat{r}_{V}/\tau} \end{array}\right), τ>0гиперпараметр температуры\tau>0 - \text{гиперпараметр температуры}
  • Во время обучения генерируется самое вероятное слово,

  • Во время применения генерируется самое вероятное слово либо слово случайно сэмплируется из предсказанного распределения. Варьируя τ\tau можно управлять противоречием между согласованностью и разнообразием генерируемого текста.

На вход в следующий момент времени подаётся эмбеддинг сгенерированного слова e(y^t)e\left(\hat{y}_t\right), который можно

  • брать из другой задачи (например, Word2Vec или fastText)

  • либо настраивать вместе с параметрами рекуррентной сети

    (для больших выборок).

Графически процесс генерации будет выглядеть следующим образом:

Остановка генерации

Генерацию можно останавливать, когда предсказываемая вероятность остановки pt=s(ht)p_t=s(h_t) выше порога, либо когда сгенерируется специальный токен [EOS], означающий конец последовательности.

Обучение генеративной сети

Генеративная сеть обучается на фрагментах реальных последовательностей y1y2...yTy_1y_2...y_T, где целевыми значениями выступают значения той же последовательности, сдвинутые на единицу: y2y3...yT+1y_2y_3...y_{T+1}, чтобы сеть училась по истории последовательности предсказывать её следующий элемент.

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

Free run

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

Teacher forcing

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

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

Смесь двух стратегий

Оптимальным с точки зрения скорости обучения и эффективности применения является смешивание 2-х стратегий одним из способов ниже.

Способ 1:

  1. обучить в режиме teacher forcing

  2. дообучить в режиме free run

Способ 2:

  • обучать одновременно в 2х режимах, когда на каждом шаге tt с вероятностью pp подаётся реальный вход, а с вероятностью (1p)(1-p) - сгенерированный;

  • по ходу обучения можно постепенно уменьшать pp до нуля, что будет означать постепенный переход от teacher forcing к free run.


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

Литература

  1. http://karpathy.github.io/2015/05/21/rnn-effectiveness/