Статья Автор: Деникина Н.В., Деникин А.В.

Broadcasting

Прибавить одно и то же всем

Пошёл дождь. Ко всем заказам сразу применяют поправку: объезд плюс километр, на три светофора больше из-за пробок, на двух курьеров меньше, так как часть просто не вышла.

Заказы лежат таблицей: тридцать штук на три признака - тензор размером (30, 3). 30 - количество объектов (батч), у каждого объекта три признака.
Поправка - три числа. То, что прибавляется к каждому заказу (сдвиг).

Можно написать цикл. Но если час пик и заказов не тридцать а тридцать тысяч? 


Что такое broadcasting

Broadcasting - правило, по которому numpy складывает массивы разной формы: меньший мысленно повторяется вдоль недостающих осей, пока формы не совпадут.

Слово «мысленно» здесь ключевое. Копий в памяти не появляется: numpy просто читает одну и ту же строку поправки тридцать раз подряд. Поэтому операция ничего не стоит по памяти, даже если таблица огромная.

Формы выравниваются справа налево. По каждой оси размеры либо совпадают, либо один из них равен единице, либо оси просто нет — тогда её дописывают как единицу.

4261822220604(4, 3)++1+3−2(3,)=55421103518732(4, 3)поправка на дождь прибавилась ко всем заказам

Сравнивай формы справа налево.

Растянуть можно только единицу.



Вывод
(4, 3)
(3,)
[[ 5.  5.  4.]
 [ 2. 11.  0.]
 [ 3.  5. 18.]
 [ 7.  3.  2.]]

Когда не сходится


Вывод
(8, 7, 6)
ошибка: operands could not be broadcast together with shapes (4,3) (4,)

Формы (4, 3) и (4,) не складываются: справа стоят 3 и 4. Это не придирка numpy - он честно не знает, что ты имел в виду.

Если поправка своя у каждого заказа, а не у каждого признака, вектору нужна форма (4, 1). Одна и та же четвёрка чисел, разная форма — разный смысл.

Работает и обратная ловушка. Сложи (3, 1) и (1, 3), ожидая вектор, и получишь матрицу три на три: правило сработало буквально и растянуло обе формы.


Какая форма получится при сложении массивов формы (8, 1, 6) и (7, 6)?

Зачем это нужно на самом деле

Расстояние измеряется в километрах и редко больше десяти. Свободных курьеров бывает и тридцать. Если подать признаки как есть, курьеры перевесят просто потому, что цифры крупнее, а не потому, что важнее.

Поэтому признаки приводят к общей шкале: у каждого вычитают его собственное среднее и делят на его собственный разброс. Это называется Z-нормализацией (стандартизацией, или приведением среднего к нулю и разброса к единице)



Вывод
[ 4. 16.]
[2.23606798 8.94427191]
[[-1.34164079 -1.34164079]
 [-0.4472136  -0.4472136 ]
 [ 0.4472136   0.4472136 ]
 [ 1.34164079  1.34164079]]
[0. 0.]
[1. 1.]

Средние стали нулями, разбросы - единицами. Теперь оба признака говорят одинаково громко, и веса можно сравнивать между собой.

Смещение слоя, вычитание среднего, добавление бонуса - всё это один и тот же приём. Дальше в курсе он будет встречаться постоянно, и отдельно проговариваться уже не будет.

Печать