Evolution Strategy (ES) ist eine Optimierungstechnik, die auf Ideen der Anpassung und Evolution basiert. Mehr darüber erfahren Sie unter https://blog.openai.com/evolution-strategies/
Es ist sowohl mit Python2 als auch mit Python3 kompatibel.
Von der Quelle installieren:
$ python setup.py install
Installieren Sie die neueste Version aus dem Git-Repository mit pip:
$ pip install git+https://github.com/alirezamika/evostra.git
Von PyPI installieren:
$ pip install evostra
(Möglicherweise müssen Sie Python3 oder Pip3 für Python3 verwenden.)
Ein KI-Agent, der mit Evostra lernt, Flappy Bird zu spielen
Ein KI-Agent, der mit Evostra laufen lernt
Die Eingabegewichte des EvolutionStrategy-Moduls sind eine Liste von Arrays (ein Array mit beliebiger Form für jede Schicht des neuronalen Netzwerks), sodass wir jedes Framework zum Erstellen des Modells verwenden und die Gewichte einfach an ES übergeben können.
Zum Beispiel können wir Keras verwenden, um das Modell zu erstellen und seine Gewichte an ES zu übergeben, aber hier verwenden wir Evostras integriertes Modell FeedForwardNetwork, das für unseren Anwendungsfall viel schneller ist:
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 ])
Jetzt definieren wir unsere get_reward-Funktion:
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
Jetzt können wir das EvolutionStrategy-Objekt erstellen und es für einige Iterationen ausführen:
# 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 )
Hier ist die Ausgabe:
Iter 100. Belohnung: -68,819312 Iter 200. Belohnung: -0,218466 Iter 300. Belohnung: -0,110204 Iter 400. Belohnung: -0,001901 Iter 500. Belohnung: -0,000459 Iter 600. Belohnung: -0,000287 Iter 700. Belohnung: -0,000939 Iter 800. Belohnung: -0,000504 Iter 900. Belohnung: -0,000522 Iter 1000. Belohnung: -0,000178
Jetzt haben wir die optimierten Gewichte und können unser Modell aktualisieren:
optimized_weights = es . get_weights ()
model . set_weights ( optimized_weights )