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

Операции с тензорами

Поправка, которую надо применить ко всем заказам

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

Заказов тридцать. Поправка одна и та же для всех.

Сложение тензоров одинаковой формы

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

Для таблиц формы (2, 3):

Таблица 3. Сложение двух таблиц одинаковой формы

первый столбецвторойтретий
строка 0, слева426
строка 0, справа21−3
строка 0, сумма633

Читаем по столбцам сверху вниз: третья строка получается сложением первых двух в той же клетке. Никакой хитрости здесь нет.

Умножение на число и поэлементные операции

Кроме сложения, над тензорами определены и остальные привычные действия, и все они работают поэлементно.

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

Умножение на число умножает каждую клетку. Первая строка таблицы 2 — это 4, 2, 6; после умножения на два получится 8, 4, 12.

Два тензора одинаковой формы можно не только сложить, но и вычесть, перемножить и поделить друг на друга — и всё это клетка с клеткой.

Таблица 4. Поэлементное умножение признаков на веса

расстояниесветофорыкурьеры
признаки нулевого заказа426
веса31.5−0.5
произведение поэлементно123−3

Читаем по столбцам сверху вниз: третья строка получается умножением первых двух в той же клетке. Обратите внимание на третий столбец: там минус, потому что вес отрицательный.

А теперь сложите три числа из нижней строки: 12 + 3 − 3 = 12. Это и есть заготовка для раздела 4: поэлементное умножение, а затем сумма всех клеток — и получается ровно то, что нужно для предсказания.


клетка умножается на клеткупризнаки426веса31.5−0.5результат123−3сложите три числа снизу: 12 + 3 − 3 = 12 — это уже заготовка для нейрона

Поэлементное умножение — не матричное

Здесь надо развести два разных действия, которые в программах записываются похоже и путаются постоянно.

Знаком * записывается поэлементное умножение: клетка с клеткой, результат той же формы.

Знаком @ записывается матричное умножение — совсем другая операция. Она появится в разделе 5, когда для неё возникнет нужда, и результат у неё, как правило, другой формы.

Насколько это разные вещи, видно на двух таблицах формы (2, 2). Возьмём левую с числами 1, 2 в первой строке и 3, 4 во второй, правую — с числами 5, 6 и 7, 8.

Таблица 5. Два разных умножения одних и тех же таблиц

действиепервая строка результатавторая строка
поэлементно, *5, 1221, 32
матрично, @19, 2243, 50

Сравниваем строки: формы результатов совпали, а числа разные все до единого. Первая строка получена умножением клетка на клетку: 1·5 = 5, 2·6 = 12. Откуда взялись 19 и 22 во второй строке, разбирается в разделе 5.


формы результата совпали, а числа разные все до единого1234и5678поэлементно *5122132матрично @192243501·5 = 5, 2·6 = 121·5 + 2·7 = 19

Почему дождевая поправка так не складывается

С дождевой поправкой поэлементное сложение не выйдет. У нас тридцать заказов по три признака, форма (30, 3), а поправка — три числа, форма (3,). Формы разные, и складывать клетка с клеткой нечего.

Broadcasting

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

Слово «мысленно» здесь существенное. Библиотека не обязана создавать тридцать настоящих копий строки: как правило, она читает одну и ту же строку поправки тридцать раз подряд. Поэтому растяжение обходится дёшево и на тридцати тысячах заказов тоже.

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


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

Проверим на нашем случае. Справа у (30, 3) стоит тройка, у (3,) тоже тройка — совпали. Слева у поправки оси нет, дописываем единицу, она растягивается до тридцати. Складывается.

Формы сравниваются справа налево. Растянуть можно только единицу.

Когда формы не сходятся

Формы (4, 3) и (4,) не складываются: справа стоят тройка и четвёрка, они не равны и ни одна не единица.

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

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

Сумма и среднее по оси

Часто нужно свернуть таблицу в несколько чисел: например, узнать среднее расстояние по всем заказам. Для этого у операций суммы и среднего указывают, по какой оси их считать.

Номер оси — это номер того места в форме, которое исчезает. У таблицы 2 форма (4, 3). Свернём по нулевой оси — исчезнет четвёрка, останутся три числа, по одному на признак. Свернём по первой — исчезнет тройка, останутся четыре числа, по одному на заказ.

Таблица 6. Суммы таблицы 2 по разным осям

по какой осичто исчезаетрезультатчто означает
нулевая, axis=0заказы13, 12, 32всего километров, всего светофоров, всего курьеров
первая, axis=1признаки12, 11, 24, 10сумма трёх признаков каждого заказа

Читаем построчно. Верхняя строка складывает столбцы: 4 + 1 + 2 + 6 = 13 километров по всем четырём заказам. Нижняя складывает строки: 4 + 2 + 6 = 12 для нулевого заказа. Второй результат бессмысленен по существу — километры складываются со светофорами, — и приведён только чтобы видеть разницу.

Осмысленна здесь верхняя строка. Среднее по нулевой оси даёт 3.25 километра, 3 светофора и 8 свободных курьеров на заказ. Именно такие числа и понадобятся дальше.


ось, по которой сворачивают, из формы исчезает4261822220604(4, 3)axis=0axis=112112410(4,)131232(3,)

Ось, по которой сворачивают, из формы исчезает.

Признаки разного масштаба

Посмотрите на таблицу 2 ещё раз. Расстояние там от одного до шести, а свободных курьеров бывает и двадцать. В настоящих данных разрыв больше: километров редко больше двенадцати, а курьеров в центре города — до тридцати.

Пока мы задаём веса сами, это не мешает. Но начиная с главы 2 веса будет подбирать вычисление, и признак с крупными числами будет перетягивать подбор на себя — не потому, что он важнее, а только потому, что цифры у него больше.

Поэтому признаки приводят к общей шкале.

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

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

Возьмём таблицу из четырёх заказов с двумя признаками: расстояние в километрах и число свободных курьеров.

Таблица 7. Нормализация двух признаков

заказкмкурьеровкм послекурьеров после
014−1.342−1.342
1312−0.447−0.447
25200.4470.447
37281.3421.342

Смотрим на два левых столбца: средние в них 4 и 16, разбросы 2.236 и 8.944, то есть второй признак крупнее первого вчетверо. В двух правых столбцах числа совпадают строка за строкой. Так и должно быть: оба признака росли одинаково, шагом, и после приведения к общей шкале разница в единицах измерения исчезла.

Считается это двумя строками и без единого цикла: среднее и разброс берутся по нулевой оси, то есть по столбцам, а вычитание и деление применяются ко всей таблице сразу за счёт broadcasting.

Вес и важность признака — не одно и то же. Здесь видно, почему. Если мерить расстояние не в километрах, а в метрах, вес придётся изменить с 3 на 0.003, то есть в тысячу раз, а влияние признака останется прежним: 4 километра при весе 3 и 4000 метров при весе 0.003 дают одни и те же 12 минут. Сравнивать веса между собой как важность допустимо только после приведения признаков к общей шкале.


Программа посчитала X * W вместо X @ W. Форма результата совпала с ожидаемой. Возможно ли такое?


Реши практическую задачу

Загрузка...
Чтобы оставить комментарий, необходимо авторизоваться
💬
Пока нет комментариев. Будьте первым!
Печать