Правильное определение размерностей матриц — один из самых критически важных навыков при построении глубоких нейронных сетей. В этом обучающем материале Эндрю Ын, основатель DeepLearning.AI и один из самых известных экспертов в области искусственного интеллекта, делится своей методикой отладки кода через проверку размерностей векторов и матриц.
📝 Главный инструмент отладки: лист бумаги и карандаш 0:00
При реализации глубоких нейронных сетей Эндрю Ын рекомендует использовать простой, но эффективный метод проверки корректности кода — прописывание размерностей всех матриц на бумаге . По мнению автора, это позволяет пройти через все слои алгоритма и убедиться в логической согласованности вычислений.
Для иллюстрации процесса рассматривается пример нейронной сети с пятью слоями ($L=5$). В этой архитектуре:
Размерности слоев (количество нейронов в каждом) в примере распределены следующим образом:
- $n^{[0]}$ (входные признаки $X$) = 2;
- $n^{[1]}$ = 3;
- $n^{[2]}$ = 5;
- $n^{[3]}$ = 4;
- $n^{[4]}$ = 2;
- $n^{[5]}$ = 1 .
📏 Формула весов: как определить размерность $W$ 1:40
Ключевым уравнением для каждого слоя является расчет $Z^{[l]} = W^{[l]} \cdot A^{[l-1]} + b^{[l]}$. На первом этапе анализа Эндрю Ын предлагает временно игнорировать смещение ($b$) и сосредоточиться на параметрах весов ($W$) .
Для первого скрытого слоя уравнение выглядит так: $Z^{[1]} = W^{[1]} \cdot X$.
- Вектор активаций $Z^{[1]}$ должен иметь размерность $(3, 1)$, так как в первом слое 3 нейрона .
- Вектор входных признаков $X$ имеет размерность $(2, 1)$ .
Чтобы результат умножения матрицы на вектор $(2, 1)$ дал вектор $(3, 1)$, матрица $W^{[1]}$ по правилам матричного умножения обязана иметь размерность $(3, 2)$ .
На основе этого выводится общее правило: размерность матрицы весов $W^{[l]}$ для любого слоя $L$ должна составлять $(n^{[l]}, n^{[l-1]})$ .
Примеры для слоев рассматриваемой сети:
- $W^{[2]}$ должна иметь размерность $(5, 3)$;
- $W^{[3]}$ — $(4, 5)$;
- $W^{[4]}$ — $(2, 4)$;
- $W^{[5]}$ — $(1, 2)$ .
➕ Смещение и градиенты: векторы $b$ и производные 4:46
Размерность вектора смещения $b$ определяется проще. Поскольку результат операции $W \cdot A$ дает вектор размерности $(n^{[l]}, 1)$, то и вектор $b$, который суммируется с ним, должен иметь ту же размерность .
Основные выводы по параметрам:
- Матрица $W^{[l]}$: размерность $(n^{[l]}, n^{[l-1]})$ .
- Вектор $b^{[l]}$: размерность $(n^{[l]}, 1)$ .
- Градиенты: размерности $dW$ и $db$ всегда должны в точности совпадать с размерностями соответствующих параметров $W$ и $b$ .
Эндрю Ын также отмечает, что в стандартных сетях размерности $Z^{[l]}$ и $A^{[l]}$ идентичны, так как функция активации применяется поэлементно и не меняет форму матрицы .
🚀 Векторизация: переход от одного примера к обучающей выборке 6:56
При переходе от вычислений для одного примера к векторной реализации для всей обучающей выборки (размером $m$), размерности некоторых параметров меняются. Однако размерности весов $W$, смещений $b$ и их производных $dW$ и $db$ остаются неизменными .
Изменения касаются векторов активаций и входных данных, которые превращаются в матрицы:
- Входная матрица $X$: вместо $(n^{[0]}, 1)$ становится $(n^{[0]}, m)$, где $m$ — количество примеров в датасете, сложенных горизонтально .
- Матрица $Z^{[l]}$: принимает размерность $(n^{[l]}, m)$ .
- Матрица $A^{[l]}$: также имеет размерность $(n^{[l]}, m)$ .
Важное замечание касается параметра $b$. Несмотря на то, что $b$ остается вектором $(n^{[l]}, 1)$, при сложении с матрицей $W \cdot X$ (размером $n^{[l]}, m$) в Python срабатывает механизм broadcasting (транслирование) . Программа автоматически дублирует вектор $b$ нужное количество раз, чтобы превратить его в матрицу $(n^{[l]}, m)$ для поэлементного сложения .
🛠 Заключение: борьба с багами 10:10
По словам Эндрю Ына, строгий контроль за соответствием размерностей — это надежный способ устранить целые классы ошибок при реализации алгоритмов обратного распространения ошибки (backpropagation) в глубоких сетях . Если вы добьетесь консистентности размерностей всех матриц, вы пройдете большую часть пути к корректному коду .
В следующем материале автор обещает разобрать вопрос, почему именно глубокие нейронные сети (deep networks) демонстрируют такую высокую эффективность по сравнению с «мелкими» (shallow) моделями .