Эпоха 1 · Истоки · 1986

7 Backpropagation

Learning Representations by Back-Propagating Errors · Rumelhart, Hinton & Williams · Nature
🟥 читать целиком~1–2 ч (прорешать руками)оригинал ↗
Суть за 20 секунд. Статья, которая научила обучать многослойные сети и сделала backprop знаменитым. Прямой проход считает выход, обратный — распространяет ошибку по цепному правилу, давая градиент для каждого веса. И показала главное: скрытые слои сами выучивают полезные внутренние признаки. Это прямой ответ Минскому–Паперту и старт современного DL.

Контекст

После «Perceptrons» (#4) поле ждёт способа обучать сети с скрытыми слоями — только они обходят ограничение линейности (XOR). Технически backprop уже известен (Линнайнмаа/Вербос, #5), но именно эта короткая заметка в Nature делает его убедительным и запускает коннекционистскую волну.

Идея и механизм

Сеть из слоёв нейронов с гладкой нелинейностью (сигмоида σ) — гладкость нужна, чтобы существовала производная. Минимизируем ошибку, например квадратичную:

E = 12 Σo (yo − to)2

Обучение — градиентный спуск, а градиент даёт backprop.

Прямой проход. Для каждого нейрона считаем взвешенный вход netj = Σi wij xi и активацию xj = σ(netj), слой за слоем до выхода.

Обратный проход. Вводим «сигнал ошибки» δj = ∂E / ∂netj. Для выходного нейрона он берётся прямо из ошибки, а для скрытого — собирается из δ нейронов следующего слоя (это и есть цепное правило):

δo = (yo − to) · σ′(neto)      δj = σ′(netj) · Σk wjk δk

Зная δ, градиент по любому весу — это просто произведение «сигнала ошибки сверху» на «активацию снизу», после чего делаем шаг спуска:

∂E / ∂wij = δj · xi      wij ← wij − η · ∂E / ∂wij

Вся «магия» обучения сети — это цепное правило плюс шаг градиентного спуска, организованные в один обратный проход (см. #5).

мат. анализ Откуда берётся правило δ — вывод из цепного правила

Определим δj ≡ ∂E/∂netj — чувствительность ошибки к взвешенному входу нейрона j. Ошибка E зависит от netj только через нейроны k следующего слоя, которые питает j. По цепному правилу суммируем по всем таким k:

δj = ∂E∂netj = Σk ∂E∂netk · ∂netk∂netj = Σk δk · ∂netk∂netj

Поскольку netk = Σj wjk σ(netj), производная одного слагаемого:

∂netk∂netj = wjk · σ′(netj)

Подставляем — и получаем рекуррентную формулу обратного прохода:

δj = σ′(netj) · Σk wjk δk    ∎

База рекурсии — выходной слой, где E зависит от neto напрямую через yo = σ(neto):

δo = ∂E∂yo · ∂yo∂neto = (yo − to) · σ′(neto)

Градиент по весу — последний шаг цепного правила, где ∂netj/∂wij = xi:

∂E∂wij = δj · 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
вход x скрытый слой (учит признаки) выход y прямой проход → ← обратный проход: δ
Многослойная сеть. Значения идут вперёд (серое), сигнал ошибки δ — назад (фиолетовое). Скрытый слой формирует промежуточные признаки, которых никто не задавал явно.
Аналогия. Организация после провала. Итоговую ошибку (на выходе) топ-менеджер распределяет вниз по иерархии: каждый средний менеджер получает свою долю «вины» (δ) от подчинённых ему звеньев и передаёт ниже. Получив свою долю, каждый сотрудник корректирует ровно своё поведение (вес) — пропорционально тому, как сильно он влиял на итог.

Почему это важно

Прямой ответ Минскому–Паперту: многослойные сети обучаемы и XOR решают. Но ключевое открытие глубже — representation learning: на задачах вроде распознавания симметрии скрытые нейроны сами выучивают осмысленные внутренние признаки. Это ядро всего глубокого обучения: сеть не просто классифицирует, она конструирует промежуточные представления под задачу.

Backprop становится универсальным движком обучения — от LeNet (#9) до GPT всё учится им. Ограничения той эпохи (затухающий градиент в глубоких и рекуррентных сетях, нехватка данных и compute) проявятся позже и будут лечиться ReLU, LSTM (#11), ResNet (#27) и GPU.

Связи

← опирается на5. Предыстория backprop

Математическое ядро — тот самый обратный режим автоматического дифференцирования, открытый Линнайнмаа (1970) и применённый к сетям Вербосом (1974). Вклад статьи 1986-го — не изобретение алгоритма, а демонстрация, что им реально можно обучать многослойные сети с пользой, плюс громкая публикация в Nature. Понимать backprop = понимать, что это просто эффективное цепное правило на графе сети.

→ опровергает4. Perceptrons (критика)

Минский и Паперт показали бессилие однослойного перцептрона (не может XOR) и пессимистично предположили то же для многослойных. Backprop научил обучать скрытые слои, которые строят нелинейные признаки и решают XOR играючи — этим прямо опровергнут пессимизм и закрыта «первая зима ИИ».

→ ведёт к9. LeNet / CNN

Как только многослойные сети стало можно обучать, backprop применили к свёрточной архитектуре на пикселях. LeNet — это backprop + структурные ограничения (локальность, весовой шаринг); тот же движок обучения, но теперь учащий иерархию зрительных признаков от граней до цифр.

↔ дополняется23. Adam

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 страницы) — стоит прочитать целиком и прорешать вывод δ для одного скрытого слоя руками. Это самый эффективный способ навсегда понять, что обучение сети — не магия, а цепное правило плюс градиентный спуск.