our_knp/reports/2026-10-15/журнал.md
int 8fe6c3a248 Save state before session shutdown: resume steps for KNP vehicles pipeline
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 11:29:20 +03:00

14 KiB
Raw Blame History

Журнал работы — 15 октября 2026

Ночь (продолжение): выход, обучаемый дофамином по ошибке, внутри KNP

Пользователь: «начинай, связь со мной не нужна». Цель — перенести в KNP правило, проверенное в симуляторе (выход «цель − ответ» × вход).

Код

  • examples/.../models/altai/construct_network.cpp: режим KNP_DELTA=<a>,<b>. Метка подаёт дофамин +a нейронам своего класса с задержкой 1 на каждом активном шаге; собственный спайк нейрона даёт ему дофамин −b на следующем шаге (проекция input→input, исключена из сети распознавания). Нет торможения по метке (−30000) и принуждения через гейт; у нейронов выключены Хебб (d_h=0), стабильность и порог от суммы весов. Используется с KNP_COL_SIZE=1 (один нейрон на класс).
  • .../models/altai/spike_generators.cpp: при KNP_DELTA метка отправляется на шагах 0–9 (а не на 11-м).
  • readout/build_delta_cpu.py → /home/int/run/delta-cpu/libknp-cpu-delta-backend.so: изолированная копия бэкенда; KNP_DELTA_RULE=<скорость> — у нейрона с дофамином D ≠ 0 каждый обучаемый синапс, чей входной спайк пришёл с отставанием KNP_DELTA_LAG шагов, меняет ресурс на скорость·D (независимо от спайка самого нейрона); KNP_DELTA_DEBUG печатает гистограмму отставаний. Оригинальные библиотеки не менялись.
  • Отладка: при отставании 0 обновлений не было (веса не менялись); гистограмма: отставания 1/2/3 = 406 тыс./252 тыс./120 тыс., 0 — ни одного. Дофамин приходит на шаг позже входа → KNP_DELTA_LAG=1.
  • Пробный прогон (признаки coarse, 3000 обучение, 1000 проверка, 10 нейронов): скорость 0,3 — 48,5%, 1 — 76,8%, 3 — 77,4% (колонки 200 нейронов на том же объёме: 69,8% без наказания, до 79% с наказанием).
  • cats-dogs/source: те же изменения (construct_network.cpp, spike_generators.cpp), пересобран cats_dogs; cats-dogs/run.py --backend delta.
  • Запущены: readout/delta_runs.sh (MNIST coarse, 30 000, 6 вариантов) и кошки/собаки на плотных признаках features-v3/kmeans_validation (2048 входов, 18 000 обучение, скорости 0,3/1/3).

Результаты обучения дофамином по ошибке в KNP (validation)

MNIST, признаки coarse, 30 000 обучение, 10 000 проверка, 10 выходных нейронов (KNP_COL_SIZE=1), порог 60, торможение 255:

скорость a b (штраф за свой спайк) разброс верно
1 1 1 20 85,17%
3 1 1 20 86,25%
3 1 1 0 85,86%
10 1 1 20 79,42%
3 1 0,5 20 59,79%
1 1 2 20 91,43%
3 1 2 20 93,27%
10 1 2 20 93,02%
3 1 3 20 94,31%
3 1 4 20 94,76%
3 1 6 20 94,81%

Для сравнения на тех же признаках: колонки STDP (200 нейронов) — 79,7% без наказания, 83,5% с наказанием 0,012; выход, обученный вне чипа (ridge, спайковый) — 94,9%. Симулятор на dl_r3_a1_b2_j20: 93,26% (KNP 93,27%); порог 20–160 и торможение 0/255 — 87,7–93,7%.

Кошки/собаки, плотные выученные признаки features-v3/kmeans_validation (2048 входов, K=512, без разреживания), 18 000 обучение, 1000 проверка, 2 нейрона, разброс 0:

скорость b верно
0,3 1 50,1%
1 1 54,5%
3 1 58,4%
3 2 65,8%
10 2 65,6%
10 4 65,6%
3 4 69,1%

