182
Глубокие сети прямого распространения
6.5.3. Рекурсивное применение правила дифференцирования
сложной функции для получения алгоритма обратного
распространения
С помощью правила дифференцирования сложной функции легко записать алгебра-
ическое выражение для градиента скаляра относительно любой вершины графа вы-
числений, приведшей к этому скаляру. Но при вычислении этого выражения компью-
тером возникают дополнительные вопросы.
Точнее, в выражении градиента могут многократно встречаться некоторые подвы-
ражения. Процедура вычисления градиента должна решить, следует ли эти подвы-
ражения хранить или каждый раз вычислять заново. На рис. 6.9 показано,
как та-
кие подвыражения могут возникать. В некоторых случаях вычисление одного и того
же подвыражения дважды – расточительство. В сложных графах количество таких
бессмысленных вычислений может расти экспоненциально, в результате чего наи-
вная реализация правила дифференцирования сложной функции становится невоз-
можной. А иногда повторное вычисление одного подвыражения является способом
уменьшить потребление памяти за счет увеличения времени работы.
Начнем с варианта алгоритма
обратного распространения, в котором порядок
вычисления градиента задается непосредственно (алгоритм 6.2 в сочетании с ал-
горитмом 6.1 ассоциированного прямого вычисления) – путем рекурсивного при-
менения правила дифференцирования сложной функции. Эти вычисления можно
выполнить напрямую или считать описание алгоритма символической специфика-
цией графа вычислений обратного распространения. Однако в этой формулировке
отсутствует явное построение символического графа манипуляций, необходимых
для вычисления градиента. Такая формулировка приведена в разделе 6.5.6 – это
алгоритм 6.5, заодно
обобщенный на случай вершин, содержащих произвольные
тензоры.
Сначала рассмотрим граф вычислений,
описывающий, как вычислить один ска-
ляр
u
(
n
)
(скажем, потерю на обучающем примере). Это та величина, для которой мы
хотим получить градиент относительно
n
i
входных вершин от
u
(1)
до
u
(
n
i
)
. Иными сло-
вами, мы хотим вычислить
∂
u
(
n
)
/
∂
u
(
i
)
для всех
i
∈
{1, 2, …,
n
i
}. Если алгоритм обратного
распространения применяется к вычислению градиентов для градиентного спуска
по параметрам, то
u
(
n
)
– стоимость, ассоциированная с примером или мини-пакетом,
а
u
(1)
, …,
u
(
n
i
)
соответствуют параметрам модели.
Будем предполагать, что вершины графа упорядочены таким образом, что можно
вычислять их выходы один за другим, начиная с
u
(
n
i
+
1)
и до
u
(
n
)
. В алгоритме 6.1 пред-
полагается, что с вершиной
u
(
i
)
ассоциирована операция
f
(
i
)
, а вычисления в ней про-
изводятся по
формуле
u
(
i
)
=
f
(
𝔸
(
i
)
),
(6.48)
где
𝔸
(
i
)
– множество всех вершин, являющихся родителями
u
(
i
)
.
Этот алгоритм определяет вычисления
при прямом распространении, которые
можно было бы поместить в граф
𝒢
. Для выполнения обратного распространения мы
можем построить граф вычислений, который зависит от
𝒢
и добавляет дополнитель-
ные вершины. Эти вершины образуют подграф
ℬ
, содержащий по одной вершине на
каждую вершину
𝒢
. Вычисления в
ℬ
производятся в порядке, обратном вычислениям
Обратное распространение и другие алгоритмы дифференцирования
183
в
𝒢
, а каждая вершина
ℬ
вычисляет производную
∂
u
(
n
)
/
∂
u
(
i
)
, ассоциированную с вер-
шиной
u
(
i
)
графа прямого распространения. Делается это с помощью правила диффе-
ренцирования сложной функции применительно к скалярному выходу
u
(
n
)
:
(6.49)
как описано в алгоритме 6.2. Подграф
ℬ
содержит ровно
одно ребро для каждого
ребра из вершины
u
(
j
)
в вершину
u
(
i
)
графа
𝒢
. Ребро из
u
(
j
)
в
u
(
i
)
ассоциировано с вычис-
лением
∂
u
(
i
)
/
∂
u
(
j
)
. Кроме того, для каждой вершины вычисляется скалярное произве-
дение между уже вычисленным градиентом относительно вершин
u
(
i
)
, являющихся
непосредственными потомками
u
(
j
)
, и вектором, содержащим частные производные
∂
u
(
i
)
/
∂
u
(
j
)
для тех же дочерних вершин
u
(
i
)
. Таким образом, объем вычислений в ал-
горитме обратного распространения линейно зависит от числа ребер графа
𝒢
, а об-
работка каждого ребра состоит в вычислении частной производной (одной вершины
по одной из ее родительских вершин), одного умножения и одного сложения. Ниже
мы обобщим этот анализ на тензорнозначные вершины, цель которых – сгруппиро-
вать несколько скалярных значений в одной вершине и повысить эффективность
реализации.
Do'stlaringiz bilan baham: