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

时间:2017-07-23 20:15:46

标签: artificial-intelligence evolutionary-algorithm

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

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

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

var adapter:foodAdapter? = null

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

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

您如何确定这些连接?

2 个答案:

答案 0 :(得分:2)

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

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

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

  • 每当您想要创建连接时,请确保'from'神经元具有layerNumber< Double.maxValue

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

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

如果您遵循所有规则,则应始终只有转发连接。没有经常性的。如果你想要经常性的连接,你可以通过交换'from'和amp;来创建它们。在创建新连接时“到”。

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

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

希望它不是太复杂......

答案 1 :(得分:0)

好的,因此,我不是要告诉您没有经常性的连接,而是要告诉您如何识别它们。

您需要了解的第一件事是,在所有其他连接神经元之后计算了循环连接。因此,哪个连接是循环的,哪个不依赖于NN的计算顺序。 另外,第一次将数据放入系统时,我们仅假设每个连接均为零,否则无法计算部分或全部神经元。

让我们说我们有这个神经网络: Neural Network

我们将此网络分为3层(即使从概念上讲它分为4层):

Input Layer  [1, 2]
Hidden Layer [5, 6, 7]
Output Layer [3, 4]

第一条规则:输出层的所有输出都是循环连接

第二条规则:可能首先计算输入层的所有输出

我们创建两个数组。一种包含所有神经元连接的计算顺序,另一种包含所有(潜在)递归连接。 现在这些数组看起来像这样:

Order of 
calculation: [1->5, 2->7 ]

Recurrent:   [ ]

现在,我们从查看输出层开始。我们可以计算神经元3吗?没有?因为缺少6。我们可以计算6吗?没有?因为5不见了。等等。看起来像这样:

3, 6, 5, 7

问题在于我们现在陷入了循环。因此,我们引入了一个临时数组,其中存储了我们已经访问过的所有神经元ID:

[3, 6, 5, 7]

现在我们问:我们可以计算7吗?不,因为缺少6。但是我们已经参观了6 ...

[3, 6, 5, 7,] <- 6

第三条规则是:当您访问之前已经访问过的神经元时,请将您对该神经元遵循的连接设置为循环连接。 现在,您的数组如下所示:

Order of 
calculation: [1->5, 2->7 ]

Recurrent:   [6->7 ]

现在,您完成了该过程,最后将计算数组的顺序与您的循环数组结合在一起,以便循环数组紧随另一个数组之后。 看起来像这样:

[1->5, 2->7, 7, 7->4, 7->5, 5, 5->6, 6, 6->3, 3, 4, 6->7]

假设我们有[x-> y,y]

其中x-> y是x * weight(x-> y)的计算

其中y是Sum(y的输入)的计算。因此,在这种情况下,Sum(x-> y)或只是x-> y。

仍有一些问题需要解决。例如:如果神经元的唯一输入是循环连接怎么办?但我想您将能够自行解决此问题...