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

2023-12-10

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

https://i.stack.imgur.com/bI4Pc.png

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

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

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

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

您究竟如何识别这些联系?


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

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

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

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

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

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

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

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

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

希望不要太复杂...

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • Python 中的变量作用域问题

    我是 Python 新手 并且已经使用它一段时间了 但我遇到了一个问题 这是我的代码 def collatz num ctr if num 1 ctr 1 if num 2 0 collatz num 2 ctr else collatz

随机推荐