our_knp/Отчёт_объекты_ночь.md
int ba81f0384b Report: seed variation, neural-rule pipeline, page
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 02:12:58 +03:00

96 lines
13 KiB
Markdown
Raw 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.

# Отчёт: кошки и собаки, ночь 14→15 октября
15 октября 2026
На свежих, ни разу не виденных картинках кошек и собак лучшая сеть, обученная STDP в KNP, даёт 67% вместо прежних 62,5%. Сеть, которая распознаёт полностью на спайках от пикселя до ответа, — 68%. Та же цепочка без спайков даёт 77%: это потолок для выбранных признаков. Главная находка ночи: у прошлой сети слабым местом были признаки, а не обучение.
## Что было не так
- **Цифры и рисунки.** Сеть колонок по сути хранит трафареты. На MNIST это работает (92%), но сдвиг цифры на 2 пикселя роняет точность до 64%, утолщение или утончение линии — до 75–79%. Поэтому нарисованные мышкой цифры распознаются плохо.
- **Кошки и собаки.** На вчерашних HOG-признаках даже простой линейный классификатор даёт около 60%, примерно как колонки STDP. Значит, в HOG просто мало информации, чтобы отличать кошку от собаки, и улучшать классификатор бесполезно.
## Что сделано
**Признаки, выученные из картинок.** Из картинок вырезаются кусочки 6×6, и метод k-средних находит в них 512–800 типичных узоров. Метки при этом не нужны. Это то же правило, что соревновательное обучение «победитель забирает всё»: узор, ближайший к кусочку, сдвигается к нему. Нейрон узора срабатывает, если кусочек похож на узор, и его спайки суммируются по четвертям картинки. Так признаки не зависят от точного положения объекта.
**Больше данных.** Докачано ещё 5000 обучающих картинок из того же источника, теперь их 9000. Плюс к каждой — зеркальная копия.
**Спайковый выход.** Один нейрон «собака минус кошка»: сработал — собака, промолчал — кошка. Веса обучены обычным кодом, а распознавание идёт целиком на целочисленных нейронах AltAI. Проверено точной пошаговой симуляцией: около 670 тысяч спайков слоя признаков на картинку.
**Наказание неверных колонок в STDP** (`KNP_COL_PUNISH`). Когда метка известна, колонки чужих классов получают отрицательный дофамин. KNP такое поддерживает: у недавно сработавших нейронов ослабевают синапсы, которые привели к срабатыванию. Наказание помогло во всех 9 парах прогонов на кошках и собаках и в среднем дало +3,8 п.п. на цифрах. Лучшая сила — 0,012–0,02. Более сильное наказание вредит.
## Результаты на свежем тесте
600 картинок (CIFAR-10, тестовые 700–999 каждого класса), которые раньше нигде не использовались. Все настройки выбраны по проверочной выборке заранее, тест просмотрен один раз.
| Сеть | Обучение | Свежий тест |
| --- | --- | --- |
| Вчерашняя: HOG + колонки STDP | STDP в KNP | 62,5% |
| Выученные признаки + колонки STDP с наказанием | STDP в KNP | **67,0%** |
| Полностью спайковая: выученные признаки + нейрон «собака − кошка» | выход обучен вне чипа | **68,3%** |
| Те же признаки, без спайков | вне чипа | 76,5% |
| Признаки с нормировкой контраста, без спайков | вне чипа | 77,2% |
Погрешность при 600 картинках около ±3,7 п.п. Прибавка к вчерашней сети на пределе погрешности, но в одну сторону у обоих спайковых вариантов.
Разброс по 4 seed на проверочной выборке: выученные признаки + колонки STDP — 64,0% ± 0,6 (63,4–64,7), вчерашняя сеть — 62,1% ± 1,2 (60,3–62,9). Колонки на новых признаках устойчиво лучше, но всего на ~2 п.п. На свежем тесте разница вышла больше, по-видимому, отчасти случайно.
## Где теряется точность
1. **Нормировка контраста:** −0,7 п.п. Её нельзя сделать одним нейроном, но потеря небольшая.
2. **Спайки слоя признаков и выхода:** −8 п.п. Нейрон признака за картинку срабатывает в среднем около одного раза, и тонкие различия в силе признака теряются. Понижение порога не помогло.
3. **Колонки STDP вместо обученного выхода:** колонки умеют работать только с разреженным входом (256 самых сильных признаков из 2048). На полном входе они молчат: после STDP веса в основном отрицательные, и сумма уходит в минус. Разреживание само стоит около 8 п.п.
## Цифры: те же приёмы
Признаки штрихов (8 направлений, 2 толщины, пулинг по клеткам 4×4) со спайковым выходом. Проверочная выборка MNIST:
| Сеть | Как есть | Сдвиг 2 px | Толще | Тоньше |
| --- | --- | --- | --- | --- |
| Лучшие колонки на пикселях | 91,9% | 66,6% | 80,8% | 80,2% |
| Штрихи + спайковый выход, обучение со сдвигами и поворотами | **95,1%** | **89,9%** | **91,1%** | 74,6% |
Колонки STDP на тех же признаках дают только 79–84%: признаки плотные, а колонки умеют только сравнивать с трафаретом.
Колонки по 80 нейронов на полном MNIST — 93,5% на тесте, лучший результат на пикселях (один seed). Кодирование ON/OFF «в лоб» не работает: спайков на входе становится втрое больше, и сеть молчит. Нужно нормировать поток спайков.
## Всё обучение — нейронными правилами (продолжение ночи)
Проверено в симуляторе на проверочной выборке:
- **Слой признаков, обученный по-нейронному.** Картинки идут по одной, побеждает самый похожий нейрон, и только его веса сдвигаются к кусочку. Это аналог STDP с торможением «победитель забирает всё». Признаки получаются не хуже пакетного метода: 72,9% против 71,8% при одинаковом выходе.
- **Выход, обученный локальным правилом с дофамином.** Синапс меняется на «ошибка × число пришедших спайков». Ошибку переносит сигнал дофамина со знаком, а сам дофамин в KNP уже есть. Результат **69,4–69,8%**, на 3 п.п. ниже, чем у гребневой регрессии. Это лучше колонок STDP (64%).
- **Нейрон-решатель без подбора порога.** Смещение нейрона сдвинуто так, что «потенциал дошёл до порога» означает «сумма больше нуля». Результат не зависит от порога.
- **Больше шагов на картинку** (20 вместо 10) — +1,3 п.п.: 72,9% вместо 71,6%.
## Цифры на странице
На странице https://claude.ai/artifact/Vc1q1WCZuPY2QAHBSGtrKF появилась панель «4 · Сеть штрихов»: 16 карт штрихов, спайки 10 выходных нейронов и ответ. На тесте MNIST эта сеть даёт 94,7%, колонки — 92,2%. Сеть входит в строку «Итог всех сетей», так что её можно сравнивать на своих рисунках и сдвигах. Расчёт в браузере сверен с Python: на 105 картинках ответы совпали.
## Ограничения
- Слой признаков учится методом k-средних в обычном коде. Правило совпадает с соревновательным обучением на нейронах, но на модели AltAI в KNP он пока не обучался.
- Спайковая цепочка проверена в собственном точном симуляторе с правилами нейрона AltAI (порог, сброс в 0, потенциал не ниже 0, целые веса), а не в KNP. Слой признаков — 800 × 729 нейронов.
- Все тестовые картинки кошек и собак CIFAR теперь использованы. Для новой честной оценки нужен другой набор.
- Один seed на вариант.
## Что дальше
1. Перенести в KNP оба нейронных правила, проверенных в симуляторе: соревновательный слой признаков и выход с дофамином по ошибке.
2. Сократить потерю на спайках: дать нейрону признака больше спайков на картинку или использовать время первого спайка.
3. Научить колонки STDP работать с плотными признаками, а не только с разреженными: например, вычитать среднее перед подачей или добавить тормозящий вход.
4. Перенести спайковую цепочку признаков на страницу визуализатора.
## Файлы
| Файл | Что это |
| --- | --- |
| `objects/kmeans_features.py` | Выученные признаки (узоры 6×6, k-средние, пулинг) |
| `objects/spiking_pipeline.py` | Точная пошаговая симуляция пиксели → слой признаков → выходной нейрон |
| `objects/make_knp_features.py`, `objects/grid_v3.sh` | Входы для KNP и перебор порогов и наказания |
| `objects/final_fresh_test.py`, `objects/prepare_fresh_knp.py` | Однократная проверка на свежем тесте |
| `readout/spiking_readout.py`, `readout/robustness.py` | Спайковый выход и проверка устойчивости (цифры) |
| `features/stroke_features.py` | Признаки штрихов для цифр |
| `augment/` | Аугментация, голосование сдвигами, перезапуск прогонов |
| `examples/.../models/altai/construct_network.cpp`, `cats-dogs/source/...` | `KNP_COL_PUNISH` — наказание неверных колонок |
| `changes-2026-10-14.md` | Подробный журнал с командами и всеми цифрами |