summaryrefslogtreecommitdiff
path: root/sdil
diff options
context:
space:
mode:
authorYurenHao0426 <Blackhao0426@gmail.com>2026-07-22 02:13:33 -0500
committerYurenHao0426 <Blackhao0426@gmail.com>2026-07-22 02:13:33 -0500
commit7e8d314c0fb8e82730e24da153e8b73c3af4ecd6 (patch)
tree49b57e987648bd9352aa2f65ee8d12ee208160c1 /sdil
parentb9a9524ca559cc30a584779ba39f7764887d7fcf (diff)
results: freeze predictor timescale choice
Diffstat (limited to 'sdil')
-rw-r--r--sdil/core.py8
1 files changed, 4 insertions, 4 deletions
diff --git a/sdil/core.py b/sdil/core.py
index cece194..8b3f923 100644
--- a/sdil/core.py
+++ b/sdil/core.py
@@ -18,7 +18,7 @@ For hidden layer l:
Three learning rules, all local (no weight transport, no reverse-mode graph):
dW_l = eta * (r_l ⊙ phi'(u_l)) h_{l-1}^T (three-factor: pre * gain * innovation)
- dP_l = eta_P * (a_l - P_l h_l) h_l^T (slow; only on neutral periods) eta_P << eta
+ dP_l = eta_P * (a_l - P_l h_l) h_l^T (identified only on neutral periods)
dA_l = eta_A * (q_l - r_l) c_l^T (on perturbation trials; q_l = causal node-pert estimate)
q_l is a node-perturbation estimate of the causal descent direction
@@ -513,9 +513,9 @@ def sdil_step(net, x, y, y_onehot, cfg, step, prev_error=None):
dA = (qs[l] - r_list[l]).t() @ c / B # (n_l, n_classes)
net.A[l] += cfg.eta_A * dA
- # ================= predictor P (slow) =============================
- # KEY timescale-separation condition. P must learn the soma->apical
- # coupling WITHOUT absorbing the teaching signal. On "neutral periods"
+ # ================= predictor P (neutral) ==========================
+ # KEY identification condition. P must learn the soma->apical coupling
+ # WITHOUT absorbing the teaching signal. On "neutral periods"
# the apical compartment carries only the soma-predictable nuisance drive
# (top-down teaching c is absent), so we fit P to the c=0 apical. This
# makes P -> nuisance map (rho*Bnuis) and leaves the innovation intact.