our_knp/reports/Итоги_и_план.md
2026-10-15 10:48:29 +03:00

12 KiB
Raw Blame History

Итоги и план: спайковые сети KNP / AltAI

15 октября 2026

Цель проекта — распознавание объектов спайковой сетью, которая обучается и работает на KNP/AltAI. MNIST — быстрый полигон, всё найденное на нём переносим на объекты (кошки и собаки, CIFAR-10).

1. Что получилось — главные цифры

Задача Было Стало Как
Цифры, тест MNIST 82,5% (пример KNP) 92–93,5% колонки; 94,7% сеть штрихов разброс стартовых весов, торможение, исправление ошибки в KNP; признаки штрихов + спайковый выход
Цифры, сдвиг на 2 пикселя 64–67% 91,3% признаки штрихов + аугментация + обучение дофамином в KNP
Цифры, обучение целиком в KNP 79,7% колонки на признаках штрихов 94,8% дофамин по ошибке (KNP_DELTA)
Кошки/собаки, свежий тест (600 картинок) 62,5% (HOG + колонки) 67,0% колонки в KNP; 68,3% полностью спайковая цепочка выученные признаки (k-средние), наказание неверных колонок
Кошки/собаки, потолок без спайков ~60% (HOG) 77,2% выученные признаки

Свежий тест у кошек и собак просмотрен один раз. Все остальные цифры по объектам — на проверочной выборке.

2. Что мы узнали

Про сеть колонок (пример mnist-learn)

  1. Это набор трафаретов. 92% на MNIST держатся только на выровненных цифрах: сдвиг на 2 пикселя даёт 64%, утолщение или утончение линии — 75–79%. Поэтому нарисованные в браузере цифры распознаются плохо.
  2. Колонки умеют работать только с разреженным входом. На плотном входе (тысячи спайков на картинку) после STDP веса в основном отрицательные, сумма уходит в минус, и сеть молчит. Так провалились ON/OFF-кодирование «в лоб» и плотные признаки объектов.
  3. Колонки не учатся различать классы. Их учат «похоже на мою цифру», но никогда не учат «не путай с соседней». Наказание неверных колонок дофамином (KNP_COL_PUNISH, оптимум 0,012–0,02) даёт +2…+4 п.п., но потолок остаётся: около 84% на признаках штрихов и около 65% на объектах.
  4. Размер колонки — 20–40 нейронов. 80 нейронов на 30 000 картинках хуже, на полном MNIST — 93,5% (один seed).
  5. Ошибка в KNP: ModelLoader::init_channels иногда подписывал вход картинки на канал меток, и примерно каждое 8–12-е обучение молча ломалось. Исправлено у нас, в апстрим ещё не отправлено.

Про признаки

  1. Для объектов узкое место — признаки, а не классификатор. На HOG даже линейный классификатор даёт около 60%. Признаки, выученные из картинок без меток (кусочки 6×6, 400–1600 узоров, k-средние, пулинг по четвертям), — 77–78%.
  2. Признаки можно выучить нейронным правилом. Соревнование «победитель забирает всё» по одной картинке за раз даёт не хуже пакетного метода: 75,9% против 74,9%. Нормировка контраста (её нейроном не сделать) стоит всего 0,7–1,3 п.п.
  3. Для цифр работают признаки штрихов: 8 направлений × 2 толщины и пулинг по клеткам 4×4. Мелкий пулинг не помогает.

Про обучение выхода

  1. Дофамин по ошибке работает и в симуляторе, и в KNP. Метка даёт «+», собственный спайк нейрона — «−», синапс меняется, когда по нему пришёл спайк. На цифрах в KNP это 94,8%, как у обучения вне чипа (94,9%). На объектах — 65–69% против 74% вне чипа. Разрыв пока не объяснён: диапазон весов и число проходов не помогают.
  2. Технические подводные камни. В KNP дофамин приходит на шаг позже входных спайков (KNP_DELTA_LAG=1 обязателен). Перед переводом в целые веса редкие входы с огромными весами нужно обрезать. Спайковый нейрон-решатель настраивается без подбора порога: смещение вычитает порог.

Про спайковое кодирование

  1. Полностью спайковая цепочка теряет 5–8 п.п. против той же без спайков (77% → 72% на проверочной выборке). Нейрон признака за 10 шагов срабатывает в среднем около одного раза. 20 шагов вместо 10 дают +1,3 п.п.

