Урок 1 из 8

Value — число, которое помнит, откуда оно взялось

Обычное число после $c = $a * $b — просто 6, откуда оно взялось, уже не узнать. Value хранит результат и вдобавок помнит, из каких чисел и какой операцией его получили. Из этих связей складывается граф вычислений. По нему потом можно пройти назад и узнать, как каждое число влияет на результат.

Пример из видео: L = (a · b + c) · f

Двигайте ползунки: граф пересчитывается слева направо (это forward). Кликните по любому прямоугольнику, чтобы увидеть, что лежит внутри объекта.

Обратный проход по шагам

Внутри выбранного Value

Прямоугольник на графе — объект Value. Кружок — операция, которая его породила. У листьев (a, b, c, f) операции нет: это исходные числа.

Код: что именно выполняется на этом шаге

Что такое grad «на пальцах»

grad узла — насколько изменится L, если чуть-чуть увеличить этот узел. Проверим без всякого backward: прибавим к каждому листу h = 0.001 и посмотрим, как сдвинулся L.

Числа совпадают: backward вычисляет ровно это, только сразу для всех узлов за один проход, без того чтобы пересчитывать L по разу на каждый вес.

Как объяснить другому

  1. Value — обёртка над числом. Внутри data (само число), prev (из чего получено), op (как) и grad.
  2. Каждая операция (add, mul, tanh) возвращает новый Value и оставляет ему «инструкцию на обратный путь» — функцию backwardFn.
  3. grad отвечает на вопрос: «если это число чуть увеличить, как изменится итог?» Знак показывает направление, величина — силу влияния.
  4. backward() ставит итогу grad = 1 и вызывает инструкции в обратном порядке, так что градиент протекает от итога к каждому листу.