7 Backpropagation
Контекст
После «Perceptrons» (#4) поле ждёт способа обучать сети с скрытыми слоями — только они обходят ограничение линейности (XOR). Технически backprop уже известен (Линнайнмаа/Вербос, #5), но именно эта короткая заметка в Nature делает его убедительным и запускает коннекционистскую волну.
Идея и механизм
Сеть из слоёв нейронов с гладкой нелинейностью (сигмоида σ) — гладкость нужна, чтобы существовала производная. Минимизируем ошибку, например квадратичную:
Обучение — градиентный спуск, а градиент даёт backprop.
Прямой проход. Для каждого нейрона считаем взвешенный вход netj = Σi wij xi и активацию xj = σ(netj), слой за слоем до выхода.
Обратный проход. Вводим «сигнал ошибки» δj = ∂E / ∂netj. Для выходного нейрона он берётся прямо из ошибки, а для скрытого — собирается из δ нейронов следующего слоя (это и есть цепное правило):
Зная δ, градиент по любому весу — это просто произведение «сигнала ошибки сверху» на «активацию снизу», после чего делаем шаг спуска:
Вся «магия» обучения сети — это цепное правило плюс шаг градиентного спуска, организованные в один обратный проход (см. #5).
мат. анализ Откуда берётся правило δ — вывод из цепного правила
Определим δj ≡ ∂E/∂netj — чувствительность ошибки к взвешенному входу нейрона j. Ошибка E зависит от netj только через нейроны k следующего слоя, которые питает j. По цепному правилу суммируем по всем таким k:
Поскольку netk = Σj wjk σ(netj), производная одного слагаемого:
Подставляем — и получаем рекуррентную формулу обратного прохода:
База рекурсии — выходной слой, где E зависит от neto напрямую через yo = σ(neto):
Градиент по весу — последний шаг цепного правила, где ∂netj/∂wij = xi:
Итог: один проход назад вычисляет δ для всех нейронов (переиспользуя δ следующего слоя), а из δ — сразу все градиенты. Стоимость — порядка одного прямого прохода, независимо от числа весов. Это и делает обучение глубоких сетей вычислительно реальным.
NumPy Реализация: forward + backward для 2-слойной сети
import numpy as np
sig = lambda z: 1 / (1 + np.exp(-z))
def forward(x, W1, W2):
h = sig(x @ W1) # скрытый слой
y = sig(h @ W2) # выход
return h, y
def backward(x, h, y, t, W2):
dy = (y - t) * y * (1 - y) # δ выходного слоя
dh = (dy @ W2.T) * h * (1 - h) # δ скрытого (цепное правило)
gW2 = h.T @ dy # ∂E/∂W2 = δ · активация
gW1 = x.T @ dh
return gW1, gW2 # шаг: W -= lr * gW
Почему это важно
Прямой ответ Минскому–Паперту: многослойные сети обучаемы и XOR решают. Но ключевое открытие глубже — representation learning: на задачах вроде распознавания симметрии скрытые нейроны сами выучивают осмысленные внутренние признаки. Это ядро всего глубокого обучения: сеть не просто классифицирует, она конструирует промежуточные представления под задачу.
Backprop становится универсальным движком обучения — от LeNet (#9) до GPT всё учится им. Ограничения той эпохи (затухающий градиент в глубоких и рекуррентных сетях, нехватка данных и compute) проявятся позже и будут лечиться ReLU, LSTM (#11), ResNet (#27) и GPU.
Связи
Математическое ядро — тот самый обратный режим автоматического дифференцирования, открытый Линнайнмаа (1970) и применённый к сетям Вербосом (1974). Вклад статьи 1986-го — не изобретение алгоритма, а демонстрация, что им реально можно обучать многослойные сети с пользой, плюс громкая публикация в Nature. Понимать backprop = понимать, что это просто эффективное цепное правило на графе сети.
Минский и Паперт показали бессилие однослойного перцептрона (не может XOR) и пессимистично предположили то же для многослойных. Backprop научил обучать скрытые слои, которые строят нелинейные признаки и решают XOR играючи — этим прямо опровергнут пессимизм и закрыта «первая зима ИИ».
Как только многослойные сети стало можно обучать, backprop применили к свёрточной архитектуре на пикселях. LeNet — это backprop + структурные ограничения (локальность, весовой шаринг); тот же движок обучения, но теперь учащий иерархию зрительных признаков от граней до цифр.
Backprop отвечает на вопрос «куда двигать веса» (даёт градиент), но не «каким шагом». Это работа оптимизатора: от простого SGD до Adam, который добавляет момент и по-параметрические адаптивные шаги. Разделение труда «градиент (backprop) + правило шага (оптимизатор)» сохраняется и сегодня в каждой обучаемой модели.
Вопросы пытливого ума
Если backprop — это просто цепное правило, известное с 1970-х (#5), почему именно статья 1986-го считается поворотной?
Потому что вклад был не в изобретении, а в демонстрации и огласке. Линнайнмаа и Вербос дали сам алгоритм, но эта работа эмпирически показала, что им можно с пользой обучать многослойные сети — и что скрытые слои выучивают осмысленные внутренние признаки (representation learning). Плюс публикация в Nature и созревшее поле: интерес, растущие вычислительные возможности.
«Кто открыл» и «кто сделал идею рабочей и известной» — в науке часто разные люди. Backprop — классический тому пример.
Функция потерь невыпукла — не застрянет ли спуск в плохом локальном минимуме?
На практике почти нет, и это долго удивляло. В пространствах высокой размерности подавляющее большинство критических точек — сёдла, а не плохие минимумы, и SGD из них выбирается (шум помогает). Сильно переопределённые сети имеют целые связные многообразия хороших решений, и эмпирически разные минимумы дают почти одинаковый лосс.
Глобальный оптимум не гарантирован, но «достаточно хороший» находится надёжно — это одна из эмпирических загадок, делающих глубокое обучение рабочим.
Почему сигмоида, а не жёсткий порог, как у перцептрона (#3)?
Backprop требует производной, а у пороговой функции производная либо ноль, либо не определена — градиент не течёт, обучать нечем. Гладкая сигмоида это чинит.
Позже выяснилось, что сигмоида сама затухает на краях (vanishing gradient в глубоких сетях), и её потеснил ReLU — кусочно-линейный, с производной 0 или 1, который не насыщается и резко ускорил обучение глубоких сетей.
А мозг так учится? Биологически ли правдоподобен backprop?
Скорее нет — по крайней мере не буквально. Обратный проход требует, чтобы те же синаптические веса использовались «назад» (проблема транспорта весов), и единого глобального сигнала ошибки в мозге не видно.
Есть более правдоподобные альтернативы (feedback alignment, predictive coding), приближающие backprop локальными правилами. Но как инженерный инструмент backprop не обязан копировать биологию — он просто работает.
Что читать в оригинале
Заметка короткая (4 страницы) — стоит прочитать целиком и прорешать вывод δ для одного скрытого слоя руками. Это самый эффективный способ навсегда понять, что обучение сети — не магия, а цепное правило плюс градиентный спуск.