Micrograd на PHP: какая цифра индекса?

9 палочек шаблона почтового индекса → нейросеть → 10 нейронов-цифр. Весь граф считается классом Value из видео Карпатого, веса лежат в SQLite. Не понятно, что тут происходит? Начните с уроков: каждая часть разобрана отдельно.

1 Вход: палочки

Кликайте по палочкам, чтобы включать и выключать их.

палочки
в сеть  

Нет палочки → −1, есть → +1. Так «пустая» палочка тоже несёт информацию.

2 Сеть

отрицательное около нуля положительное толщина связи = величина · круг = выход нейрона tanh ∈ [−1, 1] · клик по нейрону = под лупу

3 Выход

Сеть думает: ?

Для правильной цифры хотим +1, для остальных −1. loss = Σ (выход − цель)² =

4 Нейрон под лупой:

Это граф Value ровно в том виде, в каком его строит Neuron::__invoke: каждое mul/add/tanh создаёт новый узел. data считается слева направо (forward), ∇ grad справа налево (backward()) от loss текущего примера. Наведите на узел, чтобы увидеть правило.

5 Обучение

эпоха0
loss
угадано
  1. forward все 10 цифр через сеть
  2. loss = среднее Σ(выход − цель)²
  3. zero_grad все grad = 0
  4. backward grad от loss к каждому весу
  5. update w −= lr · ∇w

Нажмите «1 шаг с разбором»: одна эпоха по всем 10 цифрам покажет все пять стадий на схеме сети.

loss по эпохам (лог. шкала)

Как это работает, коротко

  1. Value. Каждое число в сети — объект Value: он хранит data, grad и помнит, из каких узлов и какой операцией получен.
  2. Нейрон считает tanh(b + w₁x₁ + … + wₙxₙ). Слой — это несколько нейронов на одном входе. MLP — слои друг за другом: выход одного слоя становится входом следующего.
  3. Loss — одно число: насколько выходы далеки от цели (+1 у правильной цифры, −1 у остальных). Чем меньше, тем лучше.
  4. backward() обходит граф от loss назад и по цепному правилу для каждого узла считает grad: как изменится loss, если чуть увеличить этот узел. У + градиент проходит как есть, у × умножается на «соседа», у tanh — на (1 − tanh²).
  5. Update: каждый вес сдвигаем против своего градиента: w −= lr · grad. Повторяем много эпох, loss падает, и сеть начинает правильно угадывать цифры. Веса после обучения сохраняются в data/micrograd.sqlite.