diff options
| -rw-r--r-- | docs/campaign/CASCADE_ABLATION_PLAN.md | 41 | ||||
| -rw-r--r-- | ep_run/casc_eq_train.py | 9 |
2 files changed, 47 insertions, 3 deletions
diff --git a/docs/campaign/CASCADE_ABLATION_PLAN.md b/docs/campaign/CASCADE_ABLATION_PLAN.md index 90985cb..9de77a0 100644 --- a/docs/campaign/CASCADE_ABLATION_PLAN.md +++ b/docs/campaign/CASCADE_ABLATION_PLAN.md @@ -568,6 +568,47 @@ direction), not training-under-fault; wave-2 = co-training with faults injected +### RESULT 44 (2026-07-18): GAP-SOURCE LOCALIZATION — the residual EP gap lives in the TOP-half blocks, split ~evenly attn/ffn; bottom-half EP grads are loss-equivalent to BP. +bpmix 5-arm, all from cent s200000 through the 215k endgame frame (shared frame; internal A/B +only, absolutes not comparable to crown lineage). BP reference (allbp) 3.4020; all-EP 3.4245 +-> window gap 0.0225. Swapping module groups to TRUE BP grads: + mixbot (blocks 0-5) 3.4244 -> recovers ~0% of the gap + mixtop (blocks 6-11) 3.4071 -> recovers 77% + mixattn (attn, all) 3.4152 -> recovers 41% + mixffn (ffn, all) 3.4161 -> recovers 37% (41+37 ~= 77+0: additive decomposition holds) +Reading: bottom-half EP fidelity is a SOLVED problem at this scale (exact-BP substitution buys +nothing); the entire residual gap concentrates in blocks 6-11, attn and ffn about equally. +Tension with RESULT 25 (transmission bias compounds toward the bottom): bottom grads may be worse +in cosine yet loss-irrelevant in this window — update magnitude/role concentrates near the head. +HW consequence: fidelity budget (quant/noise/beta) should be weighted toward the top half. + +### RESULT 43 (2026-07-18): CROWN-3 CAUSE OF DEATH = CEILING CROSSED, THEN THE CAP'S HARD BOTTOM HELD BETA ABOVE THE COLLAPSED CEILING FOR 18k STEPS (disguised wall-2, user's read). Estimator-toxicity story DEMOTED; endgame A/B is a TIE. +Endgame A/B (from cent s200000, 15k steps): end_plain 3.4245 vs end_cent 3.4244 — dead tie, +both healthy (gn 0.147 / drift 0.009 / 0 skips; plain: one -12% cap graze @213.9k, instant +recovery). Estimator CE-equivalence now 3-way replicated (42M tail, 72M mid-tail, 72M endgame); +single-sided is NOT locally toxic on a healthy state. "不是plain不行" (user) confirmed. +Death timeline (simple-bounds-first per user): first cap bite @196k with ALL health metrics +normal — leads every symptom by 8k+ steps (gn 204k, cos-negative 217k, drift 216k, skips 225k). +Cap wrestles floor 196-204k (best 3.3728@203.7k set DURING the fight), then pins at the HARD +BOTTOM 0.05*beta = 1.5e-4 from ~216k with rho^>0.9 & res>0.02 continuously (v2 absolute-gate = +bites genuine). rho^ is a per-sweep residual contraction ratio — a WEIGHT-STATE property beta +cannot restore — so the governor had no lever and sat pinned ABOVE the true ceiling. Zero +r-skips until 225k: the relax never overtly diverged; death by sustained sub-ceiling-less +operation + SNR starvation, not explosion. +Controls: cent late-phase (150k-234k): ONE graze (221.8k). end_plain (plain est, cent state): +one graze in 15k. => ceiling collapse is a plain-LINEAGE-STATE property. sigma nearly equal at +200k (467.7 vs 463.0) => the lineage difference lives in block contraction ||J||, not W_out. +RESULT 42's "bias->sharpening positive feedback" narrative DEMOTED (user's evidentiary bar: no +direct literature for invisible-accumulation stories). Canonical citation that DOES cover +one-sided-fails/symmetric-rescues: Laborieux et al. 2021 (O(beta) estimator bias, deep-net +failure, +-beta symmetric fix = our centered). +ACTION: --cap_floor flag added (default 0.05 = legacy; 0 = pure ceiling-tracking, three hard +bottoms released). fw72m_plain_nf IN FLIGHT: resume plain s190000 (last healthy ckpt), cap_floor +0, exact crown-3 mirror, replay the 190k->234k death window. Survive => hard bottom was the +killer, plain viable at 1.0x (crown-3b = plain+no-floor). Beta free-fall + skip-storm stall +(weights preserved, fail-stop) => corridor truly closed => centered is the fix. R42's +est_late-flip candidate is MOOT either way (endgame estimator doesn't matter — tie). + ### RESULT 42 (2026-07-18): CROWN-3 VOIDED (user call) — slow-burn endgame instability the guards accepted; the SINGLE-SIDED estimator emerges as the common factor in both 72M deaths. User caught what skip-counting missed: gn rising / cos falling / CE rising from ~200k, spike at 231.7k, partial recovery — RESULT 41's "zero guard events = healthy" reading RETRACTED. diff --git a/ep_run/casc_eq_train.py b/ep_run/casc_eq_train.py index fb9dca5..cca37b5 100644 --- a/ep_run/casc_eq_train.py +++ b/ep_run/casc_eq_train.py @@ -68,6 +68,9 @@ ap.add_argument('--drift_adapt', type=float, default=0.0) # >0: adaptive drift ap.add_argument('--beta_cap_rho', type=float, default=0.0) # >0: LOOP-GAIN CAP on beta — if per-sweep residual # ratio rho^ exceeds this, bscale *= 0.8 (beta backs off # under the wall-2 ceiling); recovers x1.02 when rho^ low +ap.add_argument('--cap_floor', type=float, default=0.05) # hard bottom of the rho-cap; 0 = pure ceiling-tracking + # (cap follows the measured ceiling all the way down; a + # pinned bottom above the true ceiling = disguised wall-2) ap.add_argument('--relax_tol', type=float, default=0.0) # >0: ADAPTIVE relax — sweep until rel. state change < tol # (or --kmax), geta backtracks x0.6 on residual GROWTH (rho>=1 # signal), then one final graphed round. 0 = legacy fixed-K. @@ -445,7 +448,7 @@ def ep_step(x, y): # EFFECTIVE beta is continuous across any floor change (the 0.09-at-20k bug, RESULT 37) pf = GOV.get('prev_floor') if pf is not None and fl != pf and pf > 0 and fl > 0: - GOV['cap'] = min(max(GOV.get('cap', 1.0) * pf / fl, 0.05), args.beta_ride) + GOV['cap'] = min(max(GOV.get('cap', 1.0) * pf / fl, args.cap_floor), args.beta_ride) 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) @@ -504,7 +507,7 @@ def ep_step(x, y): if _legal(gdrift): ok_retry = True if args.beta_ride > 1.0: # the failed trial IS the ceiling measurement - GOV['cap'] = max(GOV.get('cap', 1.0) * 0.5 ** (_h + 1), 0.05) + GOV['cap'] = max(GOV.get('cap', 1.0) * 0.5 ** (_h + 1), args.cap_floor) break if ok_retry: pass @@ -534,7 +537,7 @@ def ep_step(x, y): rho_use = GOV['rho_ema'] = 0.9 * GOV.get('rho_ema', rho_g) + 0.1 * rho_g GOV['cool'] = max(GOV.get('cool', 0) - 1, 0) if res_g > 0.02 and rho_use > args.beta_cap_rho: - GOV['cap'] = max(GOV.get('cap', 1.0) * 0.85, 0.05) # attack (gentler than v1) + GOV['cap'] = max(GOV.get('cap', 1.0) * 0.85, args.cap_floor) # attack (gentler than v1) if args.ride_cool > 0: GOV['cool'] = args.ride_cool # ride-v2(c), opt-in elif (res_g < 0.01 or rho_use < 0.5 * args.beta_cap_rho) and GOV['cool'] == 0: # recover; with beta_ride > 1 the governor CLIMBS past the schedule — beta finds |
