В современном программировании для машинного обучения скорость выполнения кода часто становится критическим фактором. Эндрю Ын, сооснователь DeepLearning.AI, в рамках своего обучающего курса подробно разбирает механизм Broadcasting (трансляцию) в языке Python — мощный инструмент библиотеки NumPy, позволяющий проводить вычисления над массивами разных размерностей без использования медленных циклов for .
🍎 Практическая мотивация: расчет калорийности продуктов 0:13
Для иллюстрации работы трансляции Эндрю Ын приводит пример из диетологии . Представим матрицу данных, где строки — это содержание углеводов, белков и жиров, а столбцы — четыре различных продукта питания (яблоки, говядина, яйца и картофель) в расчете на 100 граммов:
- Яблоки: содержат 56 калорий из углеводов, и значительно меньше из белков и жиров .
- Говядина: содержит 104 калории из белков и 135 из жиров .
Задача разработчика — вычислить процентное соотношение калорий из углеводов, белков и жиров для каждого продукта в отдельности. Для этого необходимо сначала просуммировать значения в каждом столбце, чтобы получить общую калорийность 100 граммов продукта (например, для яблок это будет 56 + 1.2 + 1.8 = 59 калорий), а затем разделить каждое значение в столбце на эту общую сумму .
В традиционном программировании это потребовало бы явного цикла по столбцам, однако Python позволяет выполнить эту операцию эффективнее .
💻 Техническая реализация в NumPy 2:41
Для решения задачи в среде Jupyter Notebook Эндрю Ын использует всего две строки кода на Python после инициализации исходной матрицы A (размером 3x4) :
cal = A.sum(axis=0)— расчет суммы по вертикали .percentage = 100 * A / cal.reshape(1, 4)— деление матрицы на вектор сумм для получения процентов .
Параметр axis=0 в функции sum указывает NumPy на необходимость суммирования именно по вертикальной оси (столбцам). Если бы использовался параметр axis=1, суммирование происходило бы по горизонтали (строкам) .
Особое внимание Эндрю Ын уделяет использованию функции reshape. Хотя переменная cal после суммирования уже технически является вектором нужной размерности, автор рекомендует явно вызывать reshape(1, 4), чтобы гарантированно получить строку. По мнению Эндрю Ына, операция reshape выполняется за константное время $O(1)$ и стоит крайне «дешево», поэтому её стоит использовать часто, чтобы избежать трудноуловимых ошибок с размерностями массивов .
📐 Общие принципы Broadcasting 5:23
Суть механизма трансляции заключается в том, как Python обрабатывает арифметические операции (сложение, вычитание, умножение, деление) между матрицами и векторами несовпадающих размеров .
Основные сценарии работы трансляции:
- Матрица и скаляр: Если к вектору размером (4, 1) прибавить число (скаляр), Python автоматически «растянет» это число до вектора (4, 1), прибавляя его к каждому элементу . Этот метод часто используется для работы с параметром смещения
bв логистической регрессии . - Матрица (m, n) и вектор-строка (1, n): Python скопирует вектор-строку
mраз по вертикали, превращая её в матрицу (m, n), а затем выполнит поэлементную операцию . - Матрица (m, n) и вектор-столбец (m, 1): В этом случае вектор-столбец будет скопирован
nраз по горизонтали до размера (m, n) .
Общее правило гласит: если у вас есть матрица размерности $(m, n)$ и вы выполняете операцию с вектором $(1, n)$ или $(m, 1)$, этот вектор будет автоматически расширен (транслирован) до размера $(m, n)$ для выполнения поэлементного вычисления .
🛠 Советы для опытных разработчиков 10:01
Для тех, кто ранее программировал на MATLAB или Octave, Эндрю Ын проводит аналогию: механизм трансляции в Python выполняет те же функции, что и известная функция bsxfun в этих языках . Однако для новичков в глубоком обучении это знание не является обязательным.
По словам Эндрю Ына, использование Broadcasting не только ускоряет выполнение кода за счет векторизации, но и делает его более лаконичным, сокращая количество строк . Тем не менее, работа с автоматическим расширением размерностей может приводить к специфическим багам, поэтому понимание механики трансляции критически важно для отладки нейронных сетей .