Alterna · учебный материал
03.6 Изменение проходит через цепочку
Если одно действие зависит от результата другого, влияние передаётся по цепи. Вдоль цепи чувствительности умножаются, а между разными путями складываются.
Что в этом материале
- Локальные производные соединяются по структуре вычисления
- Reverse-mode переносит одну upstream-чувствительность назад
- Вдоль пути множители, между путями сумма
- Численная проверка проверяет точку, а не вывод
Содержание и основные понятия
На предыдущей странице: как меняется сам наклон.
Если одно действие зависит от результата другого, влияние передаётся по цепи. Вдоль цепи чувствительности умножаются, а между разными путями складываются.
Сначала u=2x+1, затем L=u²; x=2.
Для изменения рисунка включитеJavaScript; расчёт и теория доступны далее.
Локальные производные соединяются по структуре вычисления
Пусть
u
=
g
(
x
)
,
z
=
h
(
u
)
.
u=g(x),\qquad z=h(u).
u
=
g
(
x
)
,
z
=
h
(
u
)
.
Малое изменение сначала проходит через
g
g
g
, затем через
h
h
h
:
d
u
≈
g
′
(
x
)
d
x
,
d
z
≈
h
′
(
u
)
d
u
.
du\approx g'(x)dx,
\qquad dz\approx h'(u)du.
d
u
≈
g
′
(
x
)
d
x
,
d
z
≈
h
′
(
u
)
d
u
.
Подстановка даёт chain rule:
d
z
d
x
=
d
z
d
u
d
u
d
x
.
\frac{dz}{dx}=\frac{dz}{du}\frac{du}{dx}.
d
x
d
z
=
d
u
d
z
d
x
d
u
.
Для
u
=
2
x
+
1
u=2x+1
u
=
2
x
+
1
,
z
=
u
2
z=u^2
z
=
u
2
при
x
=
2
x=2
x
=
2
:
u
=
5
,
z
=
25
,
d
u
d
x
=
2
,
d
z
d
u
=
2
u
=
10
,
u=5,\qquad z=25,
\qquad \frac{du}{dx}=2,
\qquad \frac{dz}{du}=2u=10,
u
=
5
,
z
=
25
,
d
x
d
u
=
2
,
d
u
d
z
=
2
u
=
10
,
d
z
d
x
=
10
⋅
2
=
20.
\frac{dz}{dx}=10\cdot2=20.
d
x
d
z
=
10
⋅
2
=
20.
Второй локальный множитель равен
2
u
2u
2
u
, не
2
x
2x
2
x
: derivative каждого узла вычисляется в его собственном входном состоянии.
Reverse-mode переносит одну upstream-чувствительность назад
Начинаем со скалярного выхода, поэтому
z
ˉ
=
∂
z
/
∂
z
=
1
\bar z=\partial z/\partial z=1
z
ˉ
=
∂
z
/
∂
z
=
1
. Затем
u
ˉ
=
z
ˉ
∂
z
∂
u
=
10
,
x
ˉ
=
u
ˉ
∂
u
∂
x
=
20.
\bar u=\bar z\frac{\partial z}{\partial u}=10,
\qquad
\bar x=\bar u\frac{\partial u}{\partial x}=20.
u
ˉ
=
z
ˉ
∂
u
∂
z
=
10
,
x
ˉ
=
u
ˉ
∂
x
∂
u
=
20.
Forward pass хранит
x
,
u
,
z
x,u,z
x
,
u
,
z
; backward применяет локальные правила в обратном топологическом порядке. Backprop вычисляет производные в текущем графе. Он не изменяет параметры: update выполняет отдельный optimizer.
Вдоль пути множители, между путями сумма
У
z
=
x
2
+
x
z=x^2+x
z
=
x
2
+
x
вход влияет на результат двумя маршрутами. Вклад квадратной ветви равен
2
x
2x
2
x
, прямой ветви — 1:
d
z
d
x
=
2
x
+
1.
\frac{dz}{dx}=2x+1.
d
x
d
z
=
2
x
+
1.
Эти вклады складываются, потому что дифференциал суммы равен сумме дифференциалов. Перемножение
2
x
⋅
1
2x\cdot1
2
x
⋅
1
ошибочно соединяло бы параллельные пути как последовательные.
Если
u
=
x
2
u=x^2
u
=
x
2
, а
z
=
u
+
u
z=u+u
z
=
u
+
u
, один промежуточный узел используется дважды. При
x
=
3
x=3
x
=
3
:
u
ˉ
=
1
+
1
=
2
,
x
ˉ
=
u
ˉ
⋅
2
x
=
12.
\bar u=1+1=2,
\qquad \bar x=\bar u\cdot2x=12.
u
ˉ
=
1
+
1
=
2
,
x
ˉ
=
u
ˉ
⋅
2
x
=
12.
Autograd должен накапливать gradient общего узла. Перезапись второго вклада первым или наоборот теряет часть графа.
Численная проверка проверяет точку, а не вывод
Для
z
(
x
)
=
(
2
x
+
1
)
2
z(x)=(2x+1)^2
z
(
x
)
=
(
2
x
+
1
)
2
центральная разность при
x
=
2
x=2
x
=
2
,
h
=
10
−
5
h=10^{-5}
h
=
1
0
−
5
равна примерно 20:
z
(
x
+
h
)
−
z
(
x
−
h
)
2
h
≈
20.
\frac{z(x+h)-z(x-h)}{2h}\approx20.
2
h
z
(
x
+
h
)
−
z
(
x
−
h
)
≈
20.
Совпадение полезно как regression check локального backward. Оно не доказывает символическую формулу для всех
x
x
x
, может пропустить компенсирующие ошибки и требует разумного допуска floating-point.
Для векторных узлов те же правила записываются через Jacobian products. Reverse-mode не строит обязательно полный Jacobian каждого слоя: он передаёт upstream vector через локальный vector-Jacobian product. Поэтому стоимость зависит от графа и операций, а не от буквального хранения всех попарных производных.
x = 2
u = 2*x + 1
z = u*u
dz_du = 2*u
du_dx = 2
dz_dx = dz_du*du_dx
h = 1e-5
numeric = (((2*(x+h)+1)**2) - ((2*(x-h)+1)**2)) / (2*h)
assert (u, z, dz_dx) == (5, 25, 20)
assert abs(numeric - dz_dx) < 1e-8
Код повторяет только что разобранные операции.
Полный проверяемыйPython-пример главы
доступен отдельным файлом; показанный короткий фрагмент не заменяет его реализацию.
Нам не пришлось угадывать влияние сразу всей формулы: оно составлено из влияния отдельных действий.
Как превратить уверенность прогноза в численную оценку ошибки?
Python-примеры главы 03
Академическая база →