Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

8.7 Обратное распространение через время (BPTT)

До сих пор мы многократно упоминали такие понятия, как взрыв градиентов и затухание градиентов, а также необходимость отсоединять градиенты в рекуррентных сетях. Например, в разделе 8.5 мы вызывали функцию detach для последовательности. Чтобы быстро построить модель и понять, как она работает, мы не давали этим понятиям достаточного объяснения. В этом разделе подробнее рассмотрим детали обратного распространения для моделей последовательностей и связанную с ним математику.

Когда мы впервые реализовывали рекуррентную нейронную сеть (раздел 8.5), мы столкнулись с проблемой взрыва градиентов. Если вы решали упражнения, то заметили, что отсечение градиентов крайне важно для сходимости модели. Чтобы лучше понять эту проблему, в этом разделе мы вспомним, как вычисляются градиенты для моделей последовательностей. Здесь нет ничего принципиально нового: мы по-прежнему используем цепное правило (правило дифференцирования сложной функции).

В разделе 4.7 мы описали прямое и обратное распространение для многослойного перцептрона и соответствующие вычислительные графы. В рекуррентной сети прямое распространение устроено относительно просто. Обратное распространение через время (backpropagation through time, BPTT) (Werbos, 1990) — это частный случай обратного распространения для рекуррентных нейронных сетей. Оно требует разворачивать вычислительный граф рекуррентной сети по одному временному шагу, чтобы получить зависимости между переменными модели и параметрами. Затем, используя цепное правило, применяем обратное распространение для вычисления и сохранения градиентов. Поскольку последовательность может быть довольно длинной, длинными могут быть и зависимости. Например, в последовательности из 1000 символов первый токен может сильно влиять на токен в конце. Такой расчёт невыполним на практике: он требует слишком много времени и памяти, а градиент получается через произведение более чем тысячи матриц и оказывается крайне неустойчивым. Процесс сопровождается и вычислительными, и статистическими неопределённостями. Ниже мы выясним, что происходит, и разберём, как решать эти проблемы на практике.

8.7.1 Анализ градиентов в рекуррентных нейронных сетях

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

В упрощённой модели скрытое состояние на временном шаге обозначим , вход — , выход — . Вспомним обсуждение в разделе 8.4.2: вход и скрытое состояние можно объединить и умножить на один весовой параметр скрытого слоя. Поэтому веса скрытого и выходного слоёв обозначим и соответственно. Скрытое состояние и выход на каждом временном шаге записываются так:

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

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

В (8.7.2) первый и второй множители вычисляются легко, а вот третий, , создаёт трудности: нужно рекуррентно учесть влияние параметра на . Согласно рекуррентной формуле (8.7.1), зависит и от , и от , причём само тоже зависит от . Поэтому по цепному правилу получаем:

Чтобы вывести эти градиенты, рассмотрим три последовательности , для которых при выполнено и . Для легко получить:

Подставим вместо , и следующие выражения:

Тогда градиент в (8.7.3) удовлетворяет соотношению . Поэтому для каждого из (8.7.4) мы можем избавиться от рекуррентного вычисления в (8.7.3) и записать:

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

8.7.1.1 Полное вычисление

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

8.7.1.2 Усечение по времени

В качестве альтернативы можно усечь сумму в (8.7.5) после шагов. Именно это мы и делали до сих пор, например при отсоединении градиентов в разделе 8.5. Это даёт приближение истинного градиента: сумма обрывается на . На практике такой подход работает очень хорошо. Его обычно называют усечённым обратным распространением через время (Jaeger, 2002). Благодаря ему модель в основном учитывает краткосрочные влияния, а не долгосрочные. Это полезно, поскольку смещает оценку в сторону более простых и устойчивых моделей.

8.7.1.3 Случайное усечение

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

Из определения следует, что . Каждый раз, когда , рекурсивное вычисление обрывается на временном шаге . В результате получается взвешенная сумма последовательностей разной длины, где длинные последовательности встречаются редко, поэтому им придаётся больший вес. Эту идею предложили Таллек и Оливье (Tallec and Ollivier, 2017).

8.7.1.4 Сравнение стратегий

Рис. 8.7.1. Сравнение стратегий вычисления градиентов в RNN: сверху вниз — случайное усечение, обычное усечение, полное вычисление

Рис. 8.7.1 иллюстрирует три стратегии обратного распространения через время при анализе первых символов книги «Машина времени» с помощью рекуррентной нейронной сети:

  • первая строка — случайное усечение: текст разбивается на фрагменты разной длины;
  • вторая строка — обычное усечение: текст разбивается на подпоследовательности одинаковой длины. Именно это мы делали в экспериментах с рекуррентными сетями;
  • третья строка — полное обратное распространение через время: оно приводит к вычислительно неосуществимому выражению.

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

8.7.2 Детали обратного распространения через время

После общих принципов рассмотрим подробнее обратное распространение через время. В отличие от анализа из раздела 8.7.1, здесь мы покажем, как вычислить градиенты целевой функции по всем разложенным параметрам модели. Чтобы упростить изложение, рассмотрим рекуррентную нейронную сеть без параметров смещения, у которой в скрытом слое используется тождественное отображение в качестве функции активации (). Для временного шага пусть вход отдельного примера и соответствующая метка будут и . Скрытое состояние и выход вычисляются так:

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

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

Рис. 8.7.2. Граф вычислений, показывающий зависимости в рекуррентной нейронной сети с тремя временными шагами. Незакрашенные прямоугольники — переменные, закрашенные — параметры, кружки — операторы

Как уже было сказано, параметрами модели на рис. 8.7.2 являются , и . Обычно обучение требует вычисления градиентов по этим параметрам: , и . По зависимостям на рис. 8.7.2 можно обходить вычислительный граф против направления стрелок и последовательно вычислять и сохранять градиенты. Чтобы гибко представлять умножение матриц, векторов и скаляров различных форм в цепном правиле, мы используем оператор , описанный в разделе 4.7.

Сначала отметим, что в любой момент времени дифференцирование целевой функции по выходу модели вычисляется довольно просто:

Теперь можно вычислить градиент целевой функции по параметру выходного слоя : . По рис. 8.7.2 целевая функция зависит от через . По цепному правилу получаем:

где задаётся формулой (8.7.6).

Далее, как видно на рис. 8.7.2, на последнем временном шаге целевая функция зависит от скрытого состояния только через . Поэтому по цепному правилу градиент вычисляется легко:

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

Для анализа раскроем рекурсию (8.7.8) для любого временного шага :

Из (8.7.9) видно, что даже в этом простом линейном примере проявляются ключевые проблемы моделей длинных последовательностей: в выражении возникает потенциально очень большая степень . В этой степени собственные значения, меньшие 1, исчезают, а большие 1 — расходятся. Это численно неустойчиво и проявляется в виде затухания или взрыва градиентов. Одно из решений — ограничить длину временных шагов по соображениям вычислительного удобства, как описано в разделе 8.7.1. На практике такое усечение реализуется отсоединением градиентов после заданного числа временных шагов. Позже мы узнаем, как более сложные модели последовательностей (например, LSTM) помогают смягчить эту проблему.

Наконец, из рис. 8.7.2 видно, что целевая функция зависит от параметров скрытого слоя и через скрытые состояния . Чтобы вычислить градиенты и , применим цепное правило:

где вычисляется рекурсивно по формулам (8.7.7) и (8.7.8) и является ключевой величиной, определяющей численную устойчивость.

Как мы объясняли в разделе 4.7, обратное распространение через время — это способ применения обратного распространения к рекуррентным нейронным сетям, поэтому обучение такой сети чередует прямое распространение и обратное распространение через время. Обратное распространение через время последовательно вычисляет и сохраняет указанные градиенты. В частности, сохранённые промежуточные значения повторно используются, чтобы не вычислять их заново; например, сохраняется , которое затем используется при вычислении и .

Резюме

  • «Обратное распространение через время» применяется только к обратному распространению в моделях последовательностей со скрытыми состояниями.
  • Усечение нужно для вычислительного удобства и численной устойчивости. Существует два вида усечения: обычное и случайное.
  • Высокие степени матриц могут приводить к расхождению или затуханию собственных значений, что проявляется как взрыв или затухание градиентов.
  • Для эффективности вычислений обратное распространение через время кэширует промежуточные значения во время вычислений.

Упражнения

  1. Пусть у нас есть симметричная матрица с собственными значениями и соответствующими собственными векторами (). Обычно считается, что собственные значения упорядочены так, что .
    1. Докажите, что имеет собственные значения .
    2. Докажите, что для случайного вектора вектор с высокой вероятностью будет лежать на одной прямой с собственным вектором матрицы . Формализуйте это доказательство.
    3. Что означают полученные результаты для градиентов в рекуррентных нейронных сетях?
  2. Существуют ли, кроме отсечения градиентов, другие способы борьбы со взрывом градиентов в рекуррентных нейронных сетях?

Обсуждение

Литература

  • Werbos, P. J. (1990). Backpropagation through time: What it does and how to do it. Proceedings of the IEEE, 78(10), 1550–1560.
  • Jaeger, H. (2002). Tutorial on training recurrent neural networks, covering BPPT, RTRL, EKF and the “echo state network” approach (Vol. 5). GMD-Forschungszentrum Informationstechnik Bonn.
  • Tallec, C., & Ollivier, Y. (2017). Unbiasing truncated backpropagation through time. arXiv preprint arXiv:1705.08209.