Press "Enter" to skip to content

“具有回顾经验重放的NEAT”

在几周前在Unity中实现了NEAT之后,我尝试思考如何改进其性能。

我记得曾经读过一种在强化学习算法中使用的新颖技术,称为“回顾式经验重放”。通过这种技术,代理器达到的失败状态被追踪并学习,就像它们是成功一样。

起初,我没有给予太多关注。由于NEAT采用的种群方法,一个种群能够在许多不同的方向上搜索一个领域。这意味着由一个物种收集的经验对于该物种之外的基因组是不适用的。然而,这时我有了一个想法:如果每个物种都维护一个独立的经验列表会怎么样?

我立即开始测试我的想法。

测试环境

一个环境设置如下:

作者提供的图片

代理器在左下角生成,并且需要到达左上角的星星。代理器只能跳得足够高以落在底部两个平台上。

代理器的外观如下:

作者提供的图片

对于输入,代理器接收到的是(归一化):

目标位置与代理器位置之间的差异

代理器位置

代理器的纵向速度

代理器是否在地面上并且可以跳跃

代理器周围的16个射线投射的结果,返回它们击中的最近平台的距离。

对于输出,代理器提供:

一个输出,用于左移(小于0.5)或右移(大于0.5)

一个输出,用于跳跃(大于0.5)或不跳跃(小于0.5)

配置

每一代的25%由无性繁殖产生。通过交叉繁殖产生的部分基因组有35%的突变几率。每个物种中最好的两个基因组保持不变,并且有5%的几率发生物种间交叉繁殖。初始种群中有2000个基因组,以确保种群具有足够的成员能够攀登第一个平台,但是后续的几代只有500个基因组。如果一代中没有发现达到目标的代理器,该种群被视为失败。

回顾式经验重放需要一些调整才能与NEAT一起工作,但最终我选择了以下策略:

从每个基因组在一代结束时抽取目标/经验(最后一个平台,以确保目标不会漂浮在空中),并满足以下条件:

  1. 样本距离起点的跳跃次数较多,以确保不会在底部采样。
  2. 样本距离已经被采样的同一物种的每个目标都有一定的距离。

将这些目标添加到每个基因组的物种中,以便每个物种都维护一个独立的目标列表。

当创建新的一代时,以一种方式为每个物种分配两个目标,使成功率最高的目标最不可能被分配。注意,新采样的目标被视为成功率为0%。然后,对每个代完成三次评估,一次为真实目标,两次为采样目标。

通过以下两个值计算适应度:

(起点距离-最近距离)/起点距离

以奖励代理器靠近目标

(起点距离-终点距离)/终点距离

以奖励代理器保持靠近目标

如果代理器在底部停留时间过长,将其从模拟中移除并给予惩罚。这主要是为了加快评估速度。

对于具有HER的NEAT,奖励值被立方以放大好与坏解决方案之间的差异。这些值如果代理器远离目标则可以为负。

为了确保每个物种能够被评估三次,每个物种都有两个起始样本(用蓝色钻石表示),但事后证明这是不必要的(对糟糕的笑话表示抱歉)。来源:作者提供的图片

结果

只使用距离奖励的标准NEAT在这个问题上表现不佳,十次中有六次失败。NEAT在找到正确路径并解决问题时极度依赖一系列巧合的突变。然而,当它无法做到时,它就会陷入局部最小值,只能爬上左边的平台而无法进一步。

标准NEAT无法再往上爬了。

另一方面,带有HER的NEAT表现得相当不错。它以中位数149代(标准偏差:90)解决了这个问题,而且一次都没有失败,尽管它在最差的尝试中花费了415代。有趣的是,带有HER的NEAT就像一次新奇性搜索:随着早期样本由于分配方法的变化而变得更加罕见,代理被迫探索环境中新的、更难到达的区域。重要的是要注意,目标目标似乎是偶然发现的,尽管更多的训练可能会教会代理如何在环境中到达任何点,而不是记住一系列的步骤。

采样目标促进探索并减少过早收敛的可能性。

然而,重要的是不要过分夸大这个成就。使用根据y值奖励代理的奖励函数,标准NEAT以中位数94代(标准偏差:36)解决了这个问题,评估时间更短,但一次失败。

结论

带有HER的NEAT可以适度促进在困难问题上的泛化和成功,而无需手动干预适应度函数。然而,这带来了增加的评估时间和较慢的收敛速度,与精心设计的适应度函数相比。有趣的是,可能可以无需明确目标地以这种方式训练代理。当然,每个物种仍然必须至少有一个样本目标以进行训练,但除此之外,采样和分配的策略可以促进领域的探索,无论是否有明确的目标。

Leave a Reply

Your email address will not be published. Required fields are marked *