【问题标题】:Hopefield contribution matrix pattern recognitionHopefield 贡献矩阵模式识别
【发布时间】:2014-01-16 15:52:45
【问题描述】:

我在看书:

Jeff Heaton 第二版的 C# 神经网络简介

特别是关于 Hopefield 网络的章节。他解释了如何计算给定布尔数组作为模式的贡献矩阵。

例如,给定以下模式0101,对应的贡献矩阵(权重)为:

0  -1  1  -1
-1  0 -1  1
1  -1  0  -1
-1  1 -1  0

识别模式的过程遵循以下规则:

我们现在必须将这些权重与 0101 的输入模式进行比较。我们 将仅将与包含的位置相对应的权重相加 输入模式中的 1。每个神经元的激活结果 如下所示。

N1 = -1 + -1 = -2
N2 = 0 + 1 = 1
N3 = -1 + -1 = -2
N4 = 1 + 0 = 1

如果没有激活函数,这些值是没有意义的。这 用于 Hopfield 网络的激活函数是任何更大的值 比零,所以下面的神经元会被激发。

N1 激活结果为–2;不会触发 (0)
N2激活结果为1;将开火 (1)
N3 激活结果为–2;不会触发(0)

N4激活结果为1;将触发 (1)

如您所见,我们将二进制值 1 分配给所有神经元 被激发,并且所有未激发的神经元的二进制值为 0。这 Hopfield 网络的最终二进制输出将是 0101。这是 与输入模式相同。

他还说:

如果我们也想识别 1001,那么我们将计算两者 贡献矩阵并添加结果以创建连接 权重矩阵

所以我计算第二个贡献矩阵:

0  -1  -1  1
-1  0  1  -1
-1  1  0  -1
1  -1 -1  0

并添加两个矩阵:

0 -2 0 0
-2 0 0 0
0 0 0 -2
0 0 -2 0

显然(按照前面的规则)最后一个矩阵不能识别任何前面的模式。这怎么可能?哪里出错了?

编辑:(添加作者提供的示例)

考虑到提供的example,这两种模式是:

1100 -> [1 1 -1 -1]

0   1   -1  -1
1   0   -1  -1
-1  -1  0   1
-1  -1  1   0

1000 -> [1 -1 -1 -1]

0   -1  -1  -1
-1  0   1   1
-1  1   0   1
-1  1   1   0

加法:

0   0   -2  -2
0   0   0   0
-2  0   0   2
-2  0   2   0

乘以[1 1 -1 -1]

4   0   -4  -4

乘以[1 -1 -1 -1]

4   0   -4  -4

在这两种情况下,识别的模式都是1000(缺少1100)。因此,这里有些东西不起作用。

【问题讨论】:

标签: c# algorithm matrix neural-network


【解决方案1】:

这个来源看起来不太好。例如,它使用术语“逆”而不是“转置”。此外,用于召回模式的算法描述不正确。幸运的是,如果您查看它们的实现,它似乎工作正常(尽管它也是一个低质量的代码)。

不同之处在于,当您提供一个向量以调用其模式时,您还应该将其转换为双极形式,然后计算与权重矩阵的每一列的点积。因此,在您的示例中,当您显示向量 1001 时,您会计算:

                  |0  -2  0  0|
[1 -1 -1 1]   *   |-2  0  0  0|   = [2 -2 -2 2]
                  |0   0  0 -2|   
                  |0   0 -2  0|

应用阈值函数后,它会产生正确的结果:1001。对于第二个向量,0101

                 |0  -2  0  0|
[-1 1 -1 1]   *  |-2  0  0  0|    = [-2 2 -2 2]
                 |0   0  0 -2|   
                 |0   0 -2  0|

这也给出了正确的结果:0101

编辑

在您的第二个示例中,您似乎已经达到了 Hopfield 网络功能的极限。首先,您呈现的模式只有一点不同,这使得它们很难区分。这一点,再加上 Hopfield Network 的容量据说在 0.138 * n (link) 左右,n 是神经元的数量似乎可以解释这个问题。

其他来源,如this one(第 6 章)提供了n/2 * log(n) 的理论界限 - 用于检索“几乎所有模式”而不会出现错误。在此链接中,您还可以找到其他学习规则。你可以找到另一个简单的例子here

【讨论】:

  • 好的,现在它似乎有道理,但考虑到我的编辑(对问题),即使你的解决方案也不起作用。你能说说为什么吗?
  • 谢谢。无论如何,您是否认为代码对于实现甚至算法的质量都很低?在后者中,您有任何不同实现的来源吗?
  • @gliderkite 我只是指代码本身的质量(一个小例子:愚蠢的bipolar2double 函数名称 - 此函数不会将“双极”转换为“双极”,它会将布尔值转换为双极存储在双)。至于任何现有的实现,我认为您比我了解更多,因为我什至不知道您提供的链接:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-03
  • 2011-09-13
  • 1970-01-01
  • 2021-04-27
相关资源
最近更新 更多