如何评估 NEAT 神经网络?

人工智能 神经网络 遗传算法 进化算法 整洁的
2021-10-22 01:03:42

我正在尝试编写自己的 NEAT 实现,但我被困在计算网络输出的网络评估函数上。

你可能知道,NEAT 包含一组神经网络,通过添加新节点和新连接,拓扑结构不断演变。但是随着之前未连接的节点之间增加了新的连接,我看到一个我去评估的时候会出现问题,我用一个例子来解释一下: 网络

INPUTS = 2 yellow nodes
HIDDEN = 3 blue nodes
OUTPUT = 1 red node

在图像中添加了一个连接 node3 到 node5 的新连接,如果我还没有计算 node3 的输出,我该如何计算 node5 的输出,这取决于 node5 的输出?

(不考虑激活函数)

node5 output =  (1 * 0.5) + (1 * 0.2) + (node3 output * 0.8)
node3 output =  ((node5 output * 0.7) * 0.4)
4个回答

考虑执行顺序,5 将具有无效值,因为它尚未设置为 3。但是,第二次应该设置一个值。经过充分的训练后,无效值应该会下降。

0 -> 5
1 -> 5
5 -> 2
2 -> 3
3 -> 4
3 -> 5
RESTART
0 -> 5
1 -> 5

我可以想到两种可能的方式来强制 NEAT 创建一个前馈网络。一个优雅的一个,一个有点笨重的;

  1. 只允许“添加连接”突变将一个节点与另一个距输入节点的最大距离更大的节点连接起来。这应该会导致前馈网络,而无需太多额外的工作。(紧急属性很棒!)
  2. 像你一样运行并使用 NEAT 创建一个完全连接的网络,然后在前向传递期间对其进行修剪。创建网络后,运行它并删除尝试连接到已在前向传递中使用的节点的连接(示例 3->5)。或者,只需在前向传递期间删除到节点的未使用输入连接。鉴于 NEAT 的变异方式,您不可能移除重要连接并将网络一分为二。NEAT 的这一特性可确保您的信号始终能够到达输出端,即使您移除了那些“向后指向”的连接。

我相信这些应该可以工作,但是我还没有测试过它们。

最初的 NEAT 论文假设了一个前馈 ANN,尽管它所描述的实现会产生一个完全连接的网络。我认为这只是他们所使用的范式的假设。这种混乱是完全可以理解的。

以下是 NEAT 网络评估的伪代码(由原始源代码转换而来),

Until all the outputs are active
    for all non-sensor nodes
        activate node
        sum the input
    for all non-sensor and active nodes
        calculate the output

请注意,根据原作者的说法,前馈概念没有递归。

在我的实现中,我使用递归系统来计算输出节点。它的工作原理如下:

  1. 假设一个前馈网络

仅允许“添加连接”突变将节点与另一个节点连接,该节点与输入节点的最大距离更大。这应该会导致 > 前馈网络,而无需太多额外的工作。(紧急属性很棒!)

  1. 定义函数x,一个接受节点号的递归函数
  2. 定义函数y,第二个函数,它接收一个节点并返回与该节点的所有连接作为输出

在递归函数中:

  1. 调用函数y

  2. x在函数 y 输出上调用函数

  3. 如果参数forx是任何输入节点,则返回节点值。

这是我能想到的最优雅的实现方式,并且比显式跟踪所有连接要简单得多。