Колонки STDP на этих же плотных признаках молчали (≈0%), на разреженных top-256 — 64–65%; ridge на этих uint8-признаках 74,2%, спайковый нейрон-разность 72,4%. Симулятор dl_cd_r3_b4: порог 30–250, торможение 0/255 — 67,6–68,8%.

  • MNIST, штраф b: 8 — 94,22%; 12 — 92,42% (оптимум b = 4–6). Устойчивость dl_r3_a1_b6_j20 (симулятор, 2000): как есть 94,5%, сдвиг 2 px 87,5%, толще 90,8%, тоньше 84,0%.
  • MNIST с аугментацией A (fcoarseA_val90000, 90 000, r3 b6): KNP 94,63%; устойчивость — 94,6 / 91,3 / 91,2 / 80,8%.
  • Кошки/собаки, ещё b: r3 b6 63,5%, r3 b8 62,2%, r3 b12 60,0%, r1 b4 67,7%, r1 b8 68,4%.
  • cats-dogs/source: размер входа — get_input_size() из KNP_MNIST_INPUT_SIZE (по умолчанию 2048), пересобран. objects/make_knp_features.py --model --name. Признаки онлайн WTA: K=800 (3200 входов) — r3 b4 65,3%, r1 b8 67,2%; K=1600 (6400) — 65,9% / 67,2%.
  • Три прохода по обучению (обучающая часть ×3 с новым перемешиванием, *_x3_validation, 54 000): K=512 — r1 b4 67,3%, r1 b8 65,0%, r3 b4 66,4%; K=1600 r1 b8 63,2%. Не помогает.
  • Вывод по объектам: в KNP дофамин по ошибке даёт 65–69% (колонки STDP — 64–65% на разреженных, ≈0% на плотных); ridge на тех же признаках — 74%. Вероятная причина разрыва — ограниченный и несимметричный диапазон весов KNP (−253…+92) и насыщение ресурса.
  • KNP_W_RANGE=<min>,<max> (MNIST и cats-dogs construct_network.cpp): диапазон обучаемых весов. Кошки/собаки r3 b4: ±120 — 66,1%, ±250 — 66,4% (r1 b8 — 61,8%), ±500 — 64,9% (по умолчанию −253…+92 — 69,1%). Гипотеза про диапазон не подтвердилась. Разброс весов большой (σ 91 при стандартном диапазоне, 177 при ±250); вероятнее, мешает онлайн-обучение за один проход с крупными шагами.

Утро: всё на платформе — распознавание транспорта (цель — демо для беспилотников)

Решения пользователя: живое демо; тезис «нейроморфный Алтай заменяет нейросеть для распознавания объектов в беспилотных системах»; всё (и признаки, и обучение) должно работать в KNP.

  • Скорость KNP на свёрточном слое (altai-objects/bench_conv.cpp, однопоточный бэкенд, случайный вход 0,4): K=32 шаг 2 — 0,06 с/картинку, 0,2 ГБ; K=100 шаг 2 — 0,25 с, 0,7 ГБ; K=200 шаг 2 — 0,95 с, 1,4 ГБ; K=100 шаг 1 — 1,8 с, 2,6 ГБ (~320 байт на синапс).
  • Данные: CIFAR-10 с Hugging Face (uoft-cs/cifar10, parquet; официальный сервер давал ~37 КБ/с). altai-objects/prepare_vehicles.py → ~/run/cifar/vehicles: самолёт/автомобиль/корабль/грузовик; train 16 000 (первые 4000 каждого класса), val 4000 (последние 1000), test 4000 (официальный, не просмотрен). pyarrow установлен в ~/anvenv.
  • Проверка замысла в numpy (altai-objects/retina_proto.py): сетчатка ON/OFF (DoG σ 0,5/1,5, усиление 4) → онлайн WTA на кусочках 6×6×6 → вычитание среднего узора (линейно) → пулинг по четвертям → ridge. Кошки/собаки v3, K=200 шаг 2: 70,2% (с нормировкой и ZCA при том же размере — 73,6%). Транспорт: 76,0%.
  • altai-objects/altai_objects.cpp (сборка altai-objects/build.py): режим features — кусочки 12×12 → сетчатка (216 нейронов AltAI, фиксированные веса DoG×1000) → K детекторов STDP-AltAI, взаимное торможение и дофамин от собственного спайка; режим run — полная сеть пиксели → сетчатка 6×32×32 → детекторы K×196 (выученные веса минус средний, целые) → выход (дофамин по ошибке), затем веса читаются из бэкенда и фиксируются для проверки.
  • Бэкенд: KNP_DELTA_DECAY=d — у нейрона с дофамином D неактивные синапсы меняются на −скорость·D·d (соревновательное обучение).
  • altai-objects/export_knp.py (ошибка: многократное чтение npz съело 31 ГБ — исправлено), score_features.py — быстрая оценка узоров (только для настройки). Ориентиры (K=64, 6000 обучение): узоры WTA в numpy 68,0%, случайные веса 62,2%; первая проба KNP (5000 кусочков, убавка 0,2) — 60,9%. Сетчатка: в среднем 10% входов спайкают за шаг.

