CMA-ES (Covariance Matrix Adaptation Evolution Strategy)

CMA-ESとは?

CMA-ESは、最適化問題、特に連続関数の最適化に用いられる進化的アルゴリズムの一種です。

この記事では下記のパッケージを利用して、CMS-ESを実施して最適化を行ってみます。

インストール

pip install cma

最適化を行う関数を定義

def rosenbrock(x):
    return (1 - x[0])**2 + 100 * (x[1] - x[0]**2)**2

最適化を行う関数を定義します。

今回は、最適化アルゴリズムの性能を評価するためのベンチマーク関数としてよく利用されるローゼンブロック関数としました。

$$
f(x,y)=(a−x) ^{2} +b(y−x ^{2})^{ 2}
$$

ここで $${𝑎=1}$$ と $${𝑏=100}$$とします。この関数は$${ (𝑥,𝑦)=(1,1)}$$ で最小値0を取ります。

CMA-ESアルゴリズムで最適化

import cma

initial_params = [0, 0] 

es = cma.CMAEvolutionStrategy(initial_params, 0.5, {'maxiter': 100})
result = es.optimize(rosenbrock)

初期値を0, 0として、CMA-ESアルゴリズムでローゼンブロック関数を最適化してみます。初期の標準偏差は0.5です。またmaxiterは最大イテレーション数で、ここでは100回を指定しています。

最適化の結果

result.result._asdict()

最良の解(xbest)は、[1.00001505, 1.00002913]で、理論的な最小値 [1, 1] に非常に近い値を得られました。

{
"xbest": array([1.00001505, 1.00002913]),
"fbest": 3.213743722393161e-10,
"evals_best": 580,
"evaluations": 600,
"iterations": 100,
"xfavorite": array([0.99999245, 0.99998588]),
"stds": array([2.58718604e-05, 5.17288986e-05]),
"stop": {"maxiter": 100},
}