强化学习系列文章

强化学习系列文章,第1张

强化学习系列文章(二十八):进化强化学习EvoRL的预实验

最近在研究强化学习解决离散空间的组合优化问题时,接触到了很多进化算法,实际体验也是与RL算法不相上下。进化算法也常用于优化神经网络的参数,CMA-ES算法是进化算法中的佼佼者,被World Model等工作采用,对于数百到数千参数规模的优化问题比较擅长。我会陆续把进化强化学习的实验例程整理出来,请批评指正。

首先安装cma
pip install cma
cma对象的初始化

x0是初始解,又称起始点。
sigma0是初始标准差,控制了初始种群与初始解的偏差程度,标准差越大,偏差越大。
'popsize'是可选参数,作为字典传入,手动设置种群规模。

es = cma.CMAEvolutionStrategy(x0=[0.]*100,
                                sigma0=0.1,
                                inopts={'popsize': 100
                                })
cma的交互

cma采用所谓ask-and-tell interface,也就是两个最主要的函数,下文中的es.ask()es.tell()函数。es.ask()输出一组解,解的数量是前面定义的popsize。用户拿到解集,输入objective function,算出fitness,fitness应该是与解集长度相等的list。将fitness连同解集一并输入es.tell(),就完成了一次迭代。

cma实验

新建文件,输入如下代码

import cma
import numpy as np
import matplotlib.pyplot as plt

def fitness(x):
    x = np.array(x)
    return ((x-np.pi)**4).sum()

es = cma.CMAEvolutionStrategy(x0=[0.]*100,
                                sigma0=0.1,
                                inopts={'popsize': 100
                                })

log = []
for _ in range(200):
    solutions = es.ask()
    fit = []
    for solution in solutions:
        fit.append(fitness(solution))
    log.append([min(fit),max(fit)])
    es.tell(solutions, fit)

print('best solution',solutions[np.argmin(fit)])

log = np.array(log)
plt.plot(log[:,0])
plt.plot(log[:,1])
plt.grid(); plt.xlabel('iteration'); plt.ylabel('fitness value')
plt.legend(['min fit in pop', 'max fit in pop'])
plt.show()

得到优化结果,横轴iteration,纵轴loss。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/915822.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-16
下一篇 2022-05-16

发表评论

登录后才能评论

评论列表(0条)

保存