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 모듈의 입력 가중치는 배열 목록(신경망의 각 레이어에 대해 임의의 모양을 가진 하나의 배열)이므로 모든 프레임워크를 사용하여 모델을 구축하고 가중치를 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 iter 200. 보상: -0.218466 반복 300. 보상: -0.110204 반복 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 )