our_knp/changes-2026-10-15.md
int ee48cb87bd KNP_W_RANGE option; weight range does not explain object gap
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 06:56:14 +03:00

54 lines
6.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Журнал работы — 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); вероятнее, мешает онлайн-обучение за один проход с крупными шагами.