HyperNEAT:介绍一种神经演化方法!

点击上方关注,All in AI中国

上周,我写了一篇关于NEAT(神经演化的增强拓扑)的文章,我们讨论了很多围绕算法的很酷的事情。我们还简要地谈到了这个旧算法如何影响我们今天构建网络的方式,暗指神经网络不需要完全手工构建。

今天,我们将深入探讨一种不同的神经演化方法,即NEAT的扩展,称为HyperNEAT。您可能还记得,NEAT对其网络结构进行了直接编码。这样,网络可以更直观地演化,一个节点接一个节点,一个连接接一个连接。 HyperNEAT放弃了这个想法,因为为了发展像大脑这样的网络(拥有数十亿个神经元),人们需要一种更快的方式来发展这种结构。

HyperNEAT是一个概念上更复杂的算法(至少在我看来),我正在努力理解它的运作方式。今天,我们将深入研究一下这个算法的一些组成部分,以便我们可以更好地理解是什么让它变得如此强大,以及在这个深度学习的时代对未来扩展的理解。

HyperNEAT

动机

在深入研究论文和算法之前,我认为值得进一步探索HyperNEAT背后的动机。

该论文的全称是“一种基于超立方体的大规模神经网络进化间接编码”(A Hypercube-Based Indirect Encoding for Evolving Large-Scale Neural Networks),有点拗口!但是,我们已经看到了两个主要观点。这是一个基于超立方体的间接编码。我们稍后会进入超立方体部分,但我们已经知道这是从直接编码到间接编码的转变(请参阅我上一篇关于NEAT的博客,以更详细地描述两者之间的一些差异)。此外,我们也得到了它背后的主要推理:进化大型神经网络!

更重要的是,该算法的创建者强调,如果要观察大脑,他们会看到一个拥有数十亿节点和数万亿连接的“网络”。他们看到一个使用重复结构的网络,重复使用相同基因的映射来多次生成相同的物理结构。他们还强调人类大脑的构建方式是为了利用世界的物理特性:对称性(具有结构镜像,例如输入两只眼睛)和局部性(结构中的节点影响它们的连接和功能) 。

对比我们对神经网络的了解,可以通过演化程序构建,也可以手工构建并训练。这些性质都成立吗?当然,如果我们强迫网络具有对称性和局部性,可能......但是,即便如此,采用密集的前馈网络,其中一层中的所有节点都连接到下一个节点中的所有节点!在查看由HyperNEAT算法构建的网络时?他们往往是杂乱无章、零星的,并且没有表现出好的规律性。

输入HyperNEAT!通过称为组合型模式生成网络(CPPN)的东西利用间接编码,HyperNEAT尝试利用几何属性来生成具有这些很好的特征的非常大的神经网络,我们可能希望在我们的演化网络中看到这些特征。

什么是组合模式生成网络?

在上一篇文章中,我们讨论了编码,今天我们将深入研究用于HyperNEAT的间接编码。现在,间接编码比你想象的要普遍得多。事实上,你自己也有一个!

DNA是间接编码,因为表型结果(我们实际看到的)比基因型内容(DNA中的基因)大几个数量级。如果你看一下人类基因组,我们会说它有大约30,000个基因,编码大约30亿个氨基酸。好吧,大脑有3万亿个连接。显然,这里有些间接的东西!

从生物学的概念中借鉴的东西是一种称为发育编码的编码方案。这是指所有基因都应该能够在发育过程中和个体内的任何位置的任何时间点被重复使用。组合模式生成网络(CPPN)是这一概念的抽象,已被证明它能够为笛卡尔空间中的重复结构创建模式。查看使用CPPN生成的一些结构:

HyperNEAT:介绍一种神经演化方法!

纯CPPN

表型可以描述为n维的函数,其中n是表型性状的数量。我们所看到的是从遗传编码到展示特征的一些转变的结果。通过组合简单的函数,实际上可以很容易地表示复杂的模式。诸如对称性、重复性、不对称性和变异之类的东西都很容易脱离这样的编码结构,具体取决于生成的网络类型。

我们将更深入地了解CPPN在这种情况下如何具体使用的具体细节。

NEAT

在HyperNEAT中,原始NEAT论文重新出现了一堆熟悉的属性。随着时间的推移,复杂化等事情很重要(如果需要,我们将从简单和渐进的复杂性开始)。将使用历史标记,以便我们可以正确排列编码以进行任何类型的交叉。也将使用统一的起始种群,以便从一开始就没有通配符和不兼容的网络。

本文和之前使用NEAT的主要区别是什么? HyperNEAT使用NEAT来演化CPPN,而不是使用NEAT算法直接进化神经网络。这意味着CPPN使用了更多的“激活”函数,因为像高斯这样的东西会产生对称性,而三角函数则有助于重复结构。