Обучение узоров в KNP (до уточнения пользователя) и смена курса

  • Соревновательное обучение узоров в KNP (features, altai-objects/feature_grid.sh, оценка score_features.py, K=64, ориентиры: WTA в numpy 68,0%, случайные 62,2%): постоянная убавка (KNP_DELTA_DECAY) — 64–65,6% при любых скорости, пороге, торможении (26 вариантов); нормировка порогом AltAI (KNP_SUMTHR) — без изменений; сильнее обучение — детекторы замолкают; убавка, пропорциональная весу (KNP_DELTA_WDECAY), — 54,8% и очень медленно (55–98 мин на 100 000 кусочков, прогоны остановлены). Длительное торможение (KNP_DET_NEG, KNP_DET_LEAK, KNP_SELF_INHIB): утечка AltAI отводит отрицательный потенциал дальше от нуля при положительном значении; при отрицательном — слишком много спайков.
  • Запечатление (KNP_IMPRINT=1: кусочек c учит детектор c через канал дофамина; numpy: K=200 — 71,4% против 73,0% у WTA): в KNP K=200 — 69,6–70,9% (лучшее 70,9%: 10 повторов, скорость 100).
  • Уточнение пользователя: важен инференс на Алтае, обучение может быть вне платформы. Курс: обучение обычным кодом, распознавание целиком в KNP.
  • altai-objects/altai_infer.cpp: распознавание в KNP — пиксели (спайки) → детекторы K × позиции (целые веса на 6×6×3 пикселей, смещение через постоянно активный вход) → нейроны классов (веса на (четверть, тип детектора), смещение с задержкой 2). Пишет числа спайков детекторов по четвертям (для обучения выхода) и спайки классов.
  • altai-objects/build_model.py: k-средние без деления на контраст на кусочках транспорта, свёртка центровки/ZCA/узора в целые веса ±127, порог — 99-й перцентиль. K=200 шаг 2: масштаб 37,6, порог детектора 135, смещения −13…−5. KNP: 0,8 с/картинку, 1,5 ГБ, ~36 тыс. спайков детекторов на картинку.
  • altai-objects/run_counts.sh: параллельный сбор чисел спайков из KNP (train, train_flip, val; 14 процессов). altai-objects/train_readout.py: ridge на этих числах → целые веса классов ±255, смещение по шагам, порог по обучающей выборке.

Состояние на 11:20 (сессию выключают)

  • Идёт сбор чисел спайков из KNP: altai-objects/run_counts.sh model_k200 counts_k200 (в ~/run/altai-objects, 14 процессов, 36 частей по 1000 картинок: train, train_flip, val). Готовые части помечены counts_k200/*.done; при перезапуске скрипт пропускает готовые.
  • Дальше: ~/anvenv/bin/python altai-objects/train_readout.py ~/run/altai-objects/model_k200 ~/run/altai-objects/counts_k200 → веса классов в model_k200; затем распознавание проверочной выборки целиком в KNP: altai_infer /home/int/run/cifar/vehicles/val_images.bin <first> <count> model_k200 <single-threaded backend> <prefix> (частями параллельно) и точность по <prefix>_classes.csv против val_labels.txt. Тест (test_images.bin) — один раз в конце.
  • Потом: страница демо (локальный сервер → altai_infer на одной картинке), сравнение с обычной CNN.