参数化策略梯度演化策略的Python实现

pepg-es的Python项目详细描述


参数探索策略梯度

参数探索策略梯度[3]演化策略的Python实现

要求

  • Python>;=3.6
  • Numpy公司

可选

  • 健身房
  • mpi4py公司

安装

  • 来自PyPI
pip3 install pepg-es
  • 来源
^{pr2}$

关于实施

我实现了一些不同于原始文件的事情

  • 将秩变换[1]应用于适应度得分。在
  • 使用Adam[2]优化器更新平均值。在
  • 权重衰减应用于平均值,类似于[4]。在

使用

参考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)

参考文献

  1. Daan Wierstra,Tom Schaul,Tobias Glasmachers,Yi Sun,Jan Peters和Jurgen Schmidhuber。自然进化战略。2014年
  2. 迪德里克·P·金马和吉米·巴。亚当:一种随机优化方法。2014年
  3. F.Sehnke,C.Osendorfer,T.rucksties,a.Graves,J.Peters和J.Schmidhuber。探索政策梯度。2010年
  4. Tim Salimans,Jonathan Ho,Xi Chen,Szymon Sidor和Ilya Sutskever。进化策略作为强化学习的一个可扩展的替代方案。2017年

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java Box2D销毁正文原因:FailedToWriteCoreDumpCoreDumpsShaveBeenDisabled   java如何使用maven构建spring boot应用程序的jar库   java How-to-know项目是使用Eclipse或NetBeans创建的   应用程序未运行时的java推送计划通知   GSON将json值反序列化为Java对象   java如何使用javamail添加内联图像?   java在同一战争中从另一个Web服务调用Web服务apache cxf   java如何在没有OutOfMemory错误的情况下从Android上传大文件?   javajavax。加密。BadPaddingException:给定的最后一个块未正确填充完整示例   java OpenGL矩阵乘法导致奇数浮点行为   java如何以编程方式更改网格窗格的行数?   如何根据java中的字母顺序对对象数组[包含名称、地址等详细信息]进行排序?   java构造函数类不能应用于给定的类型;必需:int,int found:无参数原因:实际参数和以前的参数长度不同   firebase在Java代码注释中使用方括号的目的是什么?   spring boot Java Hibernate继承和onetomany   使用jackson将json数组转换为数组中具有不同对象元素的java对象   java希望将数据库中的数据存储在lucene索引文件中,并检索表信息和数据