Как модель узнаёт, в какую сторону изменять веса
Мы умеем получать предсказание из входных чисел и параметров. Но пока параметры произвольны, ответ тоже может быть далёк от правильного. Чтобы начать обучение, нужен способ оценить расхождение. Для одного числового ответа возьмём ошибку L = 0.5 · (pred - y)², где pred — предсказание, а y — правильное значение. Квадрат делает ошибку неотрицательной и сильнее выделяет большие отклонения. Множитель 0.5 пока нужен для удобства: при вычислении производной он сократится с двойкой, появившейся от квадрата.
Само значение ошибки сообщает, насколько неудачен текущий ответ, но ещё не подсказывает, какие параметры менять. Для этого нужна производная. Она описывает чувствительность результата к небольшому изменению выбранной величины. Если производная ошибки по весу положительна, небольшое увеличение веса в данной точке ведёт к росту ошибки. Если отрицательна — к уменьшению. Собранные вместе производные по всем параметрам образуют градиент.
Рассмотрим модель pred = w · x + b при x = 2, y = 1, w = 0.2 и b = 0.1. Её предсказание равно 0.5, а ошибка — 0.125. Чтобы понять влияние веса, нужно пройти две зависимости: вес влияет на предсказание, а предсказание влияет на ошибку. По цепному правилу dL/dw = (dL/dpred) · (dpred/dw). Здесь первая производная равна pred - y = -0.5, вторая — x = 2, поэтому dL/dw = -1. Для смещения получаем dL/db = -0.5, поскольку оно входит в предсказание с коэффициентом 1.
Механизм autograd выполняет такую работу автоматически. Когда мы создаём параметры с requires_grad=True, PyTorch отслеживает операции, зависящие от них. Получается граф вычислений: запись того, как одни результаты были получены из других. При вызове loss.backward() библиотека проходит по этим связям в обратную сторону и применяет цепное правило. Это не перебор слегка изменённых весов, а вычисление производных выполненных операций.