Эндрю Ын: Математика и реализация механизма Broadcasting в Python

DeepLearning.AI 93,2 тыс. 11 мин 3 мин 25.08.2017
Главное

В современном программировании для машинного обучения скорость выполнения кода часто становится критическим фактором. Эндрю Ын, сооснователь DeepLearning.AI, в рамках своего обучающего курса подробно разбирает механизм Broadcasting (трансляцию) в языке Python — мощный инструмент библиотеки NumPy, позволяющий проводить вычисления над массивами разных размерностей без использования медленных циклов for .

🍎 Практическая мотивация: расчет калорийности продуктов 0:13

Для иллюстрации работы трансляции Эндрю Ын приводит пример из диетологии . Представим матрицу данных, где строки — это содержание углеводов, белков и жиров, а столбцы — четыре различных продукта питания (яблоки, говядина, яйца и картофель) в расчете на 100 граммов:

Задача разработчика — вычислить процентное соотношение калорий из углеводов, белков и жиров для каждого продукта в отдельности. Для этого необходимо сначала просуммировать значения в каждом столбце, чтобы получить общую калорийность 100 граммов продукта (например, для яблок это будет 56 + 1.2 + 1.8 = 59 калорий), а затем разделить каждое значение в столбце на эту общую сумму .

В традиционном программировании это потребовало бы явного цикла по столбцам, однако Python позволяет выполнить эту операцию эффективнее .

💻 Техническая реализация в NumPy 2:41

Для решения задачи в среде Jupyter Notebook Эндрю Ын использует всего две строки кода на Python после инициализации исходной матрицы A (размером 3x4) :

  1. cal = A.sum(axis=0) — расчет суммы по вертикали .
  2. 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 обрабатывает арифметические операции (сложение, вычитание, умножение, деление) между матрицами и векторами несовпадающих размеров .

Основные сценарии работы трансляции:

Общее правило гласит: если у вас есть матрица размерности $(m, n)$ и вы выполняете операцию с вектором $(1, n)$ или $(m, 1)$, этот вектор будет автоматически расширен (транслирован) до размера $(m, n)$ для выполнения поэлементного вычисления .

🛠 Советы для опытных разработчиков 10:01

Для тех, кто ранее программировал на MATLAB или Octave, Эндрю Ын проводит аналогию: механизм трансляции в Python выполняет те же функции, что и известная функция bsxfun в этих языках . Однако для новичков в глубоком обучении это знание не является обязательным.

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

💬 Цитаты

«Операция reshape выполняется за константное время O(1). Это очень дешево, поэтому не бойтесь использовать её часто.»

«Трансляция позволит вам не только ускорить выполнение кода, но и добиться желаемого результата меньшим количеством строк.»

👥 Спикер
🔗 Упомянутые сайты и проекты
📖 Термины
Broadcasting (Трансляция)
Метод в NumPy, позволяющий проводить арифметические операции над массивами разных, но совместимых форм.
Векторизация
Процесс замены явных циклов в коде на матричные операции для ускорения вычислений.
axis=0
Параметр в функциях NumPy, указывающий на выполнение операции вдоль вертикальной оси (по столбцам).
Reshape
Изменение формы (размерности) массива без изменения его данных.
📊 Цифры
⚖️ Другая сторона
Искусственный интеллект Python NumPy Broadcasting Эндрю Ын DeepLearning.AI