diff options
| -rw-r--r-- | docs/campaign/CASCADE_ABLATION_PLAN.md | 16 | ||||
| -rw-r--r-- | ep_run/casc_eq_train.py | 9 |
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] |
