# Интуиция Backpropagation: как работают шесть ключевых уравнений нейросети

Источник: https://www.youtube.com/watch?v=yXcQ4B-YSjQ
Канал: DeepLearning.AI
Опубликовано: 25.08.2017

---

В новом уроке курса от **DeepLearning.AI** сооснователь компании и известный эксперт в области машинного обучения **Эндрю Ын (Andrew Ng)** детально разбирает интуицию, стоящую за алгоритмом обратного распространения ошибки (backpropagation). Хотя лектор называет это видео опциональным для тех, кто не планирует глубоко погружаться в математический вывод, он подчеркивает, что понимание этих процессов критически важно для эффективной отладки и настройки нейронных сетей.

## 🧠 От логистической регрессии к нейронным сетям
[[JUMP:0:00]]

Процесс обучения нейронной сети во многом опирается на те же принципы, что и логистическая регрессия, но в более сложном, многослойном масштабе [0:13]. В логистической регрессии мы имеем прямой проход (forward pass), где последовательно вычисляются промежуточное значение $Z$, активация $A$ и, наконец, функция потерь (loss) [0:26].

Для обновления параметров используется обратный проход (backward pass):

*   Сначала вычисляется производная функции потерь по отношению к активации ($da$).
*   Затем вычисляется $dz$ — производная по отношению к линейной части.
*   На основе этих данных определяются изменения для весов ($dw$) и смещения ($db$) [0:41].

Как отмечает **Эндрю Ын**, формула для $da$ в логистической регрессии выводится через вычисление производной функции потерь:
$L(a, y) = -(y \log a + (1 - y) \log(1 - a))$ [0:58].
При применении правил исчисления это дает выражение:
$da = -y/a + (1 - y)/(1 - a)$ [1:11].

Ключевым моментом здесь является переход от $da$ к $dz$. Согласно правилу цепного дифференцирования (chain rule), $dz = da \cdot G'(z)$, где $G(z)$ — функция активации (в данном случае сигмоида) [1:42]. После упрощения для логистической регрессии эта формула всегда сводится к элегантному $dz = a - y$ [1:24].

## 🏗️ Архитектура двухслойной сети: двойной расчет
[[JUMP:3:19]]

В полноценной нейронной сети с одним скрытым слоем расчеты фактически дублируются. Вместо одного этапа, как в логистической регрессии, мы проходим два шага вперед и, соответственно, два шага назад [3:34].

Прямой проход в двухслойной сети выглядит следующим образом:

1. Вычисление $z^{[1]}$ на основе входных данных $X$ и параметров первого слоя ($W^{[1]}, b^{[1]}$) [4:01].
2. Получение активаций первого слоя $a^{[1]}$ через функцию $G^{[1]}$.
3. Вычисление $z^{[2]}$ с использованием весов второго слоя $W^{[2]}$ и активаций $a^{[1]}$.
4. Получение финального прогноза $a^{[2]}$ и расчет функции потерь [4:28].

Алгоритм обратного распространения (backpropagation) движется строго в обратном порядке. Интересно, что **Эндрю Ын** в практической реализации рекомендует объединять шаги вычисления $da$ и $dz$, чтобы сразу получать итоговое значение ошибки на узле [5:08]. Так, для выходного слоя $dz^{[2]} = a^{[2]} - y$ [5:21].

Градиенты для параметров второго слоя вычисляются по формулам:

*   $dW^{[2]} = dz^{[2]} \cdot a^{[1]T}$ (здесь активации первого слоя играют ту же роль, что входные данные $X$ в логистической регрессии) [5:36].
*   $db^{[2]} = dz^{[2]}$ (для одного обучающего примера) [5:53].

## 📏 Важность контроля размерности матриц
[[JUMP:6:40]]

Переход к скрытому слою требует более сложных вычислений. Чтобы вычислить $dz^{[1]}$, необходимо передать ошибку от выходного слоя назад через веса $W^{[2]}$ [6:50].

Формула выглядит так:
$dz^{[1]} = (W^{[2]T} \cdot dz^{[2]}) * G^{[1]'}(z^{[1]})$

Здесь символ «$*$» обозначает поэлементное произведение (element-wise product). **Эндрю Ын** подчеркивает, что проверка размерности матриц — это лучший способ найти ошибки в коде нейросети [7:04]. Например, если у нас $n^{[1]}$ скрытых узлов и один выходной узел:

*   Матрица $W^{[2]}$ имеет размерность $(1, n^{[1]})$, следовательно, её транспинированная версия $W^{[2]T}$ имеет размерность $(n^{[1]}, 1)$ [8:44].
*   Вектор $dz^{[2]}$ в случае бинарной классификации — это скаляр $(1, 1)$.
*   Вектор $G^{[1]'}(z^{[1]})$ имеет размерность $(n^{[1]}, 1)$, соответствующую количеству скрытых узлов [9:11].

Результат вычисления $dz^{[1]}$ также должен быть вектором $(n^{[1]}, 1)$. По словам лектора, если вы просто убедитесь, что размерности ваших матриц совпадают на каждом этапе, вы автоматически устраните большинство багов в реализации алгоритма [9:50].

## 🏎️ Векторизация: обработка всех данных одновременно
[[JUMP:11:14]]

В реальных задачах обучение происходит не на одном примере, а на всей выборке сразу. Для этого используется векторизация, где индивидуальные векторы $z, a$ и $x$ объединяются в большие матрицы $Z, A$ и $X$, где столбцы соответствуют различным тренировочным примерам [11:54].

**Эндрю Ын** представляет шесть ключевых векторизованных уравнений для обратного прохода:

1.  $dZ^{[2]} = A^{[2]} - Y$ [12:54].
2.  $dW^{[2]} = (1/m) \cdot dZ^{[2]} \cdot A^{[1]T}$ (здесь добавляется коэффициент $1/m$, так как функция стоимости $J$ является средним арифметическим потерь по всем примерам) [13:08].
3.  $db^{[2]} = (1/m) \cdot \text{np.sum}(dZ^{[2]}, \text{axis}=1, \text{keepdims=True})$ [13:21].
4.  $dZ^{[1]} = (W^{[2]T} \cdot dZ^{[2]}) * G^{[1]'}(Z^{[1]})$ [13:35].
5.  $dW^{[1]} = (1/m) \cdot dZ^{[1]} \cdot X^T$ [14:18].
6.  $db^{[1]} = (1/m) \cdot \text{np.sum}(dZ^{[1]}, \text{axis}=1, \text{keepdims=True})$.

По мнению **Эндрю Ына**, вывод алгоритма обратного распространения — это одна из самых сложных математических задач в машинном обучении [14:31]. Она требует глубоких знаний линейной алгебры и матричного исчисления. Тем не менее, он отмечает, что многим практикам в области Deep Learning достаточно иметь интуитивное понимание на том уровне, который представлен в видео, чтобы эффективно строить работающие модели [14:59].

В завершение лектор анонсирует следующую важную тему: правильную инициализацию весов. Он утверждает, что инициализация параметров нулями является ошибкой, и объясняет, почему для обучения нейросетей критически важна случайная инициализация [15:38].