evostra
1.0.0
進化戦略 (ES) は、適応と進化の考え方に基づいた最適化手法です。詳細については、https://blog.openai.com/evolution-strategies/ をご覧ください。
python2 と python3 の両方と互換性があります。
ソースからインストールします。
$ python setup.py install
pip を使用して git リポジトリから最新バージョンをインストールします。
$ pip install git+https://github.com/alirezamika/evostra.git
PyPI からインストールします。
$ pip install evostra
(python3 または python3 の場合は pip3 を使用する必要がある場合があります)
evostra を使用して羽ばたき鳥の遊び方を学習する AI エージェント
evostra を使用して歩行を学習する AI エージェント
EvolutionStrategy モジュールの入力重みは配列のリスト (ニューラル ネットワークの各層に任意の形状を持つ 1 つの配列) であるため、任意のフレームワークを使用してモデルを構築し、重みを ES に渡すだけです。
たとえば、Keras を使用してモデルを構築し、その重みを ES に渡すことができますが、ここでは、ユースケースでははるかに高速な Evostra の組み込みモデル FeedForwardNetwork を使用します。
import numpy as np
from evostra import EvolutionStrategy
from evostra . models import FeedForwardNetwork
# A feed forward neural network with input size of 5, two hidden layers of size 4 and output of size 3
model = FeedForwardNetwork ( layer_sizes = [ 5 , 4 , 4 , 3 ])
ここで get_reward 関数を定義します。
solution = np . array ([ 0.1 , - 0.4 , 0.5 ])
inp = np . asarray ([ 1 , 2 , 3 , 4 , 5 ])
def get_reward ( weights ):
global solution , model , inp
model . set_weights ( weights )
prediction = model . predict ( inp )
# here our best reward is zero
reward = - np . sum ( np . square ( solution - prediction ))
return reward
これで、EvolutionStrategy オブジェクトを構築し、いくつかの反復で実行できるようになりました。
# if your task is computationally expensive, you can use num_threads > 1 to use multiple processes;
# if you set num_threads=-1, it will use number of cores available on the machine; Here we use 1 process as the
# task is not computationally expensive and using more processes would decrease the performance due to the IPC overhead.
es = EvolutionStrategy ( model . get_weights (), get_reward , population_size = 20 , sigma = 0.1 , learning_rate = 0.03 , decay = 0.995 , num_threads = 1 )
es . run ( 1000 , print_step = 100 )
出力は次のとおりです。
iter 100。報酬: -68.819312 iter 200。報酬: -0.218466 iter 300。報酬: -0.110204 iter 400。報酬: -0.001901 iter 500。報酬: -0.000459 iter 600。報酬: -0.000287 iter 700。報酬: -0.000939 iter 800。報酬: -0.000504 iter 900。報酬: -0.000522 iter 1000。報酬: -0.000178
これで重みが最適化されたので、モデルを更新できます。
optimized_weights = es . get_weights ()
model . set_weights ( optimized_weights )