Evolution Strategy (ES) adalah teknik optimasi yang didasarkan pada gagasan adaptasi dan evolusi. Anda dapat mempelajarinya lebih lanjut di https://blog.openai.com/evolution-strategies/
Ini kompatibel dengan python2 dan python3.
Instal dari sumber:
$ python setup.py install
Instal versi terbaru dari repositori git menggunakan pip:
$ pip install git+https://github.com/alirezamika/evostra.git
Instal dari PyPI:
$ pip install evostra
(Anda mungkin perlu menggunakan python3 atau pip3 untuk python3)
Seorang agen AI belajar bermain flappy bird menggunakan evostra
Seorang agen AI belajar berjalan menggunakan evostra
Bobot masukan modul EvolutionStrategy adalah daftar larik (satu larik dengan bentuk apa pun untuk setiap lapisan jaringan saraf), jadi kita bisa menggunakan kerangka kerja apa pun untuk membangun model dan meneruskan bobotnya ke ES.
Misalnya kita bisa menggunakan Keras untuk membangun model dan meneruskan bobotnya ke ES, tapi di sini kita menggunakan model FeedForwardNetwork bawaan Evostra yang jauh lebih cepat untuk kasus penggunaan kita:
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 ])
Sekarang kita mendefinisikan fungsi get_reward kita:
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
Sekarang kita dapat membangun objek EvolutionStrategy dan menjalankannya untuk beberapa iterasi:
# 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 )
Inilah hasilnya:
ulangi 100. hadiah: -68.819312 iter 200. hadiah: -0,218466 iter 300. hadiah: -0,110204 iter 400. hadiah: -0,001901 iter 500. hadiah: -0,000459 iter 600. hadiah: -0,000287 iter 700. hadiah: -0,000939 iter 800. hadiah: -0,000504 iter 900. hadiah: -0,000522 iter 1000. hadiah: -0,000178
Sekarang kami memiliki bobot yang dioptimalkan dan kami dapat memperbarui model kami:
optimized_weights = es . get_weights ()
model . set_weights ( optimized_weights )