15 KiB
Отчёт: кошки и собаки, ночь 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 п.п. На свежем тесте разница вышла больше, по-видимому, отчасти случайно.
Где теряется точность
- Нормировка контраста: −0,7 п.п. Её нельзя сделать одним нейроном, но потеря небольшая.
- Спайки слоя признаков и выхода: −8 п.п. Нейрон признака за картинку срабатывает в среднем около одного раза, и тонкие различия в силе признака теряются. Понижение порога не помогло.
- Колонки 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% пока не объяснён. Диапазон весов проверен и не виноват: симметричные ±120…±500 дают то же. Не помогают и три прохода по данным. Остаются крупные шаги онлайн-обучения: веса сильно расползаются.
Цифры на странице
На странице 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 на вариант.
Что дальше
- Перенести в KNP оба нейронных правила, проверенных в симуляторе: соревновательный слой признаков и выход с дофамином по ошибке.
- Сократить потерю на спайках: дать нейрону признака больше спайков на картинку или использовать время первого спайка.
- Научить колонки STDP работать с плотными признаками, а не только с разреженными: например, вычитать среднее перед подачей или добавить тормозящий вход.
- Перенести спайковую цепочку признаков на страницу визуализатора.
Файлы
| Файл | Что это |
|---|---|
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 — наказание неверных колонок |
reports/2026-10-14/журнал.md, reports/2026-10-15/журнал.md |
Подробные журналы с командами и всеми цифрами |