Про методику

  1. Симулятор (viz/altai_sim.py) совпадает с KNP в пределах 0,1–1%. Удобно подбирать пороги без переобучения.
  2. Тестовые картинки кошек и собак CIFAR исчерпаны. Для новой честной цифры нужен другой набор.
  3. На 1000 проверочных картинках разброс по seed ±1–2 п.п. Выводы по разнице меньше 2 п.п. без нескольких seed ненадёжны.

3. Что есть в репозитории

Что Где
Опции сети: KNP_COL_*, KNP_COL_PUNISH, KNP_DELTA, KNP_W_RANGE, KNP_MNIST_INPUT_SIZE examples/examples/mnist-learn/models/altai/construct_network.cpp (копия для объектов — cats-dogs/source)
Бэкенд с обучением по ошибке readout/build_delta_cpu.py → ~/run/delta-cpu/libknp-cpu-delta-backend.so
Признаки штрихов, выученные признаки features/stroke_features.py, objects/kmeans_features.py
Спайковый выход, точная симуляция цепочки, дофаминовое правило readout/, objects/spiking_pipeline.py, objects/dopamine_readout.py
Данные объектов v3 (9000 обучающих), свежий тест objects/prepare_big.py, objects/final_fresh_test.py
Визуализатор цифр (три сети, сдвиги) viz/app.html, https://claude.ai/artifact/Vc1q1WCZuPY2QAHBSGtrKF
Отчёты и журналы reports/<дата>/ — отчёты и журнал.md каждого дня, оглавление reports/README.md

4. План на неделю: что показать

Предлагаемая история для показа: «Спайковая сеть на KNP, которая сама учится на платформе. На цифрах — 95% и устойчивость к сдвигу, которой у исходного примера не было. На объектах — заметный рост против исходного подхода, а выученные признаки показывают, куда расти дальше». Показ — живое демо в браузере и одна страница с цифрами.

Обязательное (дни 1–4)

День Задача Результат
1 Новый честный тест для объектов. CIFAR-10.1: новый тестовый набор того же формата, около 200 кошек и 200 собак. Прогнать зафиксированные варианты один раз. Цифра, которую можно показывать
1–2 Сократить разрыв в KNP на объектах (69% → 72–74%). Шаг обучения, который уменьшается со временем; несколько нейронов на класс с голосованием; 3 seed на каждый вариант. Лучший вариант, обученный в KNP
2–3 Демо для объектов в браузере. Выбрать или загрузить картинку → карты узоров → спайки → ответ «кошка/собака»; рядом сравнение со старой сетью. Страница для показа
3 Обновить страницу цифр: веса выхода, обученные в KNP дофамином; подпись «обучено на платформе». Демо 2
4 Сводка для показа: одна страница или 5–6 слайдов — что было, что сделали, цифры, ограничения. Прогоны для сводки — минимум 3 seed. Материал для встречи

Желательное (если останется время)

  • Слой признаков, обученный в самом KNP: соревновательные нейроны AltAI со STDP на кусочках картинок. Тогда «всё обучено на платформе» станет буквальным. Риск: большой объём C++ и медленная симуляция 800 × 729 нейронов.
  • Отправить в KasperskyLab/knp исправление ModelLoader и описание режима KNP_DELTA.
  • ON/OFF-вход с нормировкой потока спайков для колонок.

Риски

  • Цифры по объектам на 400–1000 картинках шумят на ±2–4 п.п. На показе давать интервалы, а не одну цифру.
  • Полностью спайковая цепочка проверена в нашем симуляторе, а не в KNP. Слой признаков на 583 тысячи нейронов в KNP пока не запускался.
  • Только цифры дают убедительную историю. Для объектов честный рост — около 5 п.п. от исходного подхода (62,5% → 67–68%).

Что нужно решить

  1. Кому показываем и в каком формате: живое демо, слайды или документ?
  2. Что главное: объекты (честный, но скромный рост) или цифры (сильный результат и устойчивость)? Предлагаю цифры как «доказательство метода» и объекты как «перенос и направление».
  3. Нужна ли буквальная формулировка «всё обучено на платформе»? Тогда в приоритет идёт слой признаков в KNP, а не демо объектов.