12 KiB
12 KiB
Итоги и план: спайковые сети 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)
- Это набор трафаретов. 92% на MNIST держатся только на выровненных цифрах: сдвиг на 2 пикселя даёт 64%, утолщение или утончение линии — 75–79%. Поэтому нарисованные в браузере цифры распознаются плохо.
- Колонки умеют работать только с разреженным входом. На плотном входе (тысячи спайков на картинку) после STDP веса в основном отрицательные, сумма уходит в минус, и сеть молчит. Так провалились ON/OFF-кодирование «в лоб» и плотные признаки объектов.
- Колонки не учатся различать классы. Их учат «похоже на мою цифру», но никогда не учат «не путай с соседней». Наказание неверных колонок дофамином (
KNP_COL_PUNISH, оптимум 0,012–0,02) даёт +2…+4 п.п., но потолок остаётся: около 84% на признаках штрихов и около 65% на объектах. - Размер колонки — 20–40 нейронов. 80 нейронов на 30 000 картинках хуже, на полном MNIST — 93,5% (один seed).
- Ошибка в KNP:
ModelLoader::init_channelsиногда подписывал вход картинки на канал меток, и примерно каждое 8–12-е обучение молча ломалось. Исправлено у нас, в апстрим ещё не отправлено.
Про признаки
- Для объектов узкое место — признаки, а не классификатор. На HOG даже линейный классификатор даёт около 60%. Признаки, выученные из картинок без меток (кусочки 6×6, 400–1600 узоров, k-средние, пулинг по четвертям), — 77–78%.
- Признаки можно выучить нейронным правилом. Соревнование «победитель забирает всё» по одной картинке за раз даёт не хуже пакетного метода: 75,9% против 74,9%. Нормировка контраста (её нейроном не сделать) стоит всего 0,7–1,3 п.п.
- Для цифр работают признаки штрихов: 8 направлений × 2 толщины и пулинг по клеткам 4×4. Мелкий пулинг не помогает.
Про обучение выхода
- Дофамин по ошибке работает и в симуляторе, и в KNP. Метка даёт «+», собственный спайк нейрона — «−», синапс меняется, когда по нему пришёл спайк. На цифрах в KNP это 94,8%, как у обучения вне чипа (94,9%). На объектах — 65–69% против 74% вне чипа. Разрыв пока не объяснён: диапазон весов и число проходов не помогают.
- Технические подводные камни. В KNP дофамин приходит на шаг позже входных спайков (
KNP_DELTA_LAG=1обязателен). Перед переводом в целые веса редкие входы с огромными весами нужно обрезать. Спайковый нейрон-решатель настраивается без подбора порога: смещение вычитает порог.
Про спайковое кодирование
- Полностью спайковая цепочка теряет 5–8 п.п. против той же без спайков (77% → 72% на проверочной выборке). Нейрон признака за 10 шагов срабатывает в среднем около одного раза. 20 шагов вместо 10 дают +1,3 п.п.
Про методику
- Симулятор (
viz/altai_sim.py) совпадает с KNP в пределах 0,1–1%. Удобно подбирать пороги без переобучения. - Тестовые картинки кошек и собак CIFAR исчерпаны. Для новой честной цифры нужен другой набор.
- На 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%).
Что нужно решить
- Кому показываем и в каком формате: живое демо, слайды или документ?
- Что главное: объекты (честный, но скромный рост) или цифры (сильный результат и устойчивость)? Предлагаю цифры как «доказательство метода» и объекты как «перенос и направление».
- Нужна ли буквальная формулировка «всё обучено на платформе»? Тогда в приоритет идёт слой признаков в KNP, а не демо объектов.