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

84 lines
12 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.

# Итоги и план: спайковые сети 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, а не демо объектов.