前言(或我如何偶然发现遗传算法和强化学习)
奇怪的是,在2017年初,我对机器学习的知识主要限于经济学中使用的技术:GLM,时间序列分析和各种统计量度。 经济学的目标是找到可以很好地拟合数据的模型,但更为关键的是,它提供了某种方式来解释“现实世界”中发生的事情(在许多情况下给出了虚假的解释,从而最好进行冗长的讨论,或者在最坏的情况下用一些精心挑选的变量来支持某些先验信念)。 我对机器学习的迷恋源于它的反向方法-找到最能预测看不见数据的模型,而很少考虑解释它。 换句话说,将重点放在有效的内容上,而不是可以解释的内容上。 这似乎无限有用,即使它不允许我听起来那么聪明。
开普敦大学统计系出色的学术人员,再加上免费的出色在线资料(尤其是吴安德的Coursera和deeplearning.ai课程),使我得以掌握所需的主要监督和非监督方法和工具。创建有用的模型和分析。 但是,有一些我从未完全理解的东西:一台机器没有一组标记的数据(正确答案的示例)时,如何学习? 这似乎是一个更为根本的问题,因为它非常类似于我们个人面临的问题。
当时我正在阅读Siddhartha Mukherjee的《基因》 (这本书是我建议作为了解遗传学和我们自己的一种便捷途径)。 让我吃惊的是,进化过程是如此复杂,因为突变发生在遗传水平上,但是这些基因以不可预测的方式表达,并且在基因型和表型之间存在多对多的映射。 您不能将物理特征向后工程为一系列碱基对,也不能创建一系列碱基对并准确预测物理特征。 您可以做的是观察自然选择会滤除无法帮助生物体生存和繁殖的特征。
这两个关于我们如何在没有答案的情况下学习的思想,以及有机体如何在遗传水平上突变以根据其在环境中的物理特征进化的思想,使我开始研究遗传算法如何在进化更好的强化学习剂中发挥作用。
强化学习
在许多方面,强化学习(RL)比监督学习更直观,尽管许多RL方法都使用监督学习方法。 RL与我们的学习方式类似:我们探索,做出错误或做出明智的决定,并根据该经验来更新未来的行为。 通常,在满足以下条件时使用RL:
- 一开始没有标记的示例可供学习
- 有一些可能的奖励功能可以衡量任务执行是否良好
- 行动可能不会立即获得回报,但会在将来的某个时间影响结果
在我的论文中,我使用了OpenAI的Universe平台中的Pong环境-这是一个简单的游戏,您需要向上或向下移动球拍以尝试将球移过其他玩家(例如Ping Pong)。 这是一个您可以自己玩的版本。 作为游戏的玩家,您面临上述条件:您没有看到任何成对的屏幕截图和良好的操作; 当您得分时,会有一个计分计数器上升; 您可以在连续的点之间多次向上和向下按下。 与RL特工相比,人类玩此游戏的区别在于,人类已经对游戏背后的物理原理有了直观的了解,但是RL特工只知道屏幕上的像素,其采取的动作以及得分。它收到了。 那么,它如何学习呢?
我的论文利用了A3C强化学习,这是“异步优势演员批评”的缩写,它听起来并不复杂! 该方法可分为其组成部分:
- 批评者 :一种模型,该模型查看过去的操作,然后形成一个视图,以考虑在新情况下最佳的操作。
- 参与者 :选择采取哪种行动的模型(代理本身)。
- 优势 :评论家对演员的反馈,包括演员本应如何做出更好的选择,以及这些选择可能有多好。
- 异步 :A3C的真正突破-许多特工并行学习游戏并异步更新彼此的体验。


上面的图表帮助显示了整个A3C流程,但是在这些框架内,有执行监督学习的深层神经网络模型:它们基于对环境中代理行为的观察反馈来调整其参数。 这些神经网络由正上方图中的蓝色框表示。 A3C框架指导着他们的学习方式,但他们本身就是代理商。 他们从环境中获取输入作为屏幕像素(上方的绿色框),并输出要采取的操作以及他们认为该操作的效果(上方的橙色框)。

上图显示了有关采取措施并输出这些措施值的“前馈”代理的更简单视图。 游戏中的帧由针对图像进行优化的神经网络(主要是卷积层,具体取决于突变)进行处理,然后传递至递归神经网络(LSTM),以确保将先前时间步骤中的记忆纳入决策中:之所以重要,是因为像Pong这样的游戏不能像像国际象棋一样满足“马尔可夫属性”的要求-并非所有关于可能的未来状态的信息都包含在单个帧中,这主要是由于桨和球的运动所致。
神经网络的体系结构和超参数以及从经验中学习的能力越好,游戏中将采取的动作就越好,得分就越高。
遗传算法
许多人已经使用RL来训练代理商很好地玩Pong或其他游戏(包括更复杂的游戏)。 但是,神经网络体系结构的设计通常是根据研究人员的经验或该领域新生的启发式方法手工制作的。 有时,拥有足够计算资源的研究人员甚至可能会着手进行某种网格搜索-但这仍然是有限的,如下图所示。

