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

4.7 Прямое распространение, обратное распространение и вычислительные графы

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

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

4.7.1 Прямое распространение

Прямое распространение (forward propagation, или forward pass) — это последовательное, от входного слоя к выходному, вычисление и сохранение результатов каждого слоя нейронной сети.

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

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

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

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

По определению -регуляризации при заданном гиперпараметре регуляризационный член равен

где норма Фробениуса матрицы — это -норма, применённая к матрице, развёрнутой в вектор. Наконец, регуляризованные потери модели на данном примере данных равны:

В дальнейшем обсуждении будем называть целевой функцией (objective function).

4.7.2 Вычислительный граф прямого распространения

Построение вычислительного графа помогает наглядно представить зависимости между операторами и переменными в вычислении. На рис. 4.7.1 показан вычислительный граф для описанной простой сети. Квадраты обозначают переменные, а круги — операторы. Входы находятся в левом нижнем углу, а выходы — в правом верхнем. Обратите внимание, что стрелки, показывающие поток данных, направлены в основном вправо и вверх.

Рис. 4.7.1. Вычислительный граф прямого распространения

4.7.3 Обратное распространение ошибки

Обратное распространение ошибки (backward propagation, или backpropagation) — это метод вычисления градиентов параметров нейронной сети. Коротко говоря, метод по правилу цепочки из математического анализа обходит сеть в обратном порядке: от выходного слоя к входному. Алгоритм сохраняет все промежуточные переменные (частные производные), которые нужны для вычисления градиентов некоторых параметров. Пусть даны функции и , где входы и выходы — тензоры произвольной формы. По правилу цепочки можно вычислить производную по :

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

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

Далее по правилу цепочки вычисляем градиент целевой функции по выходной переменной :

Затем вычисляем градиенты регуляризационного члена по двум параметрам:

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

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

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

Наконец, получаем градиент параметров, ближайших к входному слою, . По правилу цепочки:

4.7.4 Обучение нейронных сетей

При обучении нейронной сети прямое и обратное распространение зависят друг от друга. При прямом распространении мы проходим вычислительный граф в направлении зависимостей и вычисляем все переменные на пути. Затем эти значения используются при обратном распространении, где порядок вычислений противоположен.

Рассмотрим нашу простую сеть. С одной стороны, при прямом распространении регуляризационный член (формула (4.7.1)) зависит от текущих значений параметров модели и . Эти значения задаёт алгоритм оптимизации по результатам обратного распространения на последней итерации. С другой стороны, при обратном распространении вычисление градиентов параметров (формула (4.7.2)) зависит от текущего значения скрытой переменной , которое задаёт прямое распространение.

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

Резюме

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

Упражнения

  1. Пусть для скалярной функции аргумент — матрица размера . Какова размерность градиента по ?
  2. Добавьте смещение в скрытый слой модели, описанной в этом разделе (в регуляризационный член смещение включать не нужно).
    1. Нарисуйте соответствующий вычислительный граф.
    2. Выведите уравнения прямого и обратного распространения.
  3. Вычислите объём памяти, необходимый для обучения и предсказания модели, описанной в этом разделе.
  4. Предположим, что нужно вычислить вторую производную. Что произойдёт с вычислительным графом? Сколько времени, по вашей оценке, займут вычисления?
  5. Предположим, что вычислительный граф слишком велик для имеющегося у вас GPU.
    1. Попробуйте разделить его между несколькими GPU.
    2. Каковы преимущества и недостатки по сравнению с обучением на минибатчах?

Обсуждение