Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

IPOP and BIPOP restart mechanisms #403

Merged
merged 56 commits into from
Nov 29, 2024
Merged
Show file tree
Hide file tree
Changes from 3 commits
Commits
Show all changes
56 commits
Select commit Hold shift + click to select a range
bdbdc01
IPOP and IPOP restart mechanisms
beny-bee Jul 7, 2024
6bb6af4
Update include/ensmallen_bits/cmaes/bipop_cmaes.hpp
beny-bee Jul 8, 2024
4d880bb
add ipop and bipop documentation
beny-bee Jul 8, 2024
8a257b5
update docs
beny-bee Jul 29, 2024
942bc37
Updates ipop bipop
beny-bee Jul 29, 2024
762fab9
bipop update
beny-bee Jul 29, 2024
2508bb1
Refactor IPOP and BIPOP to one
beny-bee Aug 13, 2024
aba89da
add POP in ensmallen.hpp
beny-bee Aug 13, 2024
1103561
correct typo
beny-bee Aug 13, 2024
3316077
Documentation and useBIPOP parameter template
beny-bee Aug 17, 2024
66d9f19
Delete include/ensmallen_bits/cmaes/bipop_cmaes.hpp
beny-bee Aug 17, 2024
6d58cfd
Delete include/ensmallen_bits/cmaes/bipop_cmaes_impl.hpp
beny-bee Aug 17, 2024
2c14b7d
Delete include/ensmallen_bits/cmaes/ipop_cmaes.hpp
beny-bee Aug 17, 2024
541c6be
Delete include/ensmallen_bits/cmaes/ipop_cmaes_impl.hpp
beny-bee Aug 17, 2024
1d2dd1e
Delete tests/bipop_cmaes_test.cpp
beny-bee Aug 17, 2024
4622470
Delete tests/ipop_cmaes_test.cpp
beny-bee Aug 17, 2024
6d369f3
Update CMakeLists.txt
beny-bee Aug 17, 2024
3dfe373
add more tests for pop-cma-es
beny-bee Aug 17, 2024
16b0be1
fixed bug in pop-cma-es
beny-bee Aug 17, 2024
a6fd0ff
Update test for pop-cma-es
beny-bee Aug 17, 2024
8f5ce22
init overallSBC to sbc
beny-bee Aug 20, 2024
723b623
Update include/ensmallen_bits/cmaes/pop_cmaes.hpp
beny-bee Aug 20, 2024
4abc15d
update doc and tests
beny-bee Aug 20, 2024
2e3f7db
update tests
beny-bee Aug 20, 2024
0a5d061
Merge branch 'mlpack:master' into restart-ipop-bipop
beny-bee Aug 27, 2024
6b674f3
Update doc/optimizers.md per suggestion
conradsnicta Nov 28, 2024
b876f45
Update doc/optimizers.md per suggestion
conradsnicta Nov 28, 2024
0b5ecbd
Update doc/optimizers.md per suggestion
conradsnicta Nov 28, 2024
0980684
Update doc/optimizers.md per suggestion
conradsnicta Nov 28, 2024
a985816
Update doc/function_types.md per suggestion
conradsnicta Nov 28, 2024
6e674f9
Update doc/optimizers.md per suggestion
conradsnicta Nov 28, 2024
71fc310
Update doc/optimizers.md per suggestion
conradsnicta Nov 28, 2024
1a222d3
Update doc/optimizers.md per suggestion
conradsnicta Nov 28, 2024
b07b339
Update doc/optimizers.md per suggestion
conradsnicta Nov 28, 2024
f377c79
Update doc/optimizers.md per suggestion
conradsnicta Nov 28, 2024
d271cda
Update doc/optimizers.md per suggestion
conradsnicta Nov 28, 2024
befd7d5
Update include/ensmallen_bits/cmaes/pop_cmaes.hpp per suggestion
conradsnicta Nov 28, 2024
b98991b
Update include/ensmallen_bits/cmaes/pop_cmaes_impl.hpp per suggestion
conradsnicta Nov 28, 2024
33b5452
Update doc/optimizers.md per suggestion
conradsnicta Nov 28, 2024
42e01ee
Update doc/optimizers.md per suggestion
conradsnicta Nov 28, 2024
765af85
Update doc/optimizers.md per suggestion
conradsnicta Nov 28, 2024
27ec68d
Update include/ensmallen_bits/cmaes/cmaes.hpp per suggestion
conradsnicta Nov 28, 2024
b8671a4
Update include/ensmallen_bits/cmaes/cmaes.hpp per suggestion
conradsnicta Nov 28, 2024
5a69d3d
Update tests/pop_cmaes_test.cpp per suggestion
conradsnicta Nov 28, 2024
32443c7
Update include/ensmallen_bits/cmaes/pop_cmaes_impl.hpp per suggestion
conradsnicta Nov 28, 2024
0b735a7
Update include/ensmallen_bits/cmaes/pop_cmaes_impl.hpp per suggestion
conradsnicta Nov 28, 2024
552a690
Update include/ensmallen_bits/cmaes/pop_cmaes_impl.hpp per suggestion
conradsnicta Nov 28, 2024
cc39308
Update include/ensmallen_bits/cmaes/pop_cmaes_impl.hpp per suggestion
conradsnicta Nov 28, 2024
7b95aa0
Update include/ensmallen_bits/cmaes/pop_cmaes_impl.hpp per suggestion
conradsnicta Nov 28, 2024
70f2064
Update include/ensmallen_bits/cmaes/pop_cmaes_impl.hpp per suggestion
conradsnicta Nov 28, 2024
8749c95
Update include/ensmallen_bits/cmaes/pop_cmaes_impl.hpp per suggestion
conradsnicta Nov 28, 2024
2456a4b
Update include/ensmallen_bits/cmaes/pop_cmaes_impl.hpp per suggestion
conradsnicta Nov 28, 2024
61d0a73
Update include/ensmallen_bits/cmaes/pop_cmaes_impl.hpp per suggestion
conradsnicta Nov 28, 2024
13fc2be
Merge branch 'mlpack:master' into restart-ipop-bipop
beny-bee Nov 28, 2024
e0ceb9e
Update HISTORY.md
beny-bee Nov 28, 2024
57da5eb
Change CMAES to CMA-ES in other places too.
rcurtin Nov 28, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
130 changes: 130 additions & 0 deletions doc/optimizers.md
Original file line number Diff line number Diff line change
Expand Up @@ -778,6 +778,69 @@ optimizer2.Optimize(f, coordinates);
* [SGD in Wikipedia](https://en.wikipedia.org/wiki/Stochastic_gradient_descent)
* [SGD](#standard-sgd)

## BIPOPCMAES

*An optimizer for [separable functions](#separable-functions).*
beny-bee marked this conversation as resolved.
Show resolved Hide resolved

BIPOP CMA-ES (Bi-Population CMA-ES) extends the idea of IPOP CMA-ES by using
conradsnicta marked this conversation as resolved.
Show resolved Hide resolved
two intertwined restart strategies: one with an increasing population size and
another maintaining a smaller, variable population size. This strategy allows
BIPOP CMA-ES to adaptively balance exploration and exploitation across the
fitness landscape, and can outperform IPOP. The larger population restarts aim
to explore broadly, improving global search capabilities, while the smaller
populations intensify the search in promising regions.

#### Constructors

* `BIPOPCMAES<`_`CMAESType`_`>()`
* `BIPOPCMAES<`_`CMAESType`_`>(`_`CMAES`_`)`
* `BIPOPCMAES<`_`CMAESType`_`>(`_`CMAES, maxRestarts`_`)`
* `BIPOPCMAES<`_`CMAESType`_`>(`_`lambda, transformationPolicy`_`)`
* `BIPOPCMAES<`_`CMAESType`_`>(`_`lambda, transformationPolicy, batchSize`_`)`
* `BIPOPCMAES<`_`CMAESType`_`>(`_`lambda, transformationPolicy, batchSize, maxIterations, tolerance, selectionPolicy`_`)`
* `BIPOPCMAES<`_`CMAESType`_`>(`_`lambda, transformationPolicy, batchSize, maxIterations, tolerance, selectionPolicy, stepSize`_`)`
* `BIPOPCMAES<`_`CMAESType`_`>(`_`lambda, transformationPolicy, batchSize, maxIterations, tolerance, selectionPolicy, stepSize, maxRestarts`_`)`

The _`CMAESType`_ template parameter is the CMA-ES type used for the optimization.
Currently, either CMAES or ActiveCMAES can be used.

#### Attributes

| **type** | **name** | **description** | **default** |
|----------|----------|-----------------|-------------|
| `CMAESType` | **`cmaes`** | The CMAES object used for optimization. | `CMAESType()` |
| `size_t` | **`maxRestarts`** | Maximum number of restarts. | `9` |
beny-bee marked this conversation as resolved.
Show resolved Hide resolved

Attributes of the optimizer may also be changed via the member methods
`CMAES()`, `MaxRestarts()`.

#### Examples:

<details open>
<summary>Click to collapse/expand example code.
</summary>

```c++
RosenbrockFunction f;
arma::mat coordinates = f.GetInitialPoint();

// IPOP Active CMA-ES
conradsnicta marked this conversation as resolved.
Show resolved Hide resolved
BoundaryBoxConstraint<> b(-1, 1);
CMAES cmaes(0, b, 32, 200, 1e-4);
BIPOPCMAES optimizer(cmaes, 5);
Optimizer.Optimize(f, coordinates);
```

</details>

#### See also:

* [CMAES](#cmaes)
* [ActiveCMAES](#activecmaes)
beny-bee marked this conversation as resolved.
Show resolved Hide resolved
* [IPOP-CMAES](#ipopcmaes)
* [Benchmarking a BI-Population CMA-ES on the BBOB-2009 Function Testbed](https://dl.acm.org/doi/pdf/10.1145/1570256.1570333)
* [Evolution strategy in Wikipedia](https://en.wikipedia.org/wiki/Evolution_strategy)

## Coordinate Descent (CD)

*An optimizer for [partially differentiable functions](#partially-differentiable-functions).*
Expand Down Expand Up @@ -1484,6 +1547,73 @@ optimizer.Optimize(f, coordinates);
* [HOGWILD!: A Lock-Free Approach to Parallelizing Stochastic Gradient Descent](https://arxiv.org/abs/1106.5730)
* [Sparse differentiable separable functions](#sparse-differentiable-separable-functions)

## IPOPCMAES

*An optimizer for [separable functions](#separable-functions).*

IPOP CMA-ES (Increasing Population Size CMA-ES) is an extension of the
Covariance Matrix Adaptation Evolution Strategy (CMA-ES). It introduces a
restart mechanism that progressively increases the population size. This
approach is beneficial for optimizing multi-modal functions,
characterized by numerous local optima. The restart mechanism is designed to
improve the adaptability of CMA-ES by improving the likelihood of escaping
local optima, thus increasing the chances of discovering the global optimum.

#### Constructors

* `IPOPCMAES<`_`CMAESType`_`>()`
* `IPOPCMAES<`_`CMAESType`_`>(`_`CMAES`_`)`
* `IPOPCMAES<`_`CMAESType`_`>(`_`CMAES, populationFactor`_`)`
* `IPOPCMAES<`_`CMAESType`_`>(`_`CMAES, populationFactor, maxRestarts`_`)`
* `IPOPCMAES<`_`CMAESType`_`>(`_`lambda, transformationPolicy`_`)`
* `IPOPCMAES<`_`CMAESType`_`>(`_`lambda, transformationPolicy, batchSize`_`)`
* `IPOPCMAES<`_`CMAESType`_`>(`_`lambda, transformationPolicy, batchSize, maxIterations, tolerance, selectionPolicy`_`)`
* `IPOPCMAES<`_`CMAESType`_`>(`_`lambda, transformationPolicy, batchSize, maxIterations, tolerance, selectionPolicy, stepSize`_`)`
* `IPOPCMAES<`_`CMAESType`_`>(`_`lambda, transformationPolicy, batchSize, maxIterations, tolerance, selectionPolicy, stepSize, populationFactor`_`)`
* `IPOPCMAES<`_`CMAESType`_`>(`_`lambda, transformationPolicy, batchSize, maxIterations, tolerance, selectionPolicy, stepSize, populationFactor, maxRestarts`_`)`

The _`CMAESType`_ template parameter is the CMA-ES type used for the optimization.
Currently, either CMAES or ActiveCMAES can be used.

#### Attributes

| **type** | **name** | **description** | **default** |
|----------|----------|-----------------|-------------|
| `CMAESType` | **`cmaes`** | The CMAES object used for optimization. | `CMAESType()` |
| `double` | **`populationFactor`** | The factor by which population increases after each restart. | `2` |
| `size_t` | **`maxRestarts`** | Maximum number of restarts. | `9` |

Attributes of the optimizer may also be changed via the member methods
`CMAES()`, `MaxRestarts()`, `PopulationFactor()`.

#### Examples:

<details open>
<summary>Click to collapse/expand example code.
</summary>

```c++
RosenbrockFunction f;
arma::mat coordinates = f.GetInitialPoint();

// IPOP Active CMA-ES
conradsnicta marked this conversation as resolved.
Show resolved Hide resolved
BoundaryBoxConstraint<> b(-1, 1);
CMAES cmaes(0, b, 32, 200, 1e-4);
IPOPCMAES optimizer(cmaes, 2, 5);
Optimizer.Optimize(f, coordinates);
```

</details>

#### See also:

* [CMAES](#cmaes)
* [ActiveCMAES](#activecmaes)
* [BIPOPCMAES](#bipopcmaes)
* [A Restart CMA Evolution Strategy With Increasing Population Size](http://www.cmap.polytechnique.fr/~nikolaus.hansen/cec2005ipopcmaes.pdf)
* [Evolution strategy in Wikipedia](https://en.wikipedia.org/wiki/Evolution_strategy)


## IQN

*An optimizer for [differentiable separable functions](#differentiable-separable-functions).*
Expand Down
2 changes: 2 additions & 0 deletions include/ensmallen.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -103,6 +103,8 @@
#include "ensmallen_bits/bigbatch_sgd/bigbatch_sgd.hpp"
#include "ensmallen_bits/cmaes/cmaes.hpp"
#include "ensmallen_bits/cmaes/active_cmaes.hpp"
#include "ensmallen_bits/cmaes/ipop_cmaes.hpp"
#include "ensmallen_bits/cmaes/bipop_cmaes.hpp"
#include "ensmallen_bits/cd/cd.hpp"
#include "ensmallen_bits/cne/cne.hpp"
#include "ensmallen_bits/de/de.hpp"
Expand Down
147 changes: 147 additions & 0 deletions include/ensmallen_bits/cmaes/bipop_cmaes.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,147 @@
/**
* @file bipop_cmaes.hpp
* @author Marcus Edel
* @author Benjami Parellada
*
* Definition of the BIPOP Covariance Matrix Adaptation Evolution Strategy
* as proposed by N. Hansen in "Benchmarking a BI-population CMA-ES on the
* BBOB-2009 function testbed".
*
* ensmallen is free software; you may redistribute it and/or modify it under
* the terms of the 3-clause BSD license. You should have received a copy of
* the 3-clause BSD license along with ensmallen. If not, see
* http://www.opensource.org/licenses/BSD-3-Clause for more information.
*/
#ifndef ENSMALLEN_CMAES_BIPOP_CMAES_HPP
#define ENSMALLEN_CMAES_BIPOP_CMAES_HPP

#include "cmaes.hpp"

namespace ens {

/**
* BI-Population CMA-ES is a variant of the stochastic search algorithm
* CMA-ES - Covariance Matrix Adaptation Evolution Strategy.
* It implements a dual restart strategy with varying population sizes: one
* increasing and one with smaller, varied sizes. This BI-population approach
* is designed to optimize performance on multi-modal function testbeds by
* leveraging different exploration and exploitation dynamics.
*
* For more information, please refer to:
*
* @code
* @inproceedings{hansen2009benchmarking,
* title={Benchmarking a BI-population CMA-ES on the BBOB-2009 function testbed},
* author={Hansen, Nikolaus},
* booktitle={Proceedings of the 11th annual conference companion on genetic and evolutionary computation conference: late breaking papers},
* pages={2389--2396},
* year={2009}}
* @endcode
*
* BI-Population CMA-ES can efficiently handle separable, multimodal, and weak
* structure functions across various dimensions, as demonstrated in the
* comprehensive results of the BBOB-2009 function testbed. The optimizer
* utilizes an interlaced multistart strategy to balance between broad
* exploration and intensive exploitation, adjusting population sizes and
* step-sizes dynamically.
*
* @tparam CMAESType The type of CMA-ES used for optimization. Options include standard CMAES and variants like ActiveCMAES.
*/
template<typename CMAESType = CMAES<>>
class BIPOPCMAES
{
public:
/**
* Construct the BIPOP CMA-ES optimizer with the given CMAES object,
* and maximum number of restarts. The defaults
* here are not necessarily good for the given problem, so it is
* suggested that the values used be tailored to the task at hand. The
* maximum number of iterations refers to the maximum number of points that
* are processed (i.e., one iteration equals one point; one iteration does not
* equal one pass over the dataset).
*
* @param CMAES The CMAES object.
* @param populationFactor The factor by which population increases
* after each restart.
* @param maxRestarts Maximum number of restarts.
*/
BIPOPCMAES(const CMAESType& CMAES = CMAESType(),
const size_t maxRestarts = 9);

/**
* Construct the BIPOP CMA-ES optimizer with the given function and parameters.
* The defaults here are not necessarily good for the given problem, so it
* is suggested that the values used be tailored to the task at hand. The
* maximum number of iterations refers to the maximum number of points that
* are processed (i.e., one iteration equals one point; one iteration does
* not equal one pass over the dataset).
*
* @param lambda The initial population size (0 use the default size).
* @param transformationPolicy Instantiated transformation policy used to
* map the coordinates to the desired domain.
* @param batchSize Batch size to use for the objective calculation.
* @param maxIterations Maximum number of iterations allowed(0 means no
limit).
* @param tolerance Maximum absolute tolerance to terminate algorithm.
* @param selectionPolicy Instantiated selection policy used to calculate the
* objective.
* @param stepSize Starting sigma/step size (will be modified).
* @param populationFactor The factor by which population increases
* after each restart.
* @param maxRestarts Maximum number of restarts.
*/
BIPOPCMAES(const size_t lambda = 0,
const typename CMAESType::transformationPolicyType&
transformationPolicy = typename CMAESType::transformationPolicyType(),
const size_t batchSize = 32,
const size_t maxIterations = 1000,
const double tolerance = 1e-5,
const typename CMAESType::selectionPolicyType&
selectionPolicy = typename CMAESType::selectionPolicyType(),
double stepSize = 0,
const size_t maxRestarts = 9);

/**
* Optimize the given function using BIPOP CMA-ES. The given starting point will be
* modified to store the finishing point of the algorithm, and the final
* objective value is returned.
*
* @tparam SeparableFunctionType Type of the function to be optimized.
* @tparam MatType Type of matrix to optimize.
* @tparam CallbackTypes Types of callback functions.
* @param function Function to optimize.
* @param iterate Starting point (will be modified).
* @param callbacks Callback functions.
* @return Objective value of the final point.
*/
template<typename SeparableFunctionType,
typename MatType,
typename... CallbackTypes>
typename MatType::elem_type Optimize(SeparableFunctionType& function,
MatType& iterate,
CallbackTypes&&... callbacks);

//! Get the maximum number of restarts.
size_t MaxRestarts() const { return maxRestarts; }
//! Modify the maximum number of restarts.
size_t& MaxRestarts() { return maxRestarts; }

//! Get the CMAES object.
const CMAESType& CMAES() const { return cmaes; }
//! Modify the CMAES object.
CMAESType& CMAES() { return cmaes; }

private:
//! Maximum number of restarts.
size_t maxRestarts;

//! The CMAES object used for optimization.
CMAESType cmaes;
};

} // namespace ens

// Include implementation.
#include "bipop_cmaes_impl.hpp"

#endif
Loading