alterna ai
ALTERNA AI / ГЛАВА 08 · 03

08.3 Что хранится, а что рассчитывается

На предыдущей странице: ширина и глубина сети.

Веса являются настройками. Промежуточные числа зависят от входа, а градиенты — от ошибки; не будем смешивать эти массивы.

Один слой создаёт промежуточные признаки для следующего. Нелинейность не позволяет свернуть всю последовательность в одну таблицу. Прямые ветви добавляют поправки к прежнему состоянию.

Веса не умножаются на размер batch

Плотный слой содержит n_in·n_out весов и n_out biases. Число активаций после него — B·n_out, но это другой объект. Gradient по матрице весов имеет ту же форму, что и сама матрица.

P=∑ℓ=1L(dℓ−1dℓ+dℓ),shape⁡(∇Wℓ)=shape⁡(Wℓ).P=\sum_{\ell=1}^{L}(d_{\ell-1}d_\ell+d_\ell),\qquad \operatorname{shape}(\nabla W_\ell)=\operatorname{shape}(W_\ell).

Для сети 2→3→2→1 получаем 9,8,3 параметра по слоям, итого20. При batch4 выходы слоёв содержат12,8,4 числа. Фиксированная поэлементная активация сама не добавляет обучаемых параметров.

Под капотом. Двадцать float32-скаляров —80 байт без overhead. Gradient добавляет ещё20 чисел; Adam обычно хранит два moment state для каждого параметра. Кроме этого нужны activations и буферы. В JavaScript Number binary64, поэтому 20×8=160 байт — лишь идеализированный numeric payload, не измерение heap.

Debug. Для X[B,d] и W[h,d] прямое XW несогласовано. Нужны транспонирование или другое объявленное соглашение. Случайный reshape не исправляет семантику и может только скрыть ошибку. Inspector содержит все матрицы, shapes и actual count, вычисленный по массивам.

dims=[2,3,2,1]
counts=[a*b+b for a,b in zip(dims,dims[1:])]
assert counts==[9,8,3] and sum(counts)==20

Код повторяет только что разобранные операции. Полный проверяемыйPython-пример главы доступен отдельным файлом; показанный короткий фрагмент не заменяет его реализацию.

Каждый scalar parameter имеет собственную чувствительность.

С чего начинается обучение. Как этот вопрос продолжает полученный результат?

Python-примеры главы 08 Академическая база →