Стратегия эволюции (ES) — это метод оптимизации, основанный на идеях адаптации и эволюции. Вы можете узнать больше об этом на https://blog.openai.com/evolution-strategies/.
Он совместим как с Python2, так и с Python3.
Установить из исходников:
$ python setup.py install
Установите последнюю версию из репозитория git, используя pip:
$ pip install git+https://github.com/alirezamika/evostra.git
Установить из PyPI:
$ pip install evostra
(Возможно, вам придется использовать python3 или pip3 для python3)
Агент ИИ учится играть в Flappy Bird с помощью эвостры
ИИ-агент учится ходить с помощью эвостры
Входные веса модуля EvolutionStrategy представляют собой список массивов (один массив любой формы для каждого слоя нейронной сети), поэтому мы можем использовать любой фреймворк для построения модели и просто передавать веса в 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 )
Вот результат:
итер 100. награда: -68,819312 итер 200. награда: -0,218466 итер 300. награда: -0,110204 итер 400. награда: -0,001901 итер 500. награда: -0,000459 итер 600. награда: -0,000287 итер 700. награда: -0,000939 итер 800. награда: -0,000504 итер 900. награда: -0,000522 итер 1000. награда: -0,000178
Теперь у нас есть оптимизированные веса и мы можем обновить нашу модель:
optimized_weights = es . get_weights ()
model . set_weights ( optimized_weights )