diff --git a/Отчёт_объекты_ночь.md b/Отчёт_объекты_ночь.md new file mode 100644 index 0000000..d3effcc --- /dev/null +++ b/Отчёт_объекты_ночь.md @@ -0,0 +1,81 @@ +# Отчёт: кошки и собаки, ночь 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 п.п. Прибавка к вчерашней сети на пределе погрешности, но в одну сторону у обоих спайковых вариантов. + +## Где теряется точность + +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 «в лоб» не работает: спайков на входе становится втрое больше, и сеть молчит. Нужно нормировать поток спайков. + +## Ограничения + +- Слой признаков учится методом k-средних в обычном коде. Правило совпадает с соревновательным обучением на нейронах, но на модели AltAI в KNP он пока не обучался. +- Спайковая цепочка проверена в собственном точном симуляторе с правилами нейрона AltAI (порог, сброс в 0, потенциал не ниже 0, целые веса), а не в KNP. Слой признаков — 800 × 729 нейронов. +- Все тестовые картинки кошек и собак CIFAR теперь использованы. Для новой честной оценки нужен другой набор. +- Один seed на вариант. + +## Что дальше + +1. Обучить слой признаков в самом KNP: соревновательные нейроны AltAI с STDP на кусочках картинок. +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` | Подробный журнал с командами и всеми цифрами |