算法

那么现在,我们已经讨论了CPPN是什么以及我们使用NEAT算法进化和调整它们,这就引出了这些在整个HyperNEAT环境中如何实际使用的问题?

首先,我们需要介绍基板( substrate)的概念。在HyperNEAT的范围内, 基板只是节点的几何排序。最简单的示例可以是平面或网格,其中每个离散(x,y)点都是一个节点。连接CPPN实际上将采用这些点中的两个并计算这两个节点之间的权重。我们可以将其视为以下等式:

CPPN(x1,y1,x2,y2)= w

HyperNEAT:介绍一种神经演化方法!

CPPN是一个进化的CPPN,就像我们在前面部分讨论过的那样。我们可以看到,在这样做时,每个节点实际上都会在它们之间建立某种权重连接(甚至允许循环连接)。连接可以是正的或负的,也可以定义最小权重大小,以便低于该阈值的任何输出都不会导致连接。

节点的几何布局必须在任何CPPN的演化之前指定。结果,随着CPPN的发展,实际连接权重和网络拓扑将产生一个几何模式(所有输入都基于节点的位置)。

如果节点布置在某种二维平面或网格上,CPPN是四维的函数,因此我们可以说它是在四维超立方体上演化的。

产生的模式的规律性

我们之前提到的所有规律都很容易脱离这样的编码。通过在x1和x2之类的函数上使用对称函数可以实现对称性。这可以是类似高斯函数的函数。当对称性用于x和y之类的事物时,可能会出现不完美的对称性,但仅针对一个轴。

重复也像我们之前提到的那样,具有周期函数,例如正弦、余弦等。并且与对称性一样,可以通过在基底的非重复方面上引入周期函数来引入重复的变化。因此,所有针对的四个主要规则都能够从这种编码中发展出来。

HyperNEAT:介绍一种神经演化方法!

基板配置

您可能已经从上面猜到基板的配置是至关重要的,这很有道理。在生物学中,某种东西的结构与其功能有关。因此,在我们自己的演化模式中,节点的结构与特定任务中可见的功能和性能紧密相关。

在这里,我们可以看到原始论文中特别概述的几种基材配置:

HyperNEAT:介绍一种神经演化方法!

我认为查看三维立方体的配置非常重要,并注意它如何简单地将我们的CPPN方程从四维调整为六维:

CPPN(x1,y1,z1,x2,y2,z2)= w

此外,通过仅允许一半以上的节点连接到另一半,可以将网格扩展到夹层配置。这可以很容易地看作输入/输出配置!该论文的作者实际上使用这种配置在输入一半时进行视觉激活,并使用它来激活输出一半上的某些节点。

圆形布局也很有趣,因为几何不必是配置的网格。相反,可以使用径向几何体,允许从圆形可以表示的独特几何图形中衍生出有趣的行为属性。

输入和输出布局

输入和输出在CPPN演变之前布局。然而,与传统的神经网络不同,我们的HyperNEAT算法可以了解输入和输出的几何结构,并且可以学习利用和接受它的规律性。通过HyperNEAT接收的额外信息,可以轻松利用输入和输出的位置和重复。

HyperNEAT:介绍一种神经演化方法!

基板分辨率

HyperNEAT的另一个强大而独特的特性是能够上下调整基板的分辨率。那是什么意思?好吧,假设您根据特定大小的图像改进了HyperNEAT网络。当被扩展到新大小时,被利用以在该大小上执行良好的基础几何结构导致相同的模式。除此之外,不需要额外的训练。它只是缩放到另一个尺寸大小!

算法综述

我认为有关该算法如何工作的所有信息,值得总结其步骤。

  • 1.选择基板配置(节点的布局和输入/输出所在的位置)
  • 2.创建一个统一的、最小的初始连接CPPN初始种群
  • 3.重复直到解决方案:
  • 4.为每个CPPN
  • (a)使用CPPN为神经网络生成连接
  • (b)评估神经网络的性能
  • 5.使用NEAT算法重现CPPN

结论

我们终于得到它了!这是HyperNEAT算法,如果您希望了解更多细节或希望了解他们使用算法进行的一些实验(我特别喜欢他们的食物采集机器人实验),我建议您直接查看论文。

对未来有什么影响?这也是我最近一直在考虑的事情。现在是否有从HyperNEAT到训练传统深层网络的搭配?这是训练深度网络的更好方法吗?还有另一篇关于Evolvable Substrate HyperNEAT的论文,其中实际的 substrates也在不断发展,这是我希望将来探索的论文!但该论文中是否隐藏了HyperNEAT与深度神经网络之间的差距?只有时间会告诉我们,我们才能回答这个问题!

HyperNEAT:介绍一种神经演化方法!