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

51 lines
8.2 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Новая быстрая модель для рисования цифр — 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 не выполнялись.