# Отчёт: кошки и собаки, ночь 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` | Подробный журнал с командами и всеми цифрами |