our_knp/Отчёт_объекты_ночь.md
int 6bfdbf69d3 Delta-rule KNP: augmented MNIST robustness, object runs; report section
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 06:50:34 +03:00

15 KiB
Raw Blame History

Отчёт: кошки и собаки, ночь 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% при 800 узорах и 71,6% при 1600, на 2–3 п.п. ниже, чем у гребневой регрессии. Это лучше колонок STDP (64%).
  • Нейрон-решатель без подбора порога. Смещение нейрона сдвинуто так, что «потенциал дошёл до порога» означает «сумма больше нуля». Результат не зависит от порога.
  • Больше шагов на картинку (20 вместо 10) — +1,3 п.п.: 72,9% вместо 71,6%.

Обучение по ошибке прямо в KNP (утро 15 октября)

В KNP добавлен режим KNP_DELTA. Метка даёт нейрону своего класса положительный дофамин на каждом шаге, а собственный спайк нейрона даёт ему отрицательный. Дофамин получается равным «цель минус ответ», то есть это правило перцептрона на нейронах. Для него понадобилась отдельная копия бэкенда, readout/build_delta_cpu.py: в ней синапс меняется на величину дофамина, если по нему только что пришёл спайк, даже когда сам нейрон молчал. Оригинальные библиотеки не менялись.

Задача (проверочная выборка) Колонки STDP Дофамин по ошибке в KNP Выход, обученный вне чипа
Цифры, признаки штрихов, 30 000 83,5% (200 нейронов) 94,8% (10 нейронов) 94,9%
Цифры, то же + аугментация, 90 000 — 94,6%; сдвиг 2 px 91,3% 95,1%; сдвиг 89,9%
Кошки/собаки, выученные признаки 64–65% (на плотных молчат) 65–69% 74% (без спайков)

На цифрах обучение внутри платформы догнало обучение вне чипа и дало самую устойчивую сеть за всё время. На объектах выигрыш у колонок небольшой. Разрыв с 74%, скорее всего, из-за диапазона весов KNP: от −253 до +92, и около краёв вес почти перестаёт меняться.

Цифры на странице

На странице 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 Подробный журнал с командами и всеми цифрами