84 lines
12 KiB
Markdown
84 lines
12 KiB
Markdown
# Итоги и план: спайковые сети 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-е обучение молча ломалось. Исправлено у нас, в апстрим ещё не отправлено.
|
||
|
||
### Про признаки
|
||
6. **Для объектов узкое место — признаки, а не классификатор.** На HOG даже линейный классификатор даёт около 60%. Признаки, выученные из картинок без меток (кусочки 6×6, 400–1600 узоров, k-средние, пулинг по четвертям), — 77–78%.
|
||
7. **Признаки можно выучить нейронным правилом.** Соревнование «победитель забирает всё» по одной картинке за раз даёт не хуже пакетного метода: 75,9% против 74,9%. Нормировка контраста (её нейроном не сделать) стоит всего 0,7–1,3 п.п.
|
||
8. **Для цифр** работают признаки штрихов: 8 направлений × 2 толщины и пулинг по клеткам 4×4. Мелкий пулинг не помогает.
|
||
|
||
### Про обучение выхода
|
||
9. **Дофамин по ошибке** работает и в симуляторе, и в KNP. Метка даёт «+», собственный спайк нейрона — «−», синапс меняется, когда по нему пришёл спайк. На цифрах в KNP это 94,8%, как у обучения вне чипа (94,9%). На объектах — 65–69% против 74% вне чипа. Разрыв пока не объяснён: диапазон весов и число проходов не помогают.
|
||
10. **Технические подводные камни.** В KNP дофамин приходит на шаг позже входных спайков (`KNP_DELTA_LAG=1` обязателен). Перед переводом в целые веса редкие входы с огромными весами нужно обрезать. Спайковый нейрон-решатель настраивается без подбора порога: смещение вычитает порог.
|
||
|
||
### Про спайковое кодирование
|
||
11. **Полностью спайковая цепочка теряет 5–8 п.п.** против той же без спайков (77% → 72% на проверочной выборке). Нейрон признака за 10 шагов срабатывает в среднем около одного раза. 20 шагов вместо 10 дают +1,3 п.п.
|
||
|
||
### Про методику
|
||
12. Симулятор (`viz/altai_sim.py`) совпадает с KNP в пределах 0,1–1%. Удобно подбирать пороги без переобучения.
|
||
13. Тестовые картинки кошек и собак CIFAR исчерпаны. Для новой честной цифры нужен другой набор.
|
||
14. На 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, а не демо объектов.
|