need better beta schedules in simpeg

GitHub Issue: #16 State: open Labels: none

Description

Migrated from deprecated-nagelfluh #20 (originally by @burningsage)

Background

The current invert_tem beta schedule is fixed: beta halves (or quarters) every iteration regardless of whether the model update was good or bad. After extensive testing on LPNNRD2018 line 409001 (501 soundings), we have clear empirical evidence that this is the primary convergence bottleneck in our workflow.

Observed behavior

Across 10+ test inversions varying alpha_z (0.5, 0.25), starting model (15, 50, 100 Ω·m), beta0_ratio (10, 50, 100), and cooling_rate (1, 2), the result is nearly always the same:

The one exception was a 100 Ω·m start model that accidentally ran 14 iterations. The reason: its high initial misfit produced a high starting beta, which gave the model a slower effective cooling schedule by coincidence. This is exactly the behavior Marquardt-Levenberg would provide automatically.

The integer-only constraint on cooling_factor makes manual tuning even more limited — we cannot try values like 1.3 or 1.5 that most SimPEG workflows use.

Root cause

The optimizer converges at the current beta level (step size → 0), then beta drops and the model has to rebuild momentum at the new regularization level. With cooling_factor=2 and cooling_rate=1, beta has dropped 64× by iteration 6. There is no feedback mechanism to detect whether the step was good or bad, or to find the right beta level automatically.

Proposed fix: Marquardt-Levenberg adaptive damping

Replace the fixed BetaSchedule + BetaEstimate_ByEig with an adaptive directive that adjusts beta per iteration based on the gain ratio ρ: ρ = (phi_d_old - phi_d_new) / predicted_decrease

Expected impact

References