summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--docs/campaign/CASCADE_ABLATION_PLAN.md16
-rw-r--r--ep_run/casc_eq_train.py9
2 files changed, 23 insertions, 2 deletions
diff --git a/docs/campaign/CASCADE_ABLATION_PLAN.md b/docs/campaign/CASCADE_ABLATION_PLAN.md
index f919db1..f3678b3 100644
--- a/docs/campaign/CASCADE_ABLATION_PLAN.md
+++ b/docs/campaign/CASCADE_ABLATION_PLAN.md
@@ -568,6 +568,22 @@ direction), not training-under-fault; wave-2 = co-training with faults injected
+### RESULT 72 (2026-07-29): THE CURVE GOES ALL THE WAY — dg128 closes 97% (tail within
+0.0015 of the all-BP bar); the physics leak is FULLY REDEEMABLE by displacement amplification.
+FULL-DOSE VALIDATION LAUNCHED.
+Battery 8: dg64 92%, dg128 97% (log-law held the whole way: 34/50/63/75/92/97 at x4..x128),
+dgrand64 64% (spread-spectrum loses to fixed dose — the value lives in the high octaves;
+log-uniform wastes steps low). dg128 mechanics: r18/6k mild, no skips, drift 0.009; gn 5.07
+(amplified-read apparent norm — clip + msign both immune); cos 0.28 with BP-equivalent CE —
+the direction-metric coffin nailed shut.
+STANDING QUESTION (the honest one for the ladder): does the required dose scale with width?
+x128 at C768 vs ~x1 at C512 — if dose ~ width^k the wall is soft but real; if it saturates,
+this is a cure. 270M will answer. Production note: dgain is estimator-side only — model,
+inference, cost, hardware story all untouched; hardware realization = per-layer nudge
+amplifier gain (standard analog practice).
+IN FLIGHT: fw135m_dg128 (bsign + dgain_top 128, s250000 -> 440k, 3-GPU, ~22h). Bars:
+untreated 3.3839 | BP 3.0902. Success = endpoint ~3.15-3.18, gap back in the 72M band.
+
### RESULT 71 (2026-07-29): DOSE CURVE — logarithmic recovery (34/50/63% at x4/8/16),
DISPLACEMENT-EQUIVALENCE LAW triple-confirmed, cos retired as a metric; TREATMENT VALIDATION
LAUNCHED (bsign + dg8top, full remaining segment).
diff --git a/ep_run/casc_eq_train.py b/ep_run/casc_eq_train.py
index d7cfdf7..0e357c8 100644
--- a/ep_run/casc_eq_train.py
+++ b/ep_run/casc_eq_train.py
@@ -49,6 +49,9 @@ ap.add_argument('--bsign_rand', action='store_true') # random-sign beta per ste
ap.add_argument('--bf16', action='store_true') # cast model to bf16 (E-accumulation + tok_sigma stay fp32) — the x0.5 cost lever, GATE before production
ap.add_argument('--amp', action='store_true') # PROPER mixed precision: autocast(bf16) matmuls, fp32 params/states/d/E — amp_gate.py PASSED 2026-07-12 (cos 0.9682 vs fp32 0.9687); --bf16 naive-cast stays DEAD (state quantization, RESULT 11)
ap.add_argument('--dtop_every', type=int, default=1) # 1 = exact (DEFAULT, BP-parity); 2 = fast mode (~20% cheaper, ~4% CE tax at high lr)
+ap.add_argument('--dgain_rand', type=float, default=0.0) # >1: per-STEP log-uniform dgain_top in
+ # [1, this] (spread-spectrum probing of the
+ # decade-spread threshold distribution)
ap.add_argument('--dgain_top', type=float, default=1.0) # amplify d in STATE FORMATION for blocks
# >= L/2 (read cotangents stay true-d: 1st-
# order exact; unlocks 2nd-order response of
@@ -419,7 +422,7 @@ def relax(z0, zs, ins, outs, y, beta, K, x, bmask=None):
else:
i = prev.detach().requires_grad_(True)
o = blocks[l](i, mask)
- _dg = args.dgain_all * (args.dgain_top if l >= args.L // 2 else 1.0)
+ _dg = args.dgain_all * ((GOV.get('dgcur') or args.dgain_top) if l >= args.L // 2 else 1.0)
znew = o.detach().float() + (_dg * d[l] if _dg != 1.0 else d[l])
# damped (under-relaxed) mixing: geta<1 restores contraction on stiff operators
# (wall-2 toolkit); fixed point unchanged (z = z + geta*(o+d-z) <=> z = o+d)
@@ -521,6 +524,8 @@ def ep_step(x, y):
GOV['prev_floor'] = fl
beta_t = beta_t * GOV.get('cap', 1.0) # wall-2 loop-gain cap OVERRIDES the floor (the ceiling
# can sit below the floor near the wall; survival first)
+ if args.dgain_rand > 1.0:
+ GOV['dgcur'] = float(torch.exp(torch.rand((), generator=BGEN) * math.log(args.dgain_rand)))
if args.beta_simple >= 1.0:
# FULL ownership: no sigma-scaling, no floor/bf_late, no cap — beta = start * measured multiplier
beta_t = args.beta * GOV.get('bsimp', 1.0)
@@ -925,7 +930,7 @@ for step in range(start_step, args.steps + 1):
with torch.no_grad():
GOV['w_rms'] = float(sum(p.float().pow(2).mean().sqrt() for p in all_params) / len(all_params))
_aux = {'gn': GOV.get('gn'), 'drift': GOV.get('drift'), 'sig': GOV.get('sig'),
- 'res': GOV.get('res'), 'rho': GOV.get('rho'),
+ 'res': GOV.get('res'), 'rho': GOV.get('rho'), 'dgcur': GOV.get('dgcur'),
'clip_norm': GOV.get('clip_norm'), 'clip_fired': (None if GOV.get('clip_norm') is None else float(GOV['clip_norm'] > 1.0))}
for k in ('act_rms', 'w_rms', 'mag_ep', 'mag_bp'):
if GOV.get(k) is not None: _aux[k] = GOV[k]