网格搜索的一项改进是随机搜索,但是即使那样,您对搜索空间的探索也不够充分。 当您的模型设计包含许多不同的超参数时,尤其如此-排列可能接近无限! 更好的方法是搜索已经起作用的东西,并在一个好的设计中进行磨练,而一种自然的方法是使模型体系结构经受进化的过程。
EA(进化算法)的一种版本是GA(遗传算法)。 这个想法是随机产生一组以超参数和层表示的基因,用一些适应度函数过滤它们,选择一些最适合的,并通过突变这些来创建新的种群。 然后,每个模型都由基因染色体定义,但表型是在RL环境中执行的实际体系结构—基因突变与“物理”环境中可能发生的情况之间存在脱节。 遗传算法的主要目的是滤除每一代中不适合的染色体,以便可以对相对适合的染色体进行突变,以便更好地探索它们周围的遗传空间。 较弱的染色体可能仍会在后代中产生,因为它可能是很小的遗传变化,表现为显着的表型变化-但是,染色体应该进化以更好地在其环境中生存,并最终产生合适且健壮的模型架构。
(在此感谢Emmanuel DuFourq和Bruce Bassett在GA方面的出色工作-参见EDEN)
这里有一些细微差别:
- 您可以定义“适合”的外观。 在本文中,我针对Pong的长期最佳性能进行了优化,同时还针对性能的稳定性以及模型的运行效率进行了优化。
- 最好通过在选择过程中具有一定程度的随机性来选择一些较弱的染色体。 这些染色体可能距离非常合适的染色体仅几处突变。
怎么样了
经过数月的编写和调整棘手的代码(并使环境在AWS上运行!),所有这些都奏效了,这真是一种解脱。
我发现有趣的结果包括三个主要方面:
- 进化过程
- 洞悉哪种神经网络架构运行良好
- 寻找性能优于OpenAI研究的架构
认为您知道进化是什么以及它是如何工作的,是在短时间内实际创建和观察多代的一件事。 下表有点密集,但我认为它显示了染色体如何突变和存活:每行是一条染色体,可能已出现在多代中,或者在单代中出现了一次以上,并且它们按亲本的顺序排列染色体,以显示某些祖先如何对最终人口的大部分负责,即使他们的能力不足以生存。 在观察到这种情况发生之后,我对进化有很多见解和疑问-我最喜欢的是某些染色体如何死亡,但在后代变异回它们后又重新世代化身。 让我想知道,这是否曾经发生在人类身上-几代人今天走来走去的确切副本!

(接下来的几段使用了一些技术性的语言……如果您不熟悉卷积神经网络,请跳至“结论性思想”。)
观察性能良好并传递遗传材料到后代的神经网络架构和超参数,有许多观察结果证实了该领域的某些启发式方法,而有些则没有:
- 一个明显的问题是:有一个学习率最佳点,即如果您不在那儿,那么代理就不会学习任何东西,或者完全失败(比随机的情况差)。
- 更多的卷积层并不总是更好-主要是由于输出维数的减少。
- 多个卷积层可以在不损失太多信息的情况下,与降低卷积的尺寸方面与卷积层和池化层相同。
- ELU(指数线性单位)功能是迄今为止最成功的激活类型。 尽管泄漏的ReLU还算不错,但ReLU的表现相当差。 这对我来说是最令人惊讶的结果,因为在文献中我很少碰到ELU。
- 每个卷积层的滤波器的相对数量很重要。 在较早的层中较少的过滤器,在较后的层中较多的过滤器,效果最佳。 这是一种众所周知的启发式方法:较早的图层需要较少的参数,因为它们可以拾取诸如边缘之类的低级特征,但是较后的图层则可以拾取更复杂的特征,例如人脸或特定人群(当使用人脸识别类比)。
下表显示了在实验过程中发现的示例染色体。 该染色体的最古老的祖先在第一层具有ReLU激活和更多的卷积过滤器,但是该染色体最终以非常优越的适应性出现,但需要较低的模型能力来实现。

尽管论文中发现的许多染色体比最初使用的OpenAI设计要好,但这是根据我为实验设计的适应度函数得出的。 而且,OpenAI架构的性能仍然非常好,这表明了启发式算法和一些具有大量计算资源的网格搜索的用处(并非所有人都非常幸运!)。 特别是,这些性能更好的染色体在三种方面表现更好:
- 在100个游戏间隔内打败Pong游戏,保持更高的一致性
- 精通任务的噪音降低较少
- 做好工作所需的模型容量较小,这意味着可以更快地训练和执行任务
这是锦标赛得分函数,其中β_1和β_2都设置为0.5。 我想我可能对游戏情节评分进行了太多优化,并且很想在其他运行中尝试新参数,以查看是否可以找到容量更低的模型。

结论性思想
我个人的目标是尝试一些困难的事情,并希望学到比平时更多的知识。 在线上有如此多的免费免费资料,以及价格合理的优秀课程,我得以快速掌握所需的许多基本知识。 但是,我的大部分学习工作都发生在代码无法正常工作的边缘,并且结果很差-在很多时间里,阅读Stack Overflow,尝试新方法以及只用一张空白纸思考问题都是我真的受益匪浅。 MSc是执行此操作的有用的强制功能-传统和在线教育之间的有趣组合,对我来说非常有效。
在以后的文章中,我计划写一些与RL和EA在日常生活中的相似之处。 关于学习,探索和过滤的思考方式,有很多应用。