our_knp/reports/2026-10-15/Отчёт_MNIST_fast.md

8.2 KiB
Raw Permalink Blame History

Новая быстрая модель для рисования цифр — 15 октября 2026

Результат

Сайт: http://10.9.8.230:8080/fast_viz.html. На старых altai_viz.html и aug_viz.html добавлена видимая ссылка; прежние модели и симуляция сохранены.

На официальном MNIST test новая модель распознала 9830/10000 = 98.30%, против9223/10000=92,23% у отдельно проверенного штатного KNP-примера. Проверены те же10 000 изображений и метки; новая модель имеет другую архитектуру и подготовку данных. Это сравнение качества моделей, а не улучшение/ускорение существующего KNP backend. Ошибок новой модели170 вместо777. Цифра3 на пользовательском скриншоте (official test index2534) теперь распознана как3. Она была известна как регрессионный пример и не использовалась для обучения/выбора параметров.

Что именно является спайковой сетью

Вход:784 токовых значения пикселей. Скрытый слой:256 integer integrate-and-fire нейронов. На каждом из128 конечных шагов каждый нейрон накапливает постоянный ток; при достижении порога испускает один спайк и вычитает порог. Числа спайков идут в линейный аналоговый readout на10 классов. Это гибридная IF-сеть; не вся сеть спайковая. Состояния обнуляются для каждого изображения.

JS действительно выполняет все конечные IF-шаги. Python использует математически эквивалентный floor(T*drive/threshold) для счётчика; равенство проверено независимой реализацией браузера. Integer веса и токи хранятся в безопасном диапазоне точной JS Number арифметики. scale4096, hidden cap4, threshold4177920; weights1 и weights2 int16, bias1/bias2 int32.

Модель обучена offline: MLP784→256→10 с clipped ReLU, Adam и surrogate gradient через квантование активностей к spike counts после двух стартовых эпох. Это неSTDP. Работа новой модели в KNP, наGPU или физическом AltAI не проверена; сайт честно сообщает это. Никакие прежние CUDA/транспортные модели не менялись.

Разделение данных и выбор

Взяты ранее побайтно проверенные канонические MNIST train60000/test10000. Train случайно разделён с seed20261015 на55000 обучения и5000 validation; индексы сохранены в split.npz. Для нового обучения используется только train55000. Аугментации только в train: сдвиг±2px, утолщение/утоньшение крестом радиуса1 по10% образцов. Нормализация bbox по пикселям>16 в рамку20px с bilinear resize и целочисленным сдвигом центра массы к13.5; одинаковый алгоритм Python/JS.

20 эпох, batches256, Adam beta.9/.999, L2.00005, learning rate.001, умножение на.35 на эпохах13 и18. Checkpoint выбран по validation при64 шагах: эпоха17, точность98.54%. Затем число шагов выбрано только по validation: [{"steps": 32, "accuracy": 0.9846}, {"steps": 64, "accuracy": 0.9854}, {"steps": 128, "accuracy": 0.9856}]; зафиксированы128 шагов. После фиксации test оценён один раз и не использовался для тюнинга. train/validation/test provenance и SHA256 сохранены; test gallery — только демонстрация.

Устойчивость и пределы

После выбора модели выполнен заранее фиксированный stress на тех же test-картинках, без последующего подбора:

  • Сдвиг нормализованной картинки вправо2px:97,74%.
  • Утолщение крестом радиуса1:96,85%.
  • Утоньшение крестом радиуса1:91,41%.

Утоньшение заметно ухудшает качество; не выдавать98,30% за гарантию для любого рисунка. Stress применяется после нормализации, без повторной нормализации; это отдельный контроль представления. Полная confusion matrix и все покартинковые ответы сохранены. Очень редкий/непривычный почерк всё ещё может ошибаться. Пустой холст UI распознавать не пытается.

Проверка браузера и скорость

Chromium headless/CDP:85 фиксированных raw MNIST примеров, включая2534 и псевдослучайные test-индексы seed444. Для каждого точно совпали все784 байта нормализации,256IFcounts,10выходныхscores и prediction между Python и реальным JS128шагов. В browser-check.json записаны:

  • Gallery2534→3, blank→«—» и отсутствие top scores.
  • Настоящие CDP mouse и touch события нарисовали1; оба распознаны как1.
  • Mobile390px без горизонтальногоoverflow.
  • Очистка остаётся пустой после ожидания debounce150ms.
  • JavaScript exceptions:0.

Для нормализованной настоящей test-картинки2534 после20 прогревов,100 повторов: медиана 0.500мс, p95 1.100мс. Измерен только simulate(), без canvas-нормализации/DOM; это локальный headless Chromium на машине ассистента, не пользовательский компьютер. UI показывает локальную фактическую задержку каждого распознавания. Обучение заняло11.537с wall по сохранённому логу; это NumPyCPU, не CUDA.

Пути и запуск

  • Репозиторий: /home/user/KNP/mnist-fast/{model_core.py,train_fast.py,make_parity.py,browser_check.py,README.md}.
  • Веб: /home/user/KNP/viz/fast_viz.html, fast-model.js, fast-model.json, fast-gallery.json.
  • Runtime: /home/user/run/mnist-fast; best.npz, split.npz, normalized.npy, history.json, selection.json, metrics.json, test_results.npz, provenance.json, model.json, gallery.json.
  • Проверки: parity-cases.json, browser-check.json, fast-viz-desktop.png, fast-viz-mobile.png, browser-check.log.
  • Сервер прежний PID58749: /home/user/run/mnist-viz/server.py, порт8080, каталогviz, UTF8. Новый сервис не запускался, перезагрузка сервера не нужна.

Команда обучения и предупреждение о перезаписи runtime — в mnist-fast/README.md. Все скрипты, обученные веса, индексы и метрики сохраняются; сырыеMNIST уже сохранены отдельным опытом. После обучения зафиксирован source-sha256.json; архив артефактов и локальная копия отчёта сохраняются отдельно. Commit/push не выполнялись.