alterna ai
ALTERNA AI / ГЛАВА 03 · 06

03.6 Изменение проходит через цепочку

На предыдущей странице: как меняется сам наклон.

Если одно действие зависит от результата другого, влияние передаётся по цепи. Вдоль цепи чувствительности умножаются, а между разными путями складываются.

Сначала u=2x+1, затем L=u²; x=2.

Локальные производные соединяются по структуре вычисления

Пусть

u=g(x),z=h(u).u=g(x),\qquad z=h(u).

Малое изменение сначала проходит через gg, затем через hh:

du≈g′(x)dx,dz≈h′(u)du.du\approx g'(x)dx, \qquad dz\approx h'(u)du.

Подстановка даёт chain rule:

dzdx=dzdududx.\frac{dz}{dx}=\frac{dz}{du}\frac{du}{dx}.

Для u=2x+1u=2x+1, z=u2z=u^2 при x=2x=2:

u=5,z=25,dudx=2,dzdu=2u=10,u=5,\qquad z=25, \qquad \frac{du}{dx}=2, \qquad \frac{dz}{du}=2u=10,
dzdx=10⋅2=20.\frac{dz}{dx}=10\cdot2=20.

Второй локальный множитель равен 2u2u, не 2x2x: derivative каждого узла вычисляется в его собственном входном состоянии.

Reverse-mode переносит одну upstream-чувствительность назад

Начинаем со скалярного выхода, поэтому zˉ=∂z/∂z=1\bar z=\partial z/\partial 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.

Forward pass хранит x,u,zx,u,z; backward применяет локальные правила в обратном топологическом порядке. Backprop вычисляет производные в текущем графе. Он не изменяет параметры: update выполняет отдельный optimizer.

Вдоль пути множители, между путями сумма

У z=x2+xz=x^2+x вход влияет на результат двумя маршрутами. Вклад квадратной ветви равен 2x2x, прямой ветви — 1:

dzdx=2x+1.\frac{dz}{dx}=2x+1.

Эти вклады складываются, потому что дифференциал суммы равен сумме дифференциалов. Перемножение 2x⋅12x\cdot1 ошибочно соединяло бы параллельные пути как последовательные.

Если u=x2u=x^2, а z=u+uz=u+u, один промежуточный узел используется дважды. При x=3x=3:

uˉ=1+1=2,xˉ=uˉ⋅2x=12.\bar u=1+1=2, \qquad \bar x=\bar u\cdot2x=12.

Autograd должен накапливать gradient общего узла. Перезапись второго вклада первым или наоборот теряет часть графа.

Численная проверка проверяет точку, а не вывод

Для z(x)=(2x+1)2z(x)=(2x+1)^2 центральная разность при x=2x=2, h=10−5h=10^{-5} равна примерно 20:

z(x+h)−z(x−h)2h≈20.\frac{z(x+h)-z(x-h)}{2h}\approx20.

Совпадение полезно как regression check локального backward. Оно не доказывает символическую формулу для всех xx, может пропустить компенсирующие ошибки и требует разумного допуска 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 Академическая база →