استراتيجية التطور (ES) هي تقنية تحسين تعتمد على أفكار التكيف والتطور. يمكنك معرفة المزيد عنها على https://blog.openai.com/evolution-strategies/
إنه متوافق مع كل من python2 وpython3.
التثبيت من المصدر:
$ python setup.py install
قم بتثبيت أحدث إصدار من مستودع git باستخدام النقطة:
$ pip install git+https://github.com/alirezamika/evostra.git
التثبيت من PyPI:
$ pip install evostra
(قد تحتاج إلى استخدام python3 أو pip3 لـ python3)
عميل الذكاء الاصطناعي يتعلم لعب فلابي بيرد باستخدام evostra
عميل الذكاء الاصطناعي يتعلم المشي باستخدام evostra
أوزان الإدخال لوحدة EvolutionStrategy هي قائمة من المصفوفات (مصفوفة واحدة بأي شكل لكل طبقة من الشبكة العصبية)، حتى نتمكن من استخدام أي إطار عمل لبناء النموذج وتمرير الأوزان إلى ES.
على سبيل المثال، يمكننا استخدام Keras لبناء النموذج وتمرير أوزانه إلى ES، لكننا هنا نستخدم نموذج FeedForwardNetwork المدمج في Evostra والذي يعد أسرع بكثير بالنسبة لحالة الاستخدام الخاصة بنا:
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 )