如何识别任意神经网络中的循环连接

Man*_*ein 3 artificial-intelligence evolutionary-algorithm

我正在尝试在 C# 中实现增强拓扑的神经进化。我遇到了经常性连接的问题。我知道,对于循环连接,输出基本上是暂时移位的。

http://i.imgur.com/FQYjCLZ.png

在链接的图像中,我展示了一个非常简单的神经网络,它有2 个输入、3 个隐藏节点一个输出。如果没有激活函数或传递函数,我认为它会被评估为:

n3[t] = (i1[t]*a + n6[t-1]*e)*d + i2[t]*b*c) * f
Run Code Online (Sandbox Code Playgroud)

但是,我很难弄清楚如何识别链接 e 是循环连接的事实。我读到的关于 NEAT 的论文展示了 XOR 问题和双极无速度问题的最小解是如何具有循环连接的。

如果您有固定的拓扑结构,这似乎相当简单,因为您可以自己分析拓扑结构,并确定需要延迟哪些连接。

您将如何准确识别这些联系?

PLE*_*TIC 6

当我开始实施这篇论文时,我遇到了类似的问题。我不知道你的网络现在是什么样子,所以我会向你解释我所做的。

我的网络仅作为输入和输出层开始。为了创建连接和神经元,我实现了某种 DNA(在我的例子中,这是一系列指令,例如“将神经元 2 与神经元 5 连接,并将权重设置为 0.4”)。我网络中的每个神经元都有一个“layerNumber”,它告诉我一个神经元在我的网络中的位置。这个 layerNumber 是为每个输入和输出神经元设置的。对于输入神经元,我使用了 Double.minvalue,对于输出神经元,我使用了 Double.maxvalue。

这是基本设置。从现在开始,修改网络时只需遵循以下规则:

  • 每当你想创建一个连接时,确保'from'神经元有一个 layerNumber < Double.maxValue

  • 每当您想创建连接时,请确保“to”神经元的 layerNumber 大于“from”神经元的 layerNumber。

  • 每当一个连接被分成 2 个连接和它们之间的神经元时,将神经元 layerNumber 设置为 NeuronFrom.layerNumber*0.5 + NeuronTo.layerNumber*0.5 这很重要,你不能将它们相加并简单地除以 2,因为这会可能会导致 Double.maxValue + 一些东西,它会返回一些奇怪的数字(我猜会发生溢出,所以你会得到一个负数?)。

如果您遵循所有规则,则应该始终只有转发连接。没有复发的。如果您想要循环连接,您可以通过在创建新连接时交换 'from' 和 'to' 来创建它们。

专业技巧:仅使用一个神经元数组列表。让 DNA 使用神经元的 ID 来找到它们,但创建一个“连接”类,它将神经元对象作为属性。过滤连接/神经元时使用 ArrayList.stream().filter()

当稍后通过网络传播时,您只需按层数对神经元进行排序,设置 inputValues 并使用 for() 循环遍历所有神经元。只需计算神经元输出值并将其传输到每个具有连接的神经元,其中 'from' 是 == 当前神经元。

希望不要太复杂...