参数化策略梯度演化策略的Python实现
pepg-es的Python项目详细描述
参数探索策略梯度
参数探索策略梯度[3]演化策略的Python实现
要求
- Python>;=3.6
- Numpy公司
可选
- 健身房
- mpi4py公司
安装
- 来自PyPI
pip3 install pepg-es
- 来源
关于实施
我实现了一些不同于原始文件的事情
使用
参考PEPG-ES/examples 文件夹以获取更完整的示例。在
异或示例
- 寻找异或门的神经网络参数。在
- 像PEPG这样的黑盒优化算法在 强化学习领域,因为他们不需要 反向传播计算梯度。在监督学习中 使用反向传播更快、更可靠。因此,使用反向传播 解决异或问题会更快。我通过解决XOR演示了这个库 因为这很容易理解。在
frompepgimportPEPG,NeuralNetwork,Adam,sigmoidimportnumpyasnpnetwork=NeuralNetwork(input_size=2,output_size=1,hidden_sizes=[2],hidden_activation=sigmoid,output_activation=sigmoid)# Adam Optimizer is the default optimizer, it is written for the exampleoptimizer_kwargs={'beta_1':0.9,'beta_2':0.999,'epsilon':1e-08}# Adam Parameterses=PEPG(population_size=100,theta_size=network.number_of_parameters,mu_init=0,sigma_init=2.0,mu_lr=0.3,sigma_lr=0.2,optimizer=Adam,optimizer_kwargs=optimizer_kwargs)truth_table=[[0,1],[1,0]]solution_found=FalsewhileTrue:print(f'Step: {es.step}')solutions=es.get_parameters()rewards=[]forsolutioninsolutions:network.weights=solutionerror=0forinput_1inrange(len(truth_table)):forinput_2inrange(len(truth_table[0])):output=int(round(network([input_1,input_2])[0]))error+=abs(truth_table[input_1][input_2]-output)reward=(4-error)**2rewards.append(reward)es.update(rewards)ifes.best_fitness==16:print('Solution Found')print(f'Parameters: {es.best_theta}')break
- 输出:
Step: 233 Step: 234 Step: 235 Step: 236 Step: 237 Solution Found Parameters: [1.25863047 -0.73151503 -2.53377723 1.01802355 3.02723507 1.23112726 -2.00288859 -3.66789242 4.56593794]
文件
PEPG类
es=PEPG(self,population_size,theta_size,mu_init,sigma_init,mu_lr,sigma_lr,l2_coeff=0.005,optimizer=Adam,optimizer_kwargs={})
- 参数:
- population_-size:int:进化策略的种群大小。在
- theta_sizeint:将优化的参数数。在
- mu_initfloat:初始平均值。在
- sigma_init浮点:初始sigma。在
- mu\u lrfloat:平均值的学习率。在
- sigma_lrfloat:西格玛的学习率。在
- l2_coefffloat:重量衰减系数。在
- optimizer优化器:要使用的优化器
- optimizer_kwargsDict[str,Any]:除学习速率外的优化器参数。在
solutions=self.get_parameters(self)
- 围绕平均值创建对称样本,并返回大小为的numpy数组 [总体大小,θ大小]
self.update(self,rewards)
- 参数:
- rewards:List[float]:给定解决方案的奖励。在
- 更新平均值和西格玛。在
self.save_checkpoint(self)
- 创建检查点并将其保存到created中时间。时间()。检查点文件。在
es=PEPG.load_checkpoint(cls,filename)
- 创建一个新的PEPG类并加载检查点。在
self.save_best(self,filename)
- 保存最好的θ和mu,以及用来创建最佳θ的sigma。在
theta,mu,sigma=PEPG.load_best(cls,filename)
- 从给定的文件加载theta、mu和sigma数组。在
神经网络类
NeuralNetwork(self,input_size,output_size,hidden_sizes=[],hidden_activation=lambdax:x,output_activation=lambdax:x,bias=True):
- 参数:
- input_size:int:网络的输入大小。在
- output_size:int:网络的输出大小。在
- hidden_size:List[int]:隐藏层的大小。在
- hidden_激活:Callable[[float],float]:隐藏层中使用的激活函数。在
- output_activation:Callable[[float],float]:在输出处使用的激活函数。在
- bias:bool:添加bias节点。在
self.save_network(self,filename)
- 将网络保存到文件中。在
network=NeuralNetwork.load_network(cls,filename)
- 创建一个新的NeuralNetwork类并加载给定的网络文件。在
自定义优化器示例
frompepgimportPEPG,Optimizer,NeuralNetworkclassCustomOptimizer(Optimizer):def__init__(self,alpha,parameter,another_parameter):self.alpha=alphaself.parameter=parameterself.another_parameter=another_parameterdef__call__(self,gradients):gradients=(gradients+self.parameter)*self.another_parameterreturn-self.alpha*gradientsnetwork=NeuralNetwork(input_size=2,output_size=1)optimizer_kwargs={'parameter':0.3,'another_parameter':0.2}es=PEPG(population_size=100,theta_size=network.number_of_parameters,mu_init=0.0,sigma_init=2.0,mu_lr=0.3,sigma_lr=0.2,optimizer=CustomOptimizer,optimizer_kwargs=optimizer_kwargs)
参考文献
- Daan Wierstra,Tom Schaul,Tobias Glasmachers,Yi Sun,Jan Peters和Jurgen Schmidhuber。自然进化战略。2014年
- 迪德里克·P·金马和吉米·巴。亚当:一种随机优化方法。2014年
- F.Sehnke,C.Osendorfer,T.rucksties,a.Graves,J.Peters和J.Schmidhuber。探索政策梯度。2010年
- Tim Salimans,Jonathan Ho,Xi Chen,Szymon Sidor和Ilya Sutskever。进化策略作为强化学习的一个可扩展的替代方案。2017年
- 项目
标签: