# Эндрю Ын: «Лист бумаги — лучший инструмент отладки размерностей нейросетей»

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

---

Правильное определение размерностей матриц — один из самых критически важных навыков при построении глубоких нейронных сетей. В этом обучающем материале Эндрю Ын, основатель DeepLearning.AI и один из самых известных экспертов в области искусственного интеллекта, делится своей методикой отладки кода через проверку размерностей векторов и матриц.

## 📝 Главный инструмент отладки: лист бумаги и карандаш
[[JUMP:0:00]]

При реализации глубоких нейронных сетей Эндрю Ын рекомендует использовать простой, но эффективный метод проверки корректности кода — прописывание размерностей всех матриц на бумаге [0:00]. По мнению автора, это позволяет пройти через все слои алгоритма и убедиться в логической согласованности вычислений.

Для иллюстрации процесса рассматривается пример нейронной сети с пятью слоями ($L=5$). В этой архитектуре:

*   Входной слой (Layer 0).
*   Четыре скрытых слоя (Layers 1, 2, 3, 4).
*   Один выходной слой (Layer 5) [0:12].

Размерности слоев (количество нейронов в каждом) в примере распределены следующим образом:

*   $n^{[0]}$ (входные признаки $X$) = 2;
*   $n^{[1]}$ = 3;
*   $n^{[2]}$ = 5;
*   $n^{[3]}$ = 4;
*   $n^{[4]}$ = 2;
*   $n^{[5]}$ = 1 [0:57].

## 📏 Формула весов: как определить размерность $W$
[[JUMP:1:40]]

Ключевым уравнением для каждого слоя является расчет $Z^{[l]} = W^{[l]} \cdot A^{[l-1]} + b^{[l]}$. На первом этапе анализа Эндрю Ын предлагает временно игнорировать смещение ($b$) и сосредоточиться на параметрах весов ($W$) [0:44].

Для первого скрытого слоя уравнение выглядит так: $Z^{[1]} = W^{[1]} \cdot X$.

*   Вектор активаций $Z^{[1]}$ должен иметь размерность $(3, 1)$, так как в первом слое 3 нейрона [1:53].
*   Вектор входных признаков $X$ имеет размерность $(2, 1)$ [2:07].

Чтобы результат умножения матрицы на вектор $(2, 1)$ дал вектор $(3, 1)$, матрица $W^{[1]}$ по правилам матричного умножения обязана иметь размерность $(3, 2)$ [2:34]. 

На основе этого выводится общее правило: **размерность матрицы весов $W^{[l]}$ для любого слоя $L$ должна составлять $(n^{[l]}, n^{[l-1]})$** [3:03].

Примеры для слоев рассматриваемой сети:

*   $W^{[2]}$ должна иметь размерность $(5, 3)$;
*   $W^{[3]}$ — $(4, 5)$;
*   $W^{[4]}$ — $(2, 4)$;
*   $W^{[5]}$ — $(1, 2)$ [3:31].

## ➕ Смещение и градиенты: векторы $b$ и производные
[[JUMP:4:46]]

Размерность вектора смещения $b$ определяется проще. Поскольку результат операции $W \cdot A$ дает вектор размерности $(n^{[l]}, 1)$, то и вектор $b$, который суммируется с ним, должен иметь ту же размерность [4:59].

Основные выводы по параметрам:

1.  **Матрица $W^{[l]}$**: размерность $(n^{[l]}, n^{[l-1]})$ [5:43].
2.  **Вектор $b^{[l]}$**: размерность $(n^{[l]}, 1)$ [5:43].
3.  **Градиенты**: размерности $dW$ и $db$ всегда должны в точности совпадать с размерностями соответствующих параметров $W$ и $b$ [5:57].

Эндрю Ын также отмечает, что в стандартных сетях размерности $Z^{[l]}$ и $A^{[l]}$ идентичны, так как функция активации применяется поэлементно и не меняет форму матрицы [6:28].

## 🚀 Векторизация: переход от одного примера к обучающей выборке
[[JUMP:6:56]]

При переходе от вычислений для одного примера к векторной реализации для всей обучающей выборки (размером $m$), размерности некоторых параметров меняются. Однако размерности весов $W$, смещений $b$ и их производных $dW$ и $db$ остаются неизменными [6:56].

Изменения касаются векторов активаций и входных данных, которые превращаются в матрицы:

*   **Входная матрица $X$**: вместо $(n^{[0]}, 1)$ становится $(n^{[0]}, m)$, где $m$ — количество примеров в датасете, сложенных горизонтально [8:21].
*   **Матрица $Z^{[l]}$**: принимает размерность $(n^{[l]}, m)$ [8:06].
*   **Матрица $A^{[l]}$**: также имеет размерность $(n^{[l]}, m)$ [9:21].

Важное замечание касается параметра $b$. Несмотря на то, что $b$ остается вектором $(n^{[l]}, 1)$, при сложении с матрицей $W \cdot X$ (размером $n^{[l]}, m$) в Python срабатывает механизм **broadcasting** (транслирование) [8:50]. Программа автоматически дублирует вектор $b$ нужное количество раз, чтобы превратить его в матрицу $(n^{[l]}, m)$ для поэлементного сложения [9:04].

## 🛠 Заключение: борьба с багами
[[JUMP:10:10]]

По словам Эндрю Ына, строгий контроль за соответствием размерностей — это надежный способ устранить целые классы ошибок при реализации алгоритмов обратного распространения ошибки (backpropagation) в глубоких сетях [10:23]. Если вы добьетесь консистентности размерностей всех матриц, вы пройдете большую часть пути к корректному коду [10:37].

В следующем материале автор обещает разобрать вопрос, почему именно глубокие нейронные сети (deep networks) демонстрируют такую высокую эффективность по сравнению с «мелкими» (shallow) моделями [11:04].