Broadcasting и формы

Урок про broadcasting — механизм, который позволяет складывать и умножать тензоры разной формы.

Broadcasting — это автоматическое «растягивание» меньшего тензора до формы большего, чтобы поэлементная операция стала возможной без явного копирования данных.

Постоянная задача: прибавить вектор смещения (bias) к матрице активаций или умножить все элементы на одно число. Без broadcasting пришлось бы вручную дублировать данные. TF (как и NumPy) делает это сам по понятным правилам.

Правило совместимости

Формы сравнивают справа налево. Размерности совместимы, если они равны или одна из них равна 1 (тогда она «растягивается»).

Форма AФорма BРезультат
(3, 4)(4,)(3, 4) — B растянут по строкам
(3, 1)(1, 4)(3, 4) — обе оси растянуты
(3, 4)(3,)ошибка — 4 и 3 несовместимы

Имитация broadcasting на Python

Прибавим вектор-смещение к каждой строке матрицы вручную — именно это TF делает за вас. Код запускается:

matrix = [[1, 2, 3], [4, 5, 6]]
bias = [10, 20, 30]

result = [[matrix[i][j] + bias[j] for j in range(3)] for i in range(2)]
print(result)

Вывод:

[[11, 22, 33], [14, 25, 36]]

Вектор bias формы (3,) как бы «скопировался» на каждую из двух строк — это и есть broadcasting.

То же в TensorFlow

В TF записывается коротко (требует TF):

import tensorflow as tf

matrix = tf.constant([[1, 2, 3], [4, 5, 6]])
bias = tf.constant([10, 20, 30])

print(matrix + bias)  # broadcasting: (2,3) + (3,) -> (2,3)
print(matrix * 2)     # скаляр растянут на весь тензор

Как работает под капотом

Broadcasting не копирует данные физически — TF просто «делает вид», что меньший тензор повторён, обращаясь к одним и тем же числам с шагом 0 по растянутой оси. Это экономит память: добавить bias к батчу из тысячи примеров не создаёт тысячу копий вектора. Именно так линейный слой Dense прибавляет смещение ко всем примерам батча сразу.

Частые ошибки

  • Складывать несовместимые формы. Если размерности не равны и ни одна не равна 1, будет ошибка формы.
  • Забыть ось. Иногда нужно явно добавить ось (tf.expand_dims), чтобы формы стали совместимы.
  • Молча получить не тот результат. Broadcasting может «сработать» неожиданно и дать тензор не той формы — всегда проверяйте .shape результата.

Итог

  • Broadcasting растягивает меньший тензор до формы большего без копирования данных.
  • Формы совместимы, если справа налево размерности равны или одна из них равна 1.
  • Так слой Dense прибавляет bias ко всему батчу одной операцией.
  • Всегда проверяйте форму результата — broadcasting иногда срабатывает не так, как ожидалось.
Проверьте себя
1. Когда две размерности совместимы для broadcasting?
AКогда они равны или одна из них равна 1
BТолько когда они равны
CКогда их сумма чётна
DВсегда совместимы
2. Зачем broadcasting нужен в слое Dense?
AЧтобы менять активацию
BЧтобы прибавить вектор bias ко всем примерам батча сразу
CЧтобы перемешать данные
DЧтобы уменьшить число слоёв