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 иногда срабатывает не так, как ожидалось.