讲的什么

这部分主要对 Hopfield 网络作一大概的介绍。写了其模型结构、能量函数和网络的动作方式。主要参考了网上搜到的一些相关 PPT。

 


概述

早在 1982 年,Hopfield 发表的文章:【Neural networks and physical systems with emergent collective computational abilities】 中就提出了一种基于能量的模型(Energy Based Model,EBM)——可用作联想存储的互连网络,这算是现在人工神经网络的早期雏形,我们称该模型为 Hopfield 网络。
 

反馈网络

Hopfield 网络被认为是一种最典型的全反馈网络,可以看作一种非线性的动力学系统。反馈网络能够表现出非线性动力学系统的动态特性。它所具有的主要特性为以下两点:

  • 网络系统具有若干个稳定状态。当网络从某一初始状态开始运动,网络系统总可以收敛到某一个稳定的平衡状态
  • 系统稳定的平衡状态可以通过设计网络的权值而被存储到网络中

 

基于能量的模型

基于能量的模型是一种具有普适意义的模型,统计力学的结论表明,任何概率分布都可以转变成基于能量的模型。EBM 通过对变量的配置施加一个有范围限制的能量,即对每一个变量建立一个能量公式,来捕获这些变量之间的依赖关系。EBM 有两个主要的任务,

  • 推断(Inference),它主要是在给定观察变量的情况,找到使能量值最小的那些隐变量的配置
  • 学习(Learning),它主要是寻找一个恰当的能量函数,使得观察变量的能量比隐变量的能量低
     

Hopfield 网络功能

Hopfield 神经网络的提出就是与其实际应用密切相关。其主要功能在以下两个方面。

  • 离散 Hopfield 网络主要用于联想记忆。输入-输出模式的各元素之间,并不存在一对一的映射关系,输入-输出模式的维数也不要求相同:联想记忆时,只给出输入模式部分信息,就能联想出完整的输出模式。即具有容错性
  • 连续Hopfield 网络主要用于优化计算功能。优化计算在实际问题中有广泛的应用。如经典的 TSP 问题,工业生产和交通运输中的调度问题等。
     

模型结构

根据其激活函数的不同,Hopfield 神经网络有两种:离散 Hopfield 网络(Discrete Hopfield Neural Network,DHNN)和连续Hopfield 网络(Continues Hopfield Neural Network,CHNN)。
 

离散 Hopfield 网络

离散的 Hopfield 网络是二值神经网络,该模型的处理单元由神经元构成,每个神经元由两种状态:激活或者抑制状态,分别用 1 和 0 表示。神经元之间通过赋有权值的有向线段连接,通过求取全局状态的最小能量来训练模型。

以一个较简单的网络说明,如下图

图 1: 三神经元构成的 Hopfield 网络

它由三个神经元构成,图中的第 0 层仅仅是作为网络的输入,所以不把它当作实际的神经元,无计算功能,第 1 层是实际的神经元。设 \(y_i\) 表示第 \(i\) 个神经元的取值,\(x_i\) 表示第 \(i\) 个神经元的外部输入,可以理解为额外施加在神经元 \(i\) 上的固定偏置,功能相当于第 \(i\) 个神经元的阈值(threshold),\(W_{i,j}\) 表示第 \(j\) 个神经元到第 \(i\) 个神经元的连接权重。该简单模型的计算方式如下
\begin{align}
\begin{matrix}
y_i \rightarrow 1\\
y_i \rightarrow 0
\end{matrix} \quad \text{if} \quad \sum_{j \neq i}W_{ij}y_j+x_i \quad
\begin{matrix}
> 0 \\
< 0
\end{matrix}
\end{align}
其激活函数可以看成符号函数,即 \(g=\mathrm{sgn}\).

对于一个离散的 Hopfield 网络,其网络状态是输出神经元信息的集合。对于一个输出层是 \(n\) 个神经元的网络,则其 \(t\) 时刻的状态为一个 \(n\) 维向量:
\begin{align}
Y(t)=[y_1(t),y_2(t),\cdots,y_n(t)]^T
\end{align}
因为每个神经元有两个取值 1 或 0,故而网络共有 \(2^n\) 个状态。对于图 1 的 Hopfield 网络,它的输出层就是三位二进制数;每一个三位二进制数就是一种网络状态,从而共有 8 个网络状态。这些网络状态如图 2 所示。在图中,立方体的每一个顶角表示一种网络状态。

图 2:三神经元 Hopfield 网络输出状态

如果 Hopfield 网络是一个稳定网络,那么在网络的输入端加入一个输入向量,则网络的状态会产生变化,也就是从超立方体的一个顶角转移向另一个顶角,并且最终稳定于一个特定的顶角。

再提一下网络的稳定性。给定一个 DHNN 的目前状态 \(Y(t)\), 如果对于任何 \(\Delta t\), 当神经网络从 \(t=0\) 开始,有初始状态 \(Y(0)\). 经过有限时刻 \(t\), 有 \(Y(t+\Delta t)=Y(t)\), 则称网络是稳定的。 Coben 和 Grossberg 在 1983 年给出了关于 Hopfield 网络稳定的充分条件,他们指出:无自反馈的权重系数对称 Hopfield 网络是稳定的,即如果 Hopfield 网络的权系数矩阵 \(W\)是一个对称矩阵,并且,对角线元素为 0(\(W_{i,i}=0\)).则这个网络是稳定的。需要注意的是这只是一个充分条件。
 

连续 Hopfield 网络

连续 Hopfield 网络(CHNN)拓扑结构和 DHNN 结构相同,不同之处在于其激活函数 \(g\) 不是阶跃函数,而是 S 形的连续函数,一般取 sigmoid 函数,即
\begin{align}
g(u)=\frac{1}{1+e^{-u}}
\end{align}

具体地暂时不讲了。

 


能量函数

关于能量函数怎么来的,我也解释不清楚,参考知乎:神经网络中的能量函数是如何定义的?

对 Hopfield 网络引入一个李亚普诺夫(Lyapunov) 函数,即所谓能量函数。Hopfield 在论文中给了一个特例的能量函数形式,即 \(W_{i,j}=W_{j,i}\), 节点阈值 \(U_i=0\), 则能量函数表达式为
\begin{align}
E=-\frac 12 {\sum\sum}_{i \neq j} W_{i,j}y_i y_j
\end{align}
该函数为可能有很多极小点的复杂图像。由于 \(\Delta y_i\) 引起的能量的变化 \(\Delta E\) 为
\begin{align}
\Delta E=- \frac 12\Delta y_i \sum_{j\neq i}W_{i,j}y_j
\end{align}
由于节点的二值性,\(\Delta y_i=\pm 1\) 时,\(\Delta E\) 才可能不为零,如果 \(\sum_{i\neq j}W_{i,j}y_j>0\), 则 \(\Delta y_i=1\),如果 \(\sum_{i\neq j}W_{i,j}y_j<0\), 则 \(\Delta y_i=-1\), 可见始终成立 \(\Delta E \leqslant 0\), 即网络的能量函数是减函数。

这时假设了对称性,实际上式 (4) 的能量变化就不再是式 (5) 的形式了,它可以被拆分为两项
\begin{align}
\Delta E=- \frac 12 \Delta y_i \sum_{j\neq i}W_{i,j}y_j-\frac12 \Delta y_i \sum_{j\neq i}W_{j,i}y_j
\end{align}
注意此时 \(W\) 的下标不同。其中第一项仍是和对称时相同,即恒为负的,如果 \(W_{i.j}=W_{j,i}\),另一项等同于第一项,否则的话,就是“随机的”,取决于 \(W\) 初始化的方式。

 


Hopfield 网络运作方式

反馈网络有两种基本的工作方式:串行异步和并行同步方式。

  • 串行异步方式:在某一时刻只有一个神经元调整其状态,其余输出不变。由随机或预定顺序来选择该神经元
    \begin{align}
    y_i(t+1)=\begin{cases}
    g(net_i(t)) ,\quad i=j \\
    y_i(t),\quad i \neq j
    \end{cases}
    \end{align}
    其中 \(g\) 表示激活函数,\(net_i\) 表示第 \(i\) 个神经元的输入。每次神经元调整其状态时,根据其当前的输入值的大小决定下一时刻的状态,因此其状态可能发生改变,也可能保持原状。下次调整其他神经元状态时,本次的调整结果即在下一个神经元的输入中发挥作用
  • 并行同步方式:部分或者所有神经元同时调整其状态。即
    \begin{align}
    y_i(t+1)= g(net_i(t))
    \end{align}
    和异步工作方式相同,每次神经元在调整状态时,根据其当前的输入值的大小决定下一时刻的状态。下次调整其它神经元状态时,本次的调整结果即在下一个神经元的输入中发挥作用。网络稳定时,每个神经元的状态都不再改变,此时的稳定状态就是网络的输出。

不管采取什么工作方式,基本运行步骤是类似的,以串行工作方式为例:

  • 第一步:对网络进行初始化
  • 第二步:从网络中随机选取一个神经元
  • 第三步:求出该神经元 \(i\) 的输出
  • 第四步:求出该神经元经激活函数处理后的输出,此时网络中的其他神经元的输出保持不变
  • 第五步:判断网络是否达到稳定状态,若达到稳定状态或满足给定条件则结束;否则转到第二步继续运行

 


然后呢

下一部分讲学习规则,然后举个计算的例子。

