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

09.6 Программа вычисляет производные

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

Автоматическое дифференцирование сохраняет связи действий и применяет уже изученные местные правила. Оно не угадывает градиент и не выбирает оптимизатор.

Сохраним зависимости выполненных действий и пройдём от ошибки назад. Вклады разных путей к общему весу складываются. Это автоматическое дифференцирование, а не новый способ угадывать направление.

Из правил получается работающая система

Value хранит data,grad и edges с локальными производными. Add/mul создают новые объекты. Backward строит порядок, очищает gradients, seedит output единицей и суммирует contributions.

Это настоящий ограниченный AD engine, а не таблица заранее вычисленных gradients. В браузере дополнительно поддерживаются tanh/relu и сериализуемая пошаговая трасса. Python-пример можно скачать и запустить самостоятельно.

Проверка. Сопоставьте gradient с центральной разностью [L(θ+h)−L(θ−h)]/(2h) при h=1e−5 для каждой координаты. Избегайте точек недифференцируемости ReLU: разность в0 не обязана совпадать с convention. Численные тесты проверяют реализацию на fixtures, но не заменяют формального доказательства всей программы.

Не поддерживаются tensor broadcasting, higher-order graphs, in-place mutation и GPU. Это прозрачная основа, которую можно расширять после проверки инвариантов. Следующий блок разберёт физическое выполнение вычислений, пока обозначенное в программе курса.

class Value:
    def __init__(self,data,parents=()):
        self.data=float(data); self.grad=0.0; self.parents=list(parents)
    def __add__(self,other):
        return Value(self.data+other.data,[(self,1.0),(other,1.0)])
    def __mul__(self,other):
        return Value(self.data*other.data,[(self,other.data),(other,self.data)])
    def backward(self):
# Полный исполняемый пример — по ссылке ниже.

Код повторяет только что разобранные операции. Полный проверяемыйPython-пример главы доступен отдельным файлом; показанный короткий фрагмент не заменяет его реализацию.

Это явный контракт engine; другие frameworks могут накапливать между вызовами.

Как компьютер хранит числа и выполняет столько похожих операций?

Python-примеры главы 09 Академическая база →