KNP_W_RANGE option; weight range does not explain object gap

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
int 2026-10-15 06:56:14 +03:00
parent 6bfdbf69d3
commit ee48cb87bd
4 changed files with 16 additions and 1 deletions

View file

@ -41,6 +41,7 @@
// KNP_COL_GATE=<g1,g2,..> gate->input pulses: weight g_k with delay k (default: single 10000 pulse with delay 1). // KNP_COL_GATE=<g1,g2,..> gate->input pulses: weight g_k with delay k (default: single 10000 pulse with delay 1).
// KNP_COL_PUNISH=<d> target->input dopamine -d*1000 to every column except the label's one (reward is 0.179376): // KNP_COL_PUNISH=<d> target->input dopamine -d*1000 to every column except the label's one (reward is 0.179376):
// neurons of wrong columns that fired recently lose the synapses that made them fire. // neurons of wrong columns that fired recently lose the synapses that made them fire.
// KNP_W_RANGE=<min>,<max> trainable raster->input weight range.
// KNP_DELTA=<a>,<b> error-driven (delta-rule) training; needs a backend built with KNP_DELTA_RULE support // KNP_DELTA=<a>,<b> error-driven (delta-rule) training; needs a backend built with KNP_DELTA_RULE support
// (augment/build_delta_cpu.py). The label sends dopamine +a to its neurons on every active // (augment/build_delta_cpu.py). The label sends dopamine +a to its neurons on every active
// step, every input neuron's own spike sends it dopamine -b on the next step, so dopamine = // step, every input neuron's own spike sends it dopamine -b on the next step, so dopamine =
@ -154,6 +155,12 @@ static void create_projections(
raster_to_input_synapse.rule_.dopamine_plasticity_period_ = raster_to_input_synapse_dopamine_plasticity_period; raster_to_input_synapse.rule_.dopamine_plasticity_period_ = raster_to_input_synapse_dopamine_plasticity_period;
raster_to_input_synapse.rule_.w_max_ = raster_to_input_synapse_w_max; raster_to_input_synapse.rule_.w_max_ = raster_to_input_synapse_w_max;
raster_to_input_synapse.rule_.w_min_ = raster_to_input_synapse_w_min; raster_to_input_synapse.rule_.w_min_ = raster_to_input_synapse_w_min;
// KNP_W_RANGE=<min>,<max> overrides the trainable weight range (default -253.122, 92.3957).
if (const auto range = env_float_list("KNP_W_RANGE", {}); range.size() == 2)
{
raster_to_input_synapse.rule_.w_min_ = range[0];
raster_to_input_synapse.rule_.w_max_ = range[1];
}
raster_to_input_synapse.rule_.synaptic_resource_ = raster_to_input_synapse.rule_.synaptic_resource_ =
resource_from_weight(0, raster_to_input_synapse.rule_.w_min_, raster_to_input_synapse.rule_.w_max_); resource_from_weight(0, raster_to_input_synapse.rule_.w_min_, raster_to_input_synapse.rule_.w_max_);

View file

@ -51,3 +51,4 @@ MNIST, признаки coarse, 30 000 обучение, 10 000 проверка
- `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%. - `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%. Не помогает. - Три прохода по обучению (обучающая часть ×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 дофамин по ошибке даёт 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); вероятнее, мешает онлайн-обучение за один проход с крупными шагами.

View file

@ -41,6 +41,7 @@
// KNP_COL_GATE=<g1,g2,..> gate->input pulses: weight g_k with delay k (default: single 10000 pulse with delay 1). // KNP_COL_GATE=<g1,g2,..> gate->input pulses: weight g_k with delay k (default: single 10000 pulse with delay 1).
// KNP_COL_PUNISH=<d> target->input dopamine -d*1000 to every column except the label's one (reward is 0.179376): // KNP_COL_PUNISH=<d> target->input dopamine -d*1000 to every column except the label's one (reward is 0.179376):
// neurons of wrong columns that fired recently lose the synapses that made them fire. // neurons of wrong columns that fired recently lose the synapses that made them fire.
// KNP_W_RANGE=<min>,<max> trainable raster->input weight range.
// KNP_DELTA=<a>,<b> error-driven (delta-rule) training; needs a backend built with KNP_DELTA_RULE support // KNP_DELTA=<a>,<b> error-driven (delta-rule) training; needs a backend built with KNP_DELTA_RULE support
// (augment/build_delta_cpu.py). The label sends dopamine +a to its neurons on every active // (augment/build_delta_cpu.py). The label sends dopamine +a to its neurons on every active
// step, every input neuron's own spike sends it dopamine -b on the next step, so dopamine = // step, every input neuron's own spike sends it dopamine -b on the next step, so dopamine =
@ -154,6 +155,12 @@ static void create_projections(
raster_to_input_synapse.rule_.dopamine_plasticity_period_ = raster_to_input_synapse_dopamine_plasticity_period; raster_to_input_synapse.rule_.dopamine_plasticity_period_ = raster_to_input_synapse_dopamine_plasticity_period;
raster_to_input_synapse.rule_.w_max_ = raster_to_input_synapse_w_max; raster_to_input_synapse.rule_.w_max_ = raster_to_input_synapse_w_max;
raster_to_input_synapse.rule_.w_min_ = raster_to_input_synapse_w_min; raster_to_input_synapse.rule_.w_min_ = raster_to_input_synapse_w_min;
// KNP_W_RANGE=<min>,<max> overrides the trainable weight range (default -253.122, 92.3957).
if (const auto range = env_float_list("KNP_W_RANGE", {}); range.size() == 2)
{
raster_to_input_synapse.rule_.w_min_ = range[0];
raster_to_input_synapse.rule_.w_max_ = range[1];
}
raster_to_input_synapse.rule_.synaptic_resource_ = raster_to_input_synapse.rule_.synaptic_resource_ =
resource_from_weight(0, raster_to_input_synapse.rule_.w_min_, raster_to_input_synapse.rule_.w_max_); resource_from_weight(0, raster_to_input_synapse.rule_.w_min_, raster_to_input_synapse.rule_.w_max_);

View file

@ -73,7 +73,7 @@
| Цифры, то же + аугментация, 90 000 | — | 94,6%; сдвиг 2 px **91,3%** | 95,1%; сдвиг 89,9% | | Цифры, то же + аугментация, 90 000 | — | 94,6%; сдвиг 2 px **91,3%** | 95,1%; сдвиг 89,9% |
| Кошки/собаки, выученные признаки | 64–65% (на плотных молчат) | **65–69%** | 74% (без спайков) | | Кошки/собаки, выученные признаки | 64–65% (на плотных молчат) | **65–69%** | 74% (без спайков) |
На цифрах обучение внутри платформы догнало обучение вне чипа и дало самую устойчивую сеть за всё время. На объектах выигрыш у колонок небольшой. Разрыв с 74%, скорее всего, из-за диапазона весов KNP: от −253 до +92, и около краёв вес почти перестаёт меняться. На цифрах обучение внутри платформы догнало обучение вне чипа и дало самую устойчивую сеть за всё время. На объектах выигрыш у колонок небольшой. Разрыв с 74% пока не объяснён. Диапазон весов проверен и не виноват: симметричные ±120…±500 дают то же. Не помогают и три прохода по данным. Остаются крупные шаги онлайн-обучения: веса сильно расползаются.
## Цифры на странице ## Цифры на странице