mirror of
https://github.com/wassname/evil_MoE.git
synced 2026-07-13 17:43:42 +08:00
docs: README/figs name the current arm routeV, not the dropped route2
The cleanup removed the v1 route and route2 arms (Config is now none|erase|routeV) but left README calling the live arm route2 with its old binary-tau gate description. Rename to routeV, describe the banded cosine gate (per-rollout/per-token, per-token best), and fix the deploy line (held-out test n=119 knob-off, not n=64). figs.py keeps the route2/routing2 display map for historical run artifacts. Co-Authored-By: Claudypoo <288921227+claudypoo@users.noreply.github.com>
This commit is contained in:
@@ -75,13 +75,20 @@ Three active arms, identical model and teacher pool, differing only in the gradi
|
||||
|
||||
- **vanilla** -- no intervention; the emergence reference.
|
||||
- **erase** -- subtract the v_hack component from the live `delta_S` gradient (one-sided).
|
||||
- **route2** -- current routing arm. Per-rollout gate `cos(g_rollout, v_grad) > tau` (tau calibrated each step from the hack-vs-clean cosine gap) decides whether a rollout's whole gradient routes into a scale-matched, distinct-basis `delta_S_hack`. An exploration floor (`rollout_ablate_frac`) generates a fraction of rollouts knob-off so the deployed knob always sees solve signal even if the full policy saturates on hacking.
|
||||
- **routeV** -- current routing arm. A banded cosine gate `cos(g, v_grad) ∈ band` (band
|
||||
calibrated from the hack-vs-clean cosine gap, either from the pairs or a live rolling
|
||||
quantile) decides how much of a gradient routes into a scale-matched, distinct-basis
|
||||
`delta_S_hack`. The gate runs per-rollout or per-token (`routeV_gate`); per-token is the
|
||||
current best. An exploration floor (`rollout_ablate_frac`) generates a fraction of
|
||||
rollouts knob-off so the deployed knob always sees solve signal even if the full policy
|
||||
saturates on hacking.
|
||||
|
||||
Deploy hack/solve is measured the same way for every arm now: knob-off forward
|
||||
(`ablate_quarantine` for route2, the trained model itself for vanilla/erase),
|
||||
n=64 prompts*group, sampled at T=0.7. So the per-arm deploy numbers are apples-to-apples.
|
||||
Deploy hack/solve is measured the same way for every arm: knob-off forward
|
||||
(`ablate_quarantine` for routeV, the trained model itself for vanilla/erase) on the
|
||||
held-out test set (n=119), sampled at T=0.7. So the per-arm deploy numbers are
|
||||
apples-to-apples.
|
||||
|
||||
The frozen-vs-refresh distinction is orthogonal: erase and route2 can re-extract
|
||||
The frozen-vs-refresh distinction is orthogonal: erase and routeV can re-extract
|
||||
their pair-derived direction every N steps on the current adapter.
|
||||
|
||||
## Quick start
|
||||
|
||||
+1
-1
@@ -17,7 +17,7 @@ from pathlib import Path
|
||||
FIGS_DIR = Path("docs/figs")
|
||||
|
||||
# Reader-facing arm names. Code/log tags carry our internal vocabulary
|
||||
# (route2 = the current routing arm; "knob" = the delta_S adapter); plots must
|
||||
# (routeV = the current routing arm; "knob" = the delta_S adapter); plots must
|
||||
# not. Map every internal tag to the word a paper reader sees. Anything missing
|
||||
# falls through to its raw tag, so a new arm shows up loud rather than silently
|
||||
# mislabelled.
|
||||
|
||||
Reference in New Issue
Block a user