Полученные значения совпадают с расчётом. Число -0.8 может отображаться с небольшим хвостом после запятой: многие десятичные дроби представляются в двоичной памяти приближённо. Это обычная особенность вычислений с вещественными числами. Теперь, зная весь прямой проход, можно двигаться обратно — от ошибки к выходному слою, а затем к скрытому.
Что каждый слой сообщает предыдущему
Производная ошибки по предсказанию равна pred - y = -0.5. Она говорит, что небольшое увеличение предсказания сейчас уменьшило бы ошибку. Предсказание имеет вид pred = a1 · v1 + a2 · v2 + b2, где a1 = 0.5 и a2 = 0 — выходы скрытых нейронов, а v1 = 1 и v2 = 0.5 — веса выходного слоя. По цепному правилу градиент первого выходного веса равен -0.5 · 0.5 = -0.25. У второго веса он нулевой, поскольку его вход a2 равен нулю. Для выходного смещения производная равна -0.5.
Но обратный проход должен сообщить и то, как ошибка зависит от самих скрытых значений. По a1 производная равна -0.5 · v1 = -0.5, по a2 — -0.5 · v2 = -0.25. Обратите внимание: по второму скрытому значению производная пока не нулевая. Нулевой вклад в параметры второго скрытого нейрона появится на следующем участке пути, когда мы пройдём через ReLU.
На положительном входе ReLU просто возвращает вход, поэтому её производная равна 1. На отрицательном входе результат остаётся нулевым при небольших изменениях, поэтому производная равна 0. Первый нейрон получает сигнал -0.5 · 1 = -0.5, а второй — -0.25 · 0 = 0. В самой точке нуля обычная производная ReLU не определена; для обратного прохода PyTorch использует там значение 0. В нашем примере оба входа отличаются от нуля, поэтому этот особый случай на расчёт не влияет.
Осталось пройти через взвешенные суммы. Производная по весу — это пришедший к нейрону сигнал, умноженный на соответствующий вход. Поэтому у веса W1[0, 0] получаем -0.5 · 2 = -1, а у W1[1, 0] — -0.5 · 1 = -0.5. Смещение первого нейрона получает производную -0.5. Во втором столбце W1 и у второго смещения производные нулевые: на этом объекте ReLU перекрыл обратный путь. Теперь сравним весь расчёт с autograd.