Skip to content

Shrink the differential evolution population over the run, floored at the processor count (L-SHADE's population-size reduction) #699

Description

@wshlavacek

Gated on #698. Plain ade currently collapses its population and stops early on small models, so its benchmark rows measure that fault rather than the method; the comparison this issue needs, de and ade with and without the schedule from the same seeds, is only meaningful once #698 has landed and its re-score has produced sound baseline rows.

What happens now

population_size is fixed for the whole run. The population that is right for exploring at the start, large so the initial spread covers the box, is not the one that is right for refining at the end, where a small population around the best members converges faster with the same budget. #667 adopted SHADE's success-history adaptation of the mutation settings (ADR-0142) and deliberately left this half of L-SHADE out, on the grounds that it is a separate mechanism and interacts with how many processors a run keeps busy. It should be judged on its own, and this is the issue for that.

The suggestion

Shrink the population linearly over the run, as Tanabe and Fukunaga's L-SHADE does: at the end of each generation compute the population size the schedule calls for at that point in the budget, and remove the worst members until the population is that size. L-SHADE runs from 18 times the number of parameters down to 4 over the evaluation budget.

Two adaptations to PyBNF:

Removing members touches the bookkeeping: de indexes its population by slot and its candidates by name, ade names candidates gen<i>ind<j> and may have a candidate in flight for a slot that no longer exists when its result comes back. de with islands shrinks each island.

Off by default, or on under the modern edition and off under the legacy one as ADR-0137 did, so an existing configuration is byte-identical.

Why it is worth doing

  • In the literature it is the larger part of L-SHADE. SHADE was among the top entrants at CEC 2013; SHADE with this schedule won CEC 2014. If the adaptation was worth adopting on that record, the schedule has at least as much behind it.
  • The uncertainty is PyBNF's regime, and it is cheap to measure. The literature runs populations of 18 times the dimension for thousands of generations; PyBNF runs 20 to 50 for a few hundred, on simulations that cost seconds to minutes. Whether the schedule helps at those sizes is not known, and a crude version (drop the worst member every few generations toward a floor) can be scored on the analytical harness in minutes and on the stochastic recovery benchmark (Build a parameter recovery benchmark for fitting stochastic rule-based models #663) in an afternoon, since the runner is single-process and parallelism does not enter. Build the proper version only if the crude one shows a gain.

Care needed

  • On a stochastic objective the worst members are partly the unlucky draws, so removing them is not the same operation it is on a deterministic function. Measure on the stochastic benchmark, not only on analytical targets, and look at whether the run's reported best gets worse as the population thins.
  • The interaction with de_adapt_mutation: measure the schedule alone and with the learned settings, from the same seeds, so the two effects stay separable. The same discipline as Learn the differential evolution mutation settings during a run instead of asking the user for them #667's control.
  • A driven test that the bookkeeping stays consistent as slots vanish under both methods, including a result arriving for a removed ade slot, and the fake-rng oracles in tests/test_diff_evolution.py pinning that the off path makes no extra draw.

Related

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or requestgatedBlocked on an external trigger, e.g. an upstream release; revisit when it fires

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions