热的东西显然会变凉。房间会会人沮丧地变得凌乱。几乎一样,消息会失真。逆转这些状况的短时间策略分别是从新加热、 作卫生和使用 Hopfield 网络。本文向您介绍了三者中的最后一个,它是一个只须要特定的参数就能够消除噪声的算法。net.py 是一个特别简单的 Python 实现,将向您展现它的基本部分如何结合到一块儿,以及为什么 Hopfield 网络有时能够自失真的图案中 从新获得原图案。尽管这个实现有局限性,不过仍然可让您得到关于 Hopfield 网络的不少有益且有启发做用的经验。app
您寻求的是什么?
我假定您是由于遇到了一些计算上的问题而来阅读本文。有人向您建议,一些神经网络算法可能会提供解决方案。具体说, 建议是说您可使用一个 Hopfield 网络。我进一步假设您须要有一个大体的想法,以使得您能够决定那个建议是否切实 可行并且确保深刻的研究。下面这个 Hopfield 网络的很是缩略的应用可能会引导您着手解决问题。异步
首先,您的问题有一组基本的用 -1 和 +1 编码的图案。若是须要,它们能够用 0 和 +1 编码。这些图案能够是邮票的规格化的 二进制图案(参阅 参考资料)。下一个要素是偏离这一基础的一组图案。您寻求的是建立代码,以 使得能够输入不正常的图案而输出应得的一个基本图案。于是您寻求的将是一个算法,能够输入一个对特定邮票的编码描述,而后 输出应得的一个基本邮票图案。您搜索不肯定会成功。有能够接受的对您的计划产生负面影响的失败率。对您来讲,会有一个不 会显著地影响您的项目的邮票误识别的比率。
若是这使您想起了您的问题,下面可能会是您的解决方案设计的开始。在结束以前,您最好应该能回答出基本的问题。 这个 Hopfield 是什么?它如何工做?它的局限性是什么?它能够为我作什么?我但愿用更多的时间来研究它吗?
图案及其失真
让咱们首先来看将会失真而随后被从新得到的五个任意图案。它们能够可视化地表示为 10 乘 10 的黑白方块矩阵。图 1 展现了第一个图案,p1。
图 1. p1 的可视化表示

点击 net.py 中 p2到 p5 的任意一个,能够显示其余的图案。为了编码,这五个图案被初始描述为 Python 列表。 这样,举例来讲,第一个图案的描述见清单 1。
清单 1. 图案 p1
p1 = [ [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [-1, -1, -1, -1, -1, -1, -1, -1, 1, 1], [-1, -1, -1, -1, -1, -1, -1, -1, 1, 1], [-1, -1, -1, -1, -1, -1, -1, -1, 1, 1], [-1, -1, -1, -1, -1, -1, -1, -1, 1, 1], [-1, -1, -1, -1, -1, -1, -1, -1, 1, 1], [-1, -1, -1, -1, -1, -1, -1, -1, 1, 1], [-1, -1, -1, -1, -1, -1, -1, -1, 1, 1], [-1, -1, -1, -1, -1, -1, -1, -1, 1, 1], [-1, -1, -1, -1, -1, -1, -1, -1, 1, 1] ]
黑色和白色的方块分别对应于 -1 和 +1。这个列表随后被转化为一个数组。(请参阅 参考资料 ,得到 我使用的 Python 库的参考。)对应于这类图案中的每个元素,-1 或者 +1,在节点数组中都有一个节点对象。
一个节点对象有三个主要属性:
- 一个节点对象有一个值,它是图案中的一个元素。
- 一个节点还有一个地址,也就是在数组中它的地址。
- 每一个节点还有一个颜色,以使得它能够显示出来。
如前所述,Hopfield 的一个功能是消除噪声。为实现这一功能,须要有一种方法来给图案引入噪声。点击 Add Noise 刚好 能够完成此任务。向 p1 添加噪声生成了图 2。
图 2. 失真的 p1

为了给一个图案引入噪声,Hopfield 要访问节点数组中的每个地址。而后它会在 [0,1) 中取一个随机数,也就是 0 到 1 之间 包括 0 但不包括 1。若是数字小于某个固定的标准,网络就会改变节点的值和颜色,不然就会保持不变。默认状况下,这个标准设置 为 0.20,这样任意给定的节点就有百分之二十的可能会改变其值和颜色。您能够用调节滑块来改变这个几率。调为 0% 时,不会有噪声, 调为 100% 时,节点数组会简单地反转。取这区间的值,会出现全部其余一般的可能。每一个值都会给一个图案引入特定程度的噪声。因为 Hopfield 网络是一个消除噪声的算法,它能够输入一个如图 2 所示的失真的图案,而后输出图 1 中的原始图案。
尽管有时会因不合适的解释而变得晦涩,相关的算法实现起来仍是至关简单的。接下来,我将向您完整地介绍算法的一个实现, 而后我将简短解释为何这些算法能够消除噪声。
权重
如 David Mertz 和我在之前的一篇 developerWorks 文章 An introduction to neural nets 中所述, 人类的大脑由大约 1 千亿个神经元构成,平均每一个神经元要链接到几千个其余神经元。神经元既接收也发送不一样的能量。 神经元的一个重要特性是,它们接收到能量后不会立刻反应。而是,它们积累所接收到的能量,只有当积累的能量达到必定临界 极限时,它们才会向其余神经元发送本身的能量。
当大脑在学习时,能够认为它是在调整这些链接的数目和强度。毫无疑问,这是一个极其简化的生物学事实。 在这个例子中,对于实现控制神经网络而言,简化能够是实用的,尤为是当它们被做为模型来使用时。从生物学到算法的转换是经过 将链接转化为权重来实现的。(感知器以一种不一样的并且可能更为直观的方式来使用权重。阅读这里以前,您可能会但愿再读一遍 An introduction to neural nets。)
权重对象主要封装一个表示一个节点与另外一个节点之间的权重的数值。权重对象还有一个地址和一个颜色。地址是它在权重数组中的位置。 颜色用于显示。图 3 是权重数组的一种可能的表示。Net.py(请参阅 参考资料 中的连接)保持了对最低和最高 权重的追踪,它将权重显示中显示颜色数值的一个键。
图 3. 权重数组的一种可视化表示

在权重数组的每一行上,是一个给定节点与全部其余节点间权重的一个列表。Hopfield 网络有两种形式。一种形式的节点有一个到 自身的权重,另外一种形式则没有。经过 net.py 得到的经验代表,当节点不是自权重(self-weighted)时,节点数组不会老是重构到自身。 选择 No Self Weight 选项,而后尝试重构 p3 或 p5。有一百个节点,因此有一万个一般冗余的权重。默认状况下,当节点是 自权重时,就会有 5050 个非冗余权重,不然就只有 4950 个。
图 4. 权重的起源

清单 2. 权重生成算法
PAT = { x: x is a RxC pattern } WA = { x: x is a (R*C)x(R*C) weight array } For all (i,j) and (a,b) in the range of R and C: SUM = 0 for p in PAT: SUM += p(i,j) * p(a,b) WA( (R*i)+j, (C*a)+b ) = SUM
受生物学启发的概念是 1949 年 Donald Hebb 研究所得的 Hopfield 网络的基础。他假定若是一对节点同时向对方发送它们的能量, 那么它们之间的权重就要大于只有一个发送本身的能量的状况。他写道:“当细胞 A 的一个轴突距离 B 足够近以致于能刺激它,并且 能反复持久地参与对它的激发时,一个或者所有两个细胞中就会发生一些成长过程或新陈代谢的变化,这样,做为激发 B 的一个细胞, A 的功效就会增加”(参阅 参考资料 以得到详细资料)。就 Hopfield 网络来讲,当一对节点有相同的 值时,换句话说是 -1 或 +1,它们之间的权重就更大。全部可能的节点对的值的乘积的和决定的权重数组的内容。当两个值相同时,它们 的乘积就是正的,和就会增长。在不一样的值的状况下,这个和就会减少。
更详细地讲,权重是哪里来的?首先,Hopfield 网络必须能够访问一个库或者一组基本图案。在这里即 p1 到 p5。权重的生成首先由 Hopfield 网络在基本图案矩阵的界限内选择一对坐标。而后它访问每一个图案中的对应节点。在每一步,它将节点值的乘积添加到一个 正在使用的和。(见图 4)。当网络访问过每个图案后,它将一个权重对象的值设置为这个和。给出一对位于(i,j)和(a,b)的 节点,它会设置在权重数组中位于(i*10+j,a*10+b)的权重对象的值。
这就是权重如何构造的过程,不过,它如何做用于更大的 Hopfield 算法?它如何做用于图案的重构?
重构
若是在手边有一个权重数组和一个失真的或有噪声的图案,Hopfield 网络有时能够输出原始图案。没有保证,可是 网络正确次数的百分比高得惊人。它既能够同步完成,也能够异步完成。
若是是异步完成,网络会遍历失真的图案,在每个节点 N,它会询问 N 的值应该设置为 -1 仍是 +1。
要肯定这一设置,网络会去遍历权重数组中包含 N 与其余节点间全部权重的的行。不要忘记,节点多是也可能不是自权重的。
在第二次遍历的每一步,它会计算出(1)N 与另外一个节点之间的权重与(2)另外一个节点的值的乘积。正如您所预料的,网络会 保持这些乘积的一个使用中的计数器。
如今,网络就能够作出断定。至少在当前的实现中,若是这个和小于 0,网络就将节点设置为 -1,若是它大于或等于 0,则网络将 节点的值设置为 +1。
图 5. 重构:不遗留任何节点

清单 3. 重构
For every node, N, in pattern P. SUM = 0 For every node, A, in P: W = weight between N and A V = value of A SUM += W * V if SUM < 0: set N's value to -1 else: set N's value to +1
默认的更新是异步的,由于网络只是在肯定的这个值应该是什么以后才去设置一个节点的值。若是网络在作出了全部断定 后再去设置节点的值,那么它就能够是同步的。在这种状况下,它将存储它的断定,而后在最后一个断定作出后更新数组的节点。 在 net.py(参见 参考资料)中,重构默认状况下异步进行的,不过要注意 同步重构 的选项。
当您体验 net.py,当重构成功时,Hopfield 网络的行为使人震惊。这种行为之一是,甚至当权重数组严重退化时,它仍能够 重构图案。个人简单实现的退化权重(Degrade Weights)会遍历权重数组并随机地将权重设置为 0。对权重数级的显示给出了 破坏程度的一个视图。在这里,正确的重构说明 Hopfield 网络的容错性远超过大脑。它是如何工做的?数学的描述不会短。取而 代之的,这里给出了一个结构简介。
发生了什么
Hopfield 网络的算法细节说明了为何它有时能够消除噪声。和一般算法分析同样,最麻烦的部分是数学细节。在当前的例子中,这些 是难以描绘和想像的。幸运的是,有一些密切相关的现象,可使 Hopfield 网络的工做原理清楚明白地显示出来。
当一个弹球掉入一个简单曲面构成的碗中时,它会滚到最低点。碗的曲率就像是一个规则,输入弹球的入口点,而后返回最低点, 即碗底。更为复杂的曲率将相似于一个函数,它输入一个入口点并返回几个局部最低点中的其中之一。
能量是这些简单现象的一个基本部分。无论是在简单的仍是在复杂的例子中,进入的弹球都具备必定度量的能量。随时间的过去, 这个能量会减小。它最终会达到一个稳定状态,不能再变小。在复杂的例子中,可能会有一个更低的能量级别,可是弹球没法达到。
相似地,无论有没有失真,一个图案均可以被认为具备特定度量的能量。因此,图案 p1 到 p5 有能量级别。
图案的能量级别的计算并不复杂。Hopfield 网络计算每个可能的节点对的值与它们之间权重的乘积。图案的 能量级别是用负 2 去除这些乘积的和所得的结果。 Net.py 显示了任意给定图案或节点 数组的能量级别。当您重构图案时,我认为并但愿您将可以看到图案能量级别的降低。
在重构中,网络基于其余节点的值及它们之间的权重的乘积的和作出翻转一个节点的断定。当和小于 0 时,节点设置为 -1,不然设置为 +1。当值与权重的乘积是正的时,它有助于促使和大于 0。不过这样会将网络推向将节点值设置为 +1 的趋势。当乘积是负的时,和被推动到或者小于 0。因而,网络被推向到将节点的设置为 -1 的趋势。权重的变化 会引发度量的变化以及网络进行断定过程当中被推向的趋势的变化。图案可能会失真很严重,致使网络不会被推向到作出 正确断定的趋势。若是表述没有问题,网络在绝大部分时候会被推向正确的趋势。
若是您重构那五个图案中的任意一个,您将发现每一个图案会重构到自身。它应该是这样,由于每一个图案已经占据了一个 局部最低能量的点。没有重构过程能够再下降图案的能量级别。若是您成功地重构了一个失真的图案,Hopfield 就已经将 图案的能量级别降到了某个图案的级别。当失败时,它是已经将失真图案的能量级别降到了一个假的局部低点。在两种状况下, 能量级别都不能再有任何下降。换句话说,它已经达到了一种稳定状态。以能量的方式来描述 Hopfield 网络有着有趣并且 重要的意义。在此基础之上,它能够以数学的方式创建起来,以使得重复应用重构算法能够最终获得一个稳定的图案。(参阅 参考资料以得到详细资料。)
结束语
您应该意识到 Hopfield 网络的局限性。一个常常被说起的明显局限是,它的图案必须能够被编码为一个数组,这个数组或者由 -1 和 +1 构成,或者由 0 和 +1 构成。您已经知道,Hopfield 可能会稳定于一个假的局部低点。这个更为明显的局限在于,当图案 的数目超过节点数组中的节点数目的大约 14% 时,网络稳定于某个假的局部低点的几率会增长。也就是说,每增长一个基本图案, 就必须多大约 7 个节点。尽管有这样的局限性,可是,这里所讨论的图案重构仍是有可能成为解决您特定计算问题的直观向导。 如今您已经大概了解了最初说起的 Hopfield 算法。若是它能知足您的须要,如今您已经明白了构建您本身的实现的上部构造。 这包括计算权重数组的算法、重构失真图案的方式以及计算图案的能量级别的算法。
参考资料
- 您能够参阅本文在 developerWorks 全球站点上的 英文原文.
- 从 SourceForge 下载 Net.py 源代码。
- Andrew 使用 Tkinter 和 Numeric库在 Python 中 实现了 Hopfield 网络。使用 Python 不须要关注晦涩复杂的语法,从而让您能够集中精力于算法。
- Andrew Blais 和 David Mertz 撰写了 神经网络介绍 (developerWorks,2001 年 7 月),这是一篇关注感知器的介绍性文章。 David W. Clark 的同名文章 中引用了一个对比神经网络与数字计算机的表格。 另外参阅 the Wikipedia Neural network article。
- 参考 Attrasoft 以了解 邮票分类 和 邮票识别。 要了解 指纹识别, 请参阅 Nick D'Arcy 的设计研究。要使用 artificial intelligence in business(PDF 格式),请参阅 Tomas Nordlander 的研究。
- Wolfram Research 的 Neural Networks Documentation 给出了关于 Hopfield 和 Hopfield 网络的背景。点击直到文档末尾的 Section 9.2 (而后点击 Next 按钮),您将被引导到一个使用 Hopfield 网络进行字符从新识别的有趣讨论。 或者只是参阅 An Idiot's Guide to Neural Networks 中的 the Hopfield Net entry。.
- 以受生物学启发的概念为基础的 Hopfield 网络由 Donald Hebb 于 1949 年研究得出。另外参阅 The Hebb Legacy ( Canadian Journal of Experimental Psychology)。对 Donald Hebb 的The Organization of Behavior (Wiley,1949)的研究将使所需的繁重劳动获得回报。
- 您能够在线阅读 JJ Hopfield 1982 年的 文章 Neural networks and physical systems with emergent collective computational abilities( Proceedings of the National Academy of Sciences of the United States of America,1982),PDF 格式。 您还能够参阅 what interests Professor Hopfield today。
- 经过这些参考资料开始进入 Hopfield 网络的数学之旅:
- Kevin Gurney 的极好的 An Introduction to Neural Networks(Routledge,1997)一文关注的是支撑数学的直觉知识的构建。参阅第 7 章中关于重构算法的反复应用最终会获得 一个稳定图案的证实的讨论。另外参阅 Neural Nets以得到一个早期的在线版本。
- R. Beal 和 T. Jackson 的 Neural Computing: An Introduction (Hilger,1990)也很是有助于让您理解神经网络中发生了什么事情。特别参阅第 6 章。
- StatSoft 有一本 在线统计学教科书, 其中包括一个 关于神经网络的部分。
- 要得到大致上关于神经网络的范围普遍的连接收集,请参阅 The Backpropagator's Review。
- 若是一个主题没有 FAQ 会怎样?参阅很是实用的 Neural Net FAQ。
- David J.C. MacKay 的 Information Theory, Inference, and Learning Algorithms(2003),有教育意义,会增加知识, 能够在线以 PDF 格式得到。
- 参阅 Ute Matecki 和 Silke Seehusen 的 use of Hopfield nets to process greyscale images。
- 在 developerWorks Linux 专区 能够找到 更多为 Linux™ 开发者准备的参考资料。
- 在 Developer Bookstore Linux 区中定购 打折出售的 Linux 书籍。
- 自 developerWorks 的 Speed-start your Linux app 专区下载能够运行于 Linux 之上的通过挑选的 developerWorks Subscription 产品免费测试版本,包括 WebSphere® Studio Site Developer、WebSphere SDK for Web services、WebSphere Application Server、DB2® Universal Database Personal Developers Edition、Tivoli® Access Manager 和 Lotus® Domino Server。要更快速地开始上手,请参阅针对各个产品的 how-to 文章和技术支持。