好吧,与其告诉你不要有经常性连接,我实际上会告诉你如何识别它们。
您需要知道的第一件事是循环连接是在所有其他连接和神经元之后计算的。因此,哪个连接是循环的,哪个不是循环的,取决于您的 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。
这里还有一些问题需要解决。例如:如果神经元的唯一输入是循环连接怎么办?但我想你可以自己解决这个问题......