y
�
,
y
) зависит от выхода
y
�
и метки
y
(см. раздел 6.2.1.1, где приведены примеры функций потерь). Для получения пол-
ной стоимости
J
потерю можно сложить с регуляризатором
Ω
(
θ
), где
θ
содержит
все параметры (веса и смещения). Алгоритм 6.4 показывает, как вычислить гради-
енты
J
относительно параметров
W
и
b
. Для простоты в этой демонстрации есть
только один входной пример
x
. На практике следует использовать мини-пакет.
Более реалистичная демонстрация приведена в разделе 6.5.7.
Require
: глубина сети
l
Require
:
W
(
i
)
,
i
∈
{1, …,
l
}, матрица весов модели
Require
:
b
(
i
)
,
i
∈
{1, …,
l
}, смещения модели
Require
:
x
, входа процесса
Require
:
y
, метки
h
(0)
=
x
for
k
= 1, …,
l
do
186
Глубокие сети прямого распространения
a
(
k
)
=
b
(
k
)
+
W
(
k
)
h
(
k
–1)
h
(
k
)
=
f
(
a
(
k
)
)
end for
y
�
=
h
(
l
)
J
=
L
(
y
�
,
y
) +
λ
Ω
(
θ
)
Алгоритм 6.4.
Вычисление обратного распространения для глубокой нейронной
сети из алгоритма 6.3, в котором помимо входа
x
используются метки
y
. В резуль-
тате вычисления получаются градиенты функций активации
a
(
k
)
для каждого слоя
k
, начиная с выходного и до первого скрытого слоя. Эти градиенты можно интер-
претировать как указания о том, как следует изменить выход каждого слоя, чтобы
уменьшить ошибку, и, зная их, мы можем вычислить градиенты параметров каж-
дого слоя. Градиенты весов и смещений можно тут же использовать для обновле-
ния стохастического градиента (обновление выполняется сразу после вычисления
градиентов) или в составе других градиентных методов оптимизации.
После вычисления прямого распространения вычислить градиент выходного
слоя:
g
⟵
∇
y
�
J
=
∇
y
�
L
(
y
�
,
y
)
for
k
=
l
,
l
– 1, …, 1
do
Преобразовать градиент выходного слоя в градиент функций активации до
применения нелинейности (поэлементное умножение, если
f
поэлементная):
g
⟵
∇
a
(
k
)
J
=
g
⊙
f
′
(
a
(
k
)
)
Вычислить градиенты весов и смещений (включая член регуляризации там,
где необходимо):
∇
b
(
k
)
J
=
g
+
λ
∇
b
(
k
)
Ω
(
θ
)
∇
W
(
k
)
J
=
g
h
(
k
–1)
⏉
+
λ
∇
W
(
k
)
Ω
(
θ
)
Распространить градиенты на функции активации предыдущего скрытого
уровня:
g
⟵
∇
h
(
k
–1)
J
=
W
(
k
)
⏉
g
end for
6.5.5. Символьно-символьные производные
Алгебраические выражения и графы вычислений оперируют символами, т. е. пере-
менными, не имеющими конкретного значения. Соответствующие представления
называются
символьными представлениями
. В ходе использования или обучения
нейронной сети мы должны приписать символам конкретные значения. Символьный
вход сети
x
заменяется
числовым
значением, например [1.2, 3.765, –1.8]
⏉
.
В некоторых подходах к обратному распространению берутся граф вычислений
и множество числовых значений, подаваемых на вход графа, а возвращается множе-
ство числовых значений, равных градиентам во входных точках. Такой подход мы на-
зываем
символьно-числовым дифференцированием
. Он реализован в библиотеках
Torch (Collobert et al., 2011b) и Caffe (Jia, 2013).
Другой подход – взять граф вычислений и добавить в него дополнительные вер-
шины, содержащие символьное описание требуемых производных. Он использу-
ется в библиотеках Theano (Bergstra et al., 2010; Bastien et al., 2012) и TensorFlow
Обратное распространение и другие алгоритмы дифференцирования
187
(Abadi et al., 2015). Пример его работы показан на рис. 6.10. Основное преимуще-
ство такого подхода в том, что производные описываются на том же языке, что
и исходное выражение. Поскольку производные – просто еще один граф вычис-
лений, становится возможным прогнать алгоритм обратного распространения еще
раз, т. е. продифференцировать производные для получения производных высше-
го порядка (вычисление производных высшего порядка рассматривается в разде-
ле 6.5.10).
z
z
y
y
dz
dy
dy
dx
dz
dx
dx
dw
dz
dw
f
f
f
′
f
′
×
×
f
′
f
f
f
f
x
x
w
w
Рис. 6.10
Пример символьно-символьного подхода к вычислению
производных. В этом случае алгоритму обратного распрост ранения во-
обще не нужен доступ к фактическим числовым значениям. Вместо этого
в граф вычислений добавляются вершины, описы ваю щие, как вычислять
производные. Впоследствии универсальный движок обсчета графа может
вычислить производные для любых конкретных значений. (
Слева
) В этом
примере мы начали с графа, представляющего вычисление
z
=
f
(
f
(
f
(
w
)))
.
(
Справа
) Мы выполнили алгоритм обратного распространения, потребовав
построить граф для выражения, соответствующего
dz
/
dw
. Здесь мы не объ-
ясняем, как работает алгоритм обратного распространения. Единственная
цель – показать желаемый результат: это граф вычислений, содержащий
символьное описание производной
Мы будем пользоваться вторым подходом и опишем алгоритм обратного
распрост ранения в терминах построения графа вычислений производных. Впо-
следствии любое подмножество графа можно вычислить, подставив конкретные
числовые значения. Это позволяет не указывать точно, в какой момент должна
быть вычислена каждая операция, поскольку универсальный движок обсчета гра-
фа умеет вычислять каждую вершину, как только становятся доступными значения
ее родителей.
Описанный символьно-символьный подход включает в себя символьно-числовой.
Последний можно рассматривать как выполнение в точности тех же вычислений, ка-
Do'stlaringiz bilan baham: |