Слой нейросети - это матрица весов
Слой нейросети - это несколько нейронов, которые:
- смотрят на одни и те же признаки (например, расстояние, число курьеров, время суток),
- но у каждого нейрона свои веса и своё смещение.
Матрица весов
Если:
- входов (признаков) — \(n\),
- нейронов в слое — \(m\),
то веса записывают в матрицу \(W\) размера \((n \times m)\):
- строки — признаки,
- столбцы — нейроны.
Смещения — вектор \(\mathbf{b}\) длины \(m\): по одному числу на нейрон.
Как считается выход
Данные: \(X\) — батч примеров, форма \((\text{примеры}, \text{входы})\).
\[ Y = XW + \mathbf{b} \]
Пример:
\[ X: (4, 3) \quad @ \quad W: (3, 2) \quad = \quad Y: (4, 2) \]
- Внутренние числа (3 и 3) должны совпасть — иначе умножение невозможно.
- Внешние числа (4 и 2) дают форму результата: 4 примера, 2 нейрона.
Смещение
Вектор \(\mathbf{b}\) длины \(m\) добавляется ко всем примерам сразу (broadcasting): к каждой строке \(Y\) прибаляется один и тот же вектор смещений.
Почему важен порядок осей
Правильно:
\[ W: (\text{входы}, \text{нейроны}) \]
Если перепутать и записать \((\text{нейроны}, \text{входы})\):
- либо формы не сойдутся,
- либо, если случайно сойдутся, модель будет считать «не то » и учиться на неверной структуре.
Батч не меняет веса
\(W\) и \(\mathbf{b}\) - это правило, а не данные:
- один пример или тридцать тысяч - веса те же,
- меняется только вход \(X\) и выход \(Y\).
Слой - несколько нейронов, которые смотрят на одни и те же признаки, но каждый со своими весами. Веса всего слоя складывают в матрицу: один столбец на нейрон.
X имеет форму (примеры, входы). W - форму (входы, нейроны). Результат - (примеры, нейроны).
Внутренние размеры должны совпасть. Это не формальность: третье число примера обязано встретиться с третьей строкой весов, иначе перемножатся не те пары.
Смещение - вектор длины «число нейронов», по одному базовому уровню на прогноз. Прибавляется broadcasting-ом из прошлой пары ко всем строкам сразу.
Порядок осей в W важен: (входы, нейроны), а не наоборот. Записав наоборот, ты либо получишь несовпадение форм, либо, если размеры случайно сойдутся, тихо посчитаешь чушь.
Батч не меняет веса. Подашь один заказ или тридцать тысяч - W и b те же самые. Они описывают правило, а не данные, и в этом вся идея: правило одно, применяется ко всем.
@ — это оператор матричного умножения (matmul).
Он появился в Python 3.5 специально для того, чтобы отличать матричное умножение от обычного поэлементного умножения (которое делается через *)