Hopfield 网络(上)的更多相关文章

  1. Hopfield 网络(下)

    讲的什么 这部分主要讲离散的 Hopfield 网络权值的计算方法,以及网络记忆容量.主要参考了网上搜到的一些相关 PPT.   DHNN 的训练方法 常见的学习方法中有海布法,还有 \(\delta ...

  2. 反馈神经网络Hopfield网络

    一.前言 经过一段时间的积累,对于神经网络,已经基本掌握了感知器.BP算法及其改进.AdaLine等最为简单和基础的前馈型神经网络知识,下面开启的是基于反馈型的神经网络Hopfiled神经网络.前馈型 ...

  3. 史上最强大网盘,网络上的赚钱神器【Yunfile网盘】,注册就送8元

    YunFile.com,是提供在线存储和文件保存服务最大的网站之一,从2007年创立至今,我们提供免费的和您可以承受的收费服务.这些服务包括高级在线存储/远程备份服务,和先进的上传和下载工具.上百万来 ...

  4. C#读取网络流,读取网络上的js文件

    写博客的目的就是让其他人少走弯路. C#读取网络上的流和js文件出现的问题 一开始看了今天博客园上的推荐文章,用C#+HtmlAgilityPack+XPath带你采集数据(以采集天气数据为例子),然 ...

  5. phonegap文件,目录操作以及网络上传,下载文件(含demo)

    正在做一个跨平台的应用,需要使用phonegap进行文件的一些基本操作. 需求如下:可以选择本地图片,或者从相机选择图片,并进行显示在本地,然后上传到服务器,以及可以从服务器下载图片显示出来,如果本地 ...

  6. hyper-v无线网络上外网

    这个通过无线网络上外网也是找了很多文章,大部分写的都不详细,没有办法成功,原理就是创建一个虚拟网卡,然后把创建的虚拟网卡和无线网卡桥接,虚拟机中使用创建的虚拟网卡,这里创建的虚拟网卡指的是用hyper ...

  7. golang thrift 总结一下网络上的一些坑

    我们以hello world来大概分析一下golang中的thrift包,并且扒一扒网络上有关thrift的一些坑 查看源码,服务器定义如下:(详见simple_server.go文件) type T ...

  8. ios 从网络上获取图片并在UIImageView中显示

    ios 从网络上获取图片   -(UIImage *) getImageFromURL:(NSString *)fileURL { NSLog(@"执行图片下载函数"); UIIm ...

  9. 使用异步任务加载网络上json数据并加载到ListView中

    Android中使用网络访问来加载网上的内容,并将其解析出来加载到控件中,是一种很常见的操作.但是Android的UI线程(也就是主线程)中是不允许进行耗时操作的,因为耗时操作会阻塞主线程,影响用户体 ...

随机推荐

  1. C#基础:线程之异步回调(委托)

    异步回调,什么是异步回调?我是这样理解的,当主线程在执行一段代码的时候,我们用委托执行了一个线程,这个线程要返回一个结果,关键是什么时候返回这个结果,异步回调就是在这个线程执行完成后立即返回这个线程的 ...

  2. MySql用户配置

    数据库:MySQL5.7 注意事项: MySQL5.7 mysql.user 表没有 password字段 改 authentication_string: 一.前言 我们在创建数据库和权限的时候才用 ...

  3. 洛谷 - SP3871 GCDEX - GCD Extreme - 莫比乌斯反演

    易得 $\sum\limits_{g=1}^{n} g \sum\limits_{k=1}^{n} \mu(k) \lfloor\frac{n}{gk}\rfloor \lfloor\frac{n}{ ...

  4. C#获得当前执行的函数名、当前代码行、源代码文件名

    http://blog.csdn.net/newegg2009/article/details/6220385 C#获得当前执行的函数名.当前代码行.源代码文件名 [日期:2010-10-18 11: ...

  5. C# 面向对象之继承

    Object是所有类的基类 1.在C#中一个类可以继承另一个类(密封类除外,静态类是密封的不能被继承); 2.被继承的类被成为基类(父类);继承的类被成为派生类(子类); 3.子类将获得父类除构造函数 ...

  6. Mysql的跨服务器操作

    1.查询FEDERATED功能是否开启: show ENGINES; 2.如果状态为NO则需修改my.ini文件,增加一行federated配置: my.ini配置文件的默认路径 C:\Program ...

  7. 面向对象多继承(C3算法)/网络编程

    https://www.cnblogs.com/aylin/p/5572104.html 一.面向对象多继承(c3算法) a.有多个父类先找左,再找右,如下示例: class A(object): p ...

  8. pip 的简单安装与基本使用

    pip 是 Python 著名的包管理工具,在 Python 开发中必不可少.本文只介绍各平台最新可用并且最简单的 pip 安装方式,以方便初学者和不会敲代码只需通过 pip 安装特定工具的小伙伴们. ...

  9. siege官方文档(译)(二)

    WHY DO I NEED IT? Siege was written for both web developers and web systems administrators. siege是为了 ...

  10. 转 PHP函数---$_Get()和$_Post()的用法

    一.$_Get()和$_Post()函数是用来传值的,即对应两种提交表单的方法,get和post. 二.$_Get方法 (1)获取通过URL的传值 Example 1 新建两个PHP文件,1.php, ...