Alterna · учебный материал
09.5 Один вес используется несколько раз
Каждый путь вносит свой вклад. Их нужно сложить, а не переписать последним результатом.
Что в этом материале
- Один узел используется дважды
Содержание и основные понятия
На предыдущей странице: от одной ошибки ко всем весам.
Каждый путь вносит свой вклад. Их нужно сложить, а не переписать последним результатом.
Сохраним зависимости выполненных действий и пройдём от ошибки назад. Вклады разных путей к общему весу складываются. Это автоматическое дифференцирование, а не новый способ угадывать направление.
Для изменения рисунка включитеJavaScript; расчёт и теория доступны далее.
Один узел используется дважды
Пусть u=x²,L=u+u,x=2. Forward даёт u=4,L=8. Add передаёт в grad(u) два вклада1, итого2. Затем квадрат передаёт grad(x)=2×2x=8. При перезаписи grad(u)=1 вместо
+=
получится4: forward останется правильным, backward сломается.
d
L
d
x
=
(
1
+
1
)
d
u
d
x
=
2
⋅
2
x
.
\frac{dL}{dx}=(1+1)\frac{du}{dx}=2\cdot2x.
d
x
d
L
=
(
1
+
1
)
d
x
d
u
=
2
⋅
2
x
.
Topological sort посещает каждый
узел
один раз, а edges сохраняют кратность. Удалять повторные contributions нельзя. В batch MLP общий параметр тоже влияет на несколько примеров; его gradient суммирует все эти пути с учётом усреднения loss.
Исследовать.
Создайте L=(x+x)*(x+x). Сравните вариант с общим u=x+x и вариант с разными u,v, содержащими одинаковые выражения. Правильная derivative8x совпадёт, хотя число операций различается.
Повторный backward.
Некоторые frameworks накапливают gradients между batches. Наш engine перед полным backward обнуляет все достижимые узлы: второй вызов повторяет результат, не удваивает его. Это явное соглашение учебной реализации, не универсальный контракт PyTorch.
x=2
u=x*x
grad_u=1+1
grad_x=grad_u*x+grad_u*x
assert u+u==8 and grad_x==8
Код повторяет только что разобранные операции.
Полный проверяемыйPython-пример главы
доступен отдельным файлом; показанный короткий фрагмент не заменяет его реализацию.
Nodes обходятся один раз, но кратность edges сохраняется.
Программа вычисляет производные. Как этот вопрос продолжает полученный результат?
Python-примеры главы 09
Академическая база →