我正在尝试在C#中实现增强拓扑的神经演化。我遇到了经常性连接的问题。据我所知,对于经常性的连接,输出基本上是暂时的。
http://i.imgur.com/FQYjCLZ.png
在链接图像中,我展示了一个非常简单的神经网络,其中 2个输入,3个隐藏节点和一个输出。没有激活功能或传递功能,我认为它将被评估为:
var adapter:foodAdapter? = null
但是,我很难弄清楚如何识别链接e是经常性连接的事实。我读到的关于NEAT的论文展示了XOR问题的最小解和双极无速度问题如何都有重复连接。
如果您有固定的拓扑结构,这似乎相当简单,因为您可以自己分析拓扑,并确定需要延迟的连接。
您如何确定这些连接?
答案 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。
仍有一些问题需要解决。例如:如果神经元的唯一输入是循环连接怎么办?但我想您将能够自行解决此问题...