从遗传算法到OpenAI新方向:进化策略工作机制全解--省流版原论文来自https://www.jiqizhixin.com/articles/2017-11-11

文章探讨了神经网络中的反向传播算法在深度学习中的应用,强调了强化学习中梯度估计的挑战,特别是信度分配问题。CMA-ES和进化策略在处理复杂优化问题上的优势和局限,以及在MNIST数据集上与梯度方法的比较,展示了进化策略的独特之处和适用场景。
摘要由CSDN通过智能技术生成

神经网络模型具有高度的表达性和灵活性。如果能找到一系列合适的模型参数,我们就可以运用神经网络去解决许多有挑战性的问题。深度学习的成功主要来源于反向传播算法,因为它可以有效地使用每个模型的参数去计算目标函数的梯度。有了这些梯度,我们就能有效地在参数空间中选取好的解,来解决我们的神经网络解决难题。

然而,也有许多反向传播算法无法应用的问题。举个例子,在强化学习(reinforcement learning)当中,我们同样可以训练一个神经网络,从而形成一系列的行动决策,去完成环境中的某些任务。然而,特别是在未来多个时间步才能实现回报的情况下,通过当下的动作去估计未来奖励信号的梯度是非常重要的。梯度能够告诉我们,如果我们稍微改变参数的值,损失函数或奖励信号会朝着哪个方向变化,从而帮助我们更新参数以朝着更好的方向前进。退一步说,即使我们可以计算准确的梯度,在强化学习中也有许多陷入局部最优的情况。

信度分配问题(credit-assignment problem)是指在神经网络或机器学习模型中,当模型取得某个输出结果时,如何将这个结果的准确性或贡献分配给模型中的不同组件或参数的问题。解决信度分配问题对于理解和优化复杂的神经网络模型非常重要,整个强化学习领域都致力于研究这个信度分配问题近年来也有很大的进展。然而,当奖励信号非常稀疏时,信度分配问题仍非常困难。

在真实世界里,奖励可能是稀疏且有噪声的。有时候,我们只是得到了一个简单的奖励,比如一张年终奖金支票,而且其数目取决于我们的雇佣者,我们可能很难确切地知道为什么奖金如此之低。对于这些问题,与其依赖这些高噪声、且很有可能无意义的未来梯度信号估计,我们不如直接忽略任何的梯度信号,并尝试着使用一些黑盒优化技术(black-box optimization),例如遗传算法(genetic algorithms)或进化策略。尽管进化策略比强化学习的数据效率低,它仍然有许多优势。进化策略摈弃梯度计算的方法,从而能更有效地评价这些算法。同时,利用进化策略算法,很容易将计算分配到上千台机器中完成并行计算。研究发现,通过多次运行进化策略算法,相较于强化学习算法,使用进化策略算法发现的策略种类更多。

进化策略的定义多种多样。我们可以将之定义为,一种为用户提供多个竞争方案以评估问题的算法。这个评估是基于一个给定解决方案的目标函数,并会返回单个拟合(fitness)值。基于当下解决方案的拟合结果,算法会接着提供下一代的竞争方案,与当前代的方案相比,这些方案更有可能会得到更好的结果。一旦提出了用户满意的最佳方案,迭代进程就会结束。 简单遗传算法有许多复杂的变形,比如 CoSyNe、ESP 和 NEAT,它们的想法主要是将类似的解决方案集聚到不同的种类中,从而更好地在过程中更好地保持多样性。 简单进化策略和遗传算法的一个共同缺点是,标准差的噪声参数是固定的。

协方差矩阵自适应进化策略(Covariance-Matrix Adaptation Evolution Strategy , 以下简称 CMA-ES)可得到每一代的结果,并且适应性的增加或减小下一代的搜索范围。它不只是根据 μ和σ* *调整适应性,还会计算整个参数空间的协方差矩阵。在每一代中,CMA-ES 会提供一个多变量的正态分布的参数,用于下一代的抽样。CMA-ES 算法,作为无梯度优化算法中最流行的算法之一,它真正唯一的缺点是,当我们需要解决的模型参数太多时,协方差的计算复杂度将变成 O(N^2),尽管现在已经将其近似成为 O(N)。在参数的数量小于 1000 时,我会选用 CMA-ES。当然,如果足够耐心,此算法也可以用于上至 10000 个参数的情形。

自然进化策略:使用每一代中每个方案的全部信息,无论是好是坏。这样,有了这些梯度信号的评估,我们就能将全部方案在下一代中朝着更好的方向发展。既然我们需要评估梯度,我们就可以使用应用于深度学习的标准随机梯度下降算法(SGD)。当然,我们也可以使用动量随机梯度下降算法(Momentum SGD),均方根传播算法(RMSProp),或 Adam 算法进行优化。同时,需要的一个抽样方案进行期望拟合度评分(fitness score)的优化。如果期望结果足够好,那么在抽样的一代中,表现最佳的方案可能表现更好,所以对期望进行优化是一个明智的方案。将某个抽样方案的期望拟合度评分最大化,其实几乎等同于将全体的拟合度评分进行最大化。

OpenAI 的进化策略:是 REINFORCE-ES 算法的特例。特别地,σ 被定为一个常量,只有 μ 在每一代中被更新。在这个简化之外,该论文同样提出了更新规则的修正,从而适用于不同工作机器的并行计算。该更新规则使用一个固定值种子预计算一大群随机数。这样的话,每个工作机器可以复制其他机器的参数,并且每个机器只需要与其他机器进行一个数字的简单通信,这个数字也就是最终的拟合度结果。如果我们想将进化策略扩展到成千上万个不同的工作机器中去,这就显得非常重要了。因为在每一代的更新中,每次都将一整个解向量传输上百万次并不太现实,但是只传输最终的拟合度结果却也许可行。这篇论文展示,通过利用亚马逊 EC2 的 1440 个机器,他们可以使用十几分钟的时间解决 Mujoco 仿真机器人步行问题。在理论上,我以为这个并行更新规则对那些同样可以调整 σ 的原始算法也有效。但也许在实际上,他们只是想在大型并行计算实验中,把可变的部分减小到最小值。这篇富有启发性的论文同样讨论了许多其他将进化策略应用到强化学习方面的实际案例。我非常推荐大家继续深入学习。

