Слой — это матрица весов
Слой — несколько нейронов, которые смотрят на одни и те же признаки, но каждый со своими весами. Веса всего слоя складывают в матрицу: один столбец на нейрон.
X имеет форму (примеры, входы). W — форму (входы, нейроны). Результат — (примеры, нейроны).
Что стоит за одной клеткой
Возьмём первый заказ — 4 км, 2 светофора, 6 свободных курьеров — и первый нейрон, который предсказывает время в дороге.
| 4 × 3 | = | 12 |
| 2 × 1.5 | = | 3 |
| 6 × (−0.5) | = | −3 |
| сумма | = | 12 |
| плюс смещение первого нейрона | = | 20 |
Это в точности расчёт из пары 3, ни одной новой операции. Мы взяли строку таблицы заказов и столбец матрицы весов, перемножили их поэлементно и сложили — то есть посчитали их скалярное произведение.
Так устроена каждая клетка результата. Клетка на пересечении строки i и столбца j — это скалярное произведение i-го заказа на веса j-го нейрона плюс смещение этого нейрона.
Отсюда и форма результата: строк столько, сколько заказов, столбцов — сколько нейронов. И отсюда же требование к внутренним размерам: длина строки заказа обязана совпасть с высотой столбца весов, иначе перемножать нечего.
Матричное умножение — это все скалярные произведения сразу. Каждая строка левой матрицы против каждого столбца правой.
Смещение — вектор длины «число нейронов», по одному базовому уровню на прогноз. Прибавляется broadcasting-ом из прошлой пары ко всем строкам сразу.
Порядок осей в W важен: (входы, нейроны), а не наоборот. Записав наоборот, ты либо получишь несовпадение форм, либо, если размеры случайно сойдутся, тихо посчитаешь чушь.
Батч не меняет веса. Подашь один заказ или тридцать тысяч — W и b те же самые. Они описывают правило, а не данные, и в этом вся идея: правило одно, применяется ко всем.