В новом уроке курса от DeepLearning.AI сооснователь компании и известный эксперт в области машинного обучения Эндрю Ын (Andrew Ng) детально разбирает интуицию, стоящую за алгоритмом обратного распространения ошибки (backpropagation). Хотя лектор называет это видео опциональным для тех, кто не планирует глубоко погружаться в математический вывод, он подчеркивает, что понимание этих процессов критически важно для эффективной отладки и настройки нейронных сетей.
🧠 От логистической регрессии к нейронным сетям 0:00
Процесс обучения нейронной сети во многом опирается на те же принципы, что и логистическая регрессия, но в более сложном, многослойном масштабе . В логистической регрессии мы имеем прямой проход (forward pass), где последовательно вычисляются промежуточное значение $Z$, активация $A$ и, наконец, функция потерь (loss) .
Для обновления параметров используется обратный проход (backward pass):
- Сначала вычисляется производная функции потерь по отношению к активации ($da$).
- Затем вычисляется $dz$ — производная по отношению к линейной части.
- На основе этих данных определяются изменения для весов ($dw$) и смещения ($db$) .
Как отмечает Эндрю Ын, формула для $da$ в логистической регрессии выводится через вычисление производной функции потерь: $L(a, y) = -(y \log a + (1 - y) \log(1 - a))$ . При применении правил исчисления это дает выражение: $da = -y/a + (1 - y)/(1 - a)$ .
Ключевым моментом здесь является переход от $da$ к $dz$. Согласно правилу цепного дифференцирования (chain rule), $dz = da \cdot G'(z)$, где $G(z)$ — функция активации (в данном случае сигмоида) . После упрощения для логистической регрессии эта формула всегда сводится к элегантному $dz = a - y$ .
🏗️ Архитектура двухслойной сети: двойной расчет 3:19
В полноценной нейронной сети с одним скрытым слоем расчеты фактически дублируются. Вместо одного этапа, как в логистической регрессии, мы проходим два шага вперед и, соответственно, два шага назад .
Прямой проход в двухслойной сети выглядит следующим образом:
- Вычисление $z^{[1]}$ на основе входных данных $X$ и параметров первого слоя ($W^{[1]}, b^{[1]}$) .
- Получение активаций первого слоя $a^{[1]}$ через функцию $G^{[1]}$.
- Вычисление $z^{[2]}$ с использованием весов второго слоя $W^{[2]}$ и активаций $a^{[1]}$.
- Получение финального прогноза $a^{[2]}$ и расчет функции потерь .
Алгоритм обратного распространения (backpropagation) движется строго в обратном порядке. Интересно, что Эндрю Ын в практической реализации рекомендует объединять шаги вычисления $da$ и $dz$, чтобы сразу получать итоговое значение ошибки на узле . Так, для выходного слоя $dz^{[2]} = a^{[2]} - y$ .
Градиенты для параметров второго слоя вычисляются по формулам:
- $dW^{[2]} = dz^{[2]} \cdot a^{[1]T}$ (здесь активации первого слоя играют ту же роль, что входные данные $X$ в логистической регрессии) .
- $db^{[2]} = dz^{[2]}$ (для одного обучающего примера) .
📏 Важность контроля размерности матриц 6:40
Переход к скрытому слою требует более сложных вычислений. Чтобы вычислить $dz^{[1]}$, необходимо передать ошибку от выходного слоя назад через веса $W^{[2]}$ .
Формула выглядит так: $dz^{[1]} = (W^{[2]T} \cdot dz^{[2]}) * G^{[1]'}(z^{[1]})$
Здесь символ «$$» обозначает поэлементное произведение (element-wise product). Эндрю Ын* подчеркивает, что проверка размерности матриц — это лучший способ найти ошибки в коде нейросети . Например, если у нас $n^{[1]}$ скрытых узлов и один выходной узел:
- Матрица $W^{[2]}$ имеет размерность $(1, n^{[1]})$, следовательно, её транспинированная версия $W^{[2]T}$ имеет размерность $(n^{[1]}, 1)$ .
- Вектор $dz^{[2]}$ в случае бинарной классификации — это скаляр $(1, 1)$.
- Вектор $G^{[1]'}(z^{[1]})$ имеет размерность $(n^{[1]}, 1)$, соответствующую количеству скрытых узлов .
Результат вычисления $dz^{[1]}$ также должен быть вектором $(n^{[1]}, 1)$. По словам лектора, если вы просто убедитесь, что размерности ваших матриц совпадают на каждом этапе, вы автоматически устраните большинство багов в реализации алгоритма .
🏎️ Векторизация: обработка всех данных одновременно 11:14
В реальных задачах обучение происходит не на одном примере, а на всей выборке сразу. Для этого используется векторизация, где индивидуальные векторы $z, a$ и $x$ объединяются в большие матрицы $Z, A$ и $X$, где столбцы соответствуют различным тренировочным примерам .
Эндрю Ын представляет шесть ключевых векторизованных уравнений для обратного прохода:
- $dZ^{[2]} = A^{[2]} - Y$ .
- $dW^{[2]} = (1/m) \cdot dZ^{[2]} \cdot A^{[1]T}$ (здесь добавляется коэффициент $1/m$, так как функция стоимости $J$ является средним арифметическим потерь по всем примерам) .
- $db^{[2]} = (1/m) \cdot \text{np.sum}(dZ^{[2]}, \text{axis}=1, \text{keepdims=True})$ .
- $dZ^{[1]} = (W^{[2]T} \cdot dZ^{[2]}) * G^{[1]'}(Z^{[1]})$ .
- $dW^{[1]} = (1/m) \cdot dZ^{[1]} \cdot X^T$ .
- $db^{[1]} = (1/m) \cdot \text{np.sum}(dZ^{[1]}, \text{axis}=1, \text{keepdims=True})$.
По мнению Эндрю Ына, вывод алгоритма обратного распространения — это одна из самых сложных математических задач в машинном обучении . Она требует глубоких знаний линейной алгебры и матричного исчисления. Тем не менее, он отмечает, что многим практикам в области Deep Learning достаточно иметь интуитивное понимание на том уровне, который представлен в видео, чтобы эффективно строить работающие модели .
В завершение лектор анонсирует следующую важную тему: правильную инициализацию весов. Он утверждает, что инициализация параметров нулями является ошибкой, и объясняет, почему для обучения нейросетей критически важна случайная инициализация .