拟合度塑造 上述大部分算法通常会与拟合度塑造(fitness shaping)方法相结合。下面我想说说基于等级的拟合度塑造方法(rank-based fitness shaping method)。拟合度塑造会避免当前样本中的异常值主导(上文提到的)近似梯度计算:

如果一个特殊的 F(z^m) 比当前样本中其他 F(z^i) 都大得多,梯度就可能被这个异常值所主导,从而增大了算法陷入局部最优的可能性。为了减轻这个问题,可以应用拟合度的等级转化。我们将给结果进行评级,不使用实际的拟合度函数,而是使用一个与解的等级成比例的增强拟合度函数(augmented fitness function)。下面就是原始拟合度和基于等级的拟合度的结果对比:

假设我们有一个大小为 101 的样本。我们会根据实际拟合度函数评价每一个样本,然后根据拟合度挑选解。比如,我们会给最差的方案提供一个增强拟合度函数值,-0.50,然后给第二差的方案标值为 -0.49,……,给次优方案标值 0.49,给最优方案标值 0.50。这个增强拟合度值的集合将会取代实际的拟合度值,被用于计算下一次梯度更新。从某种程度上,这有点类似于用更直接一点的办法,即对结果使用批标准化(Batch Normalization)。也有一些拟合度塑造的其他类似方法,不过它们最后都基本会给出一个类似的结论。拟合度塑造对于具有非确定性目标函数策略神经网络的强化学习中非常有用。此外,它同时作用于这样的情况——地图是随机形成且竞争方案有随机策略;而这也是强化学习环境常常会出现的情况。对于那些确定性的、表现良好的函数而言,使用拟合度塑造塑形用处不大,而且有时会拖慢找到优化解的时间。

MNIST 数据集

比起基于梯度的算法,进化策略可能是一个发现更多新颖解决方案的算法。然而,进化策略在许多可计算高质量梯度的问题中,比基于梯度的算法仍然要差得多。

既然所有的机器学习算法都应该在 MNIST 上进行测试,我也尝试着用这些进化策略算法,使用一个 2 层的用于分类 MNIST 的卷积网络寻找权重。当然,这只是想看看我们跟随机梯度下降相比处在什么位置。因为这个卷积网络只有约 1.1 万个参数,所以我们使用了较慢一点的 CMA-ES 算法。在 https://github.com/hardmaru/pytorch_notebooks/tree/master/mnist_es 中,可以获得相关代码和实验过程。

下面是使用了不同进化策略的结果。我们用大小为 101 的样本计算了 300 代。我们持续追踪了每一代结束时表现最好的模型参数,并且在进行 300 代计算之后在测试集中评估了这个模型。有趣的是,有时候测试集的精确度比那些得分较低的训练集模型的精确度高。

基于一次运行的结果表明,CMA-ES 在 MNIST 训练集任务当中表现得最好,不过 PEPG 算法也紧随其后。两者都达到了近 98% 的准确度,比 SGD 或 Adam 算法的基准线大约低 1%。也许那种动态改变协方差矩阵的能力,以及逐代改变标准差参数的能力,使得它能较好地调节权重,这比简单的 OpenAI 的 ES 算法要略胜一筹。

文章提到的上述算法很有可能有开源执行方案。CMA-ES 的作者,Nikolaus Hansen, 已经在维护一个基于 numpy 的 CMA-ES 方案,这个方案还有许多附加功能。他的这个 python 方案,使我之前接触了训练循环的接口。因为这个接口非常容易使用,我使用这个接口执行了一些其他的算法,比如简单遗传算法、PEPG 算法,还有 OpenAI 的 ES 算法等等。我把它们放在了一个简单的 python 文件中,名为 es.py,并且把原始的 CMA-ES 也放了进去。这样的话,我就可以只通过改变代码中的一两行,快速比较不同的 ES 算法:

import es



#solver = es.SimpleGA(...)

#solver = es.PEPG(...)

#solver = es.OpenES(...)

solver = es.CMAES(...)



while True:



 solutions = solver.ask()



 fitness_list = np.zeros(solver.popsize)



 for i in range(solver.popsize):

   fitness_list[i] = evaluate(solutions[i])



 solver.tell(fitness_list)



 result = solver.result()



 if result[1] > MY_REQIRED_FITNESS:

   break

可以在 Github 和 Ipython notebook 上看到使用不同进化策略的实例:https://github.com/hardmaru/estool/blob/master/simple_es_example.ipynb

在这个携带有 es.python 的 Ipython notebook ( https://github.com/hardmaru/estool/blob/master/simple_es_example.ipynb) 上,我向你展示了使用 es.py 中的进化策略,解决具有更多局部最优的十维 Ras 函数优化问题的办法。这个十维版本的问题比上述用于可视化的二维版本的问题更难。以下是上述讨论过的算法的性能比较:

在这个十维 Ras 问题中,没有一个优化方案达到了全局最优解。不过 CMA-ES 比较接近,远远超过了其他任何算法。PEPG 和 NES 在第二位,OpenAI-ES 以及遗传算法落在后面。我不得不使用退火办法减小 OpenAI-ES 的 σ 值,让它在这个任务中表现得好一些。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值