最近在研究强化学习解决离散空间的组合优化问题时,接触到了很多进化算法,实际体验也是与RL算法不相上下。进化算法也常用于优化神经网络的参数,CMA-ES算法是进化算法中的佼佼者,被World Model等工作采用,对于数百到数千参数规模的优化问题比较擅长。我会陆续把进化强化学习的实验例程整理出来,请批评指正。
首先安装cmapip 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()
,就完成了一次迭代。
新建文件,输入如下代码
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。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)