g-potential equilibrium map - #5
Open
MalachiteWind wants to merge 2 commits into
Open
Conversation
…_full arm Adds a new equilibrium map, g = grad_z Phi. Phi is a scalar potential with capped spectral norms. This makes J_g = grad^2 Phi symmetric by construction. Changes: - ftnode/latent/equilibrium.py: add GradPotentialG. It bounds ||g||_2 with an l2 ball, not an l-infinity box. It applies unequal spectral caps per layer. It provides project_() to hold the caps after each optimizer step. It provides curvature_headroom() as a diagnostic. - ftnode/latent/nets.py: add the ACTIVATION_LIPSCHITZ table and lipschitz_bound(). These certify ||grad Phi||_2 through the spectral caps. - ftnode/latent/feasibility.py: add fit_potential() and FeasibilityResult. This checks if a frozen field already has a symmetric-J_g representation. The check runs in minutes. A full training arm takes much longer. - ftnode/train.py: add a project_() hook after each optimizer step. The hook finds modules with a project_() method by duck typing. It does nothing for models that do not define one. - ftnode/diagnostics.py: add jg_stats(). It reports the skew fraction and lambda_max(sym J_g) of an equilibrium map. - tests/test_grad_potential.py: add tests for the new map's structural properties. - tests/test_recovery.py: update the bound test. It now checks the bound each map declares, instead of assuming one shape for all maps. - experiments/duffing/sym_jg_full.yaml, sym_jg_quick.yaml: add the new experiment. It compares svd_clamp+grad_potential against the l-ft-k-svd-clamp control. Both arms use the same operator, budget, and data. - scripts/run_g_potential.sh, scripts/analyze_sym_jg.py, scripts/execute_notebooks.py: add scripts to run the experiment and report its diagnostics. - examples/duffing/pkg_kappa_analysis.ipynb: re-run against runs/sym_jg_full. Results: - J_g is symmetric to float32 round-off. - The ||g||_2 <= 3.0 cap never binds during training. - No saddle point forms. The model stays monostable. - Rollout RMSE is about 9 times worse than the incumbent map. The mechanism works as designed. This arm does not match the incumbent's (svd_clamp) fit quality.
dde27b9 (the _proto_*.py scratch and duffing_learned_splitting_control.ipynb) was dropped from history. Rewrite the docstrings and comments that named those files so the surviving provenance and rationale no longer points at absent paths. Meaning and behavior are unchanged; the stale citations become 'the earlier prototype' / 'the control study', and the checkpoint-freeze rationale is restated as 'frozen committed artifact' rather than 'the frozen notebook loads it'.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.