反馈式神经网络之HNN

神经网络

神经网络的简介

人工神经网络(Artificial Neural Network,即ANN ),它从信息处理角度对人脑神经元网络进行抽象, 建立某种简单模型,按不同的连接方式组成不同的网络。同时也直接简称为神经网络类神经网络。神经网络是一种运算模型,由大量的节点(或称神经元)之间相互联接构成。每个节点代表一种特定的输出函数,称为激励函数(activation function)。每两个节点间的连接都代表一个对于通过该连接信号的加权值,称之为权重,这相当于人工神经网络的记忆。网络的输出则依网络的连接方式权重值激励函数的不同而不同。而网络自身通常都是对自然界某种算法或者函数的逼近,也可能是对一种逻辑策略的表达。

神经网络的类型

人工神经网络模型主要考虑网络连接的拓扑结构神经元的特征学习规则等。所以我们根据连接的拓扑结构,神经网络模型可以分为:

  • 前向网络

    网络中的各个神经元(节点)接收前一级的输入,加权叠加后并输入到下一级,网络中没有反馈,网络的拓扑结构可以用一个有向无环图表示。这种网络实现信号从输入空间到输出空间的变换,它的信息处理能力来自于简单非线性函数的多次复合。网络结构简单,易于实现。反传网络(BP)是一种典型的前向网络。如图1所示:

  • 反馈网络

    网络内神经元间有反馈,可以用一个无向的完备图表示。这种神经网络的信息处理是状态的变换,可以用动力学系统理论处理。系统的稳定性与联想记忆功能有密切关系。Hopfield网络(HNN)、波耳兹曼机均属于这种类型。如图2(HNN的拓扑结构图)所示:

反馈式神经网络

反馈神经网络是一种反馈动力学系统。在这种网络中,每个神经元同时将自身的输出信号作为输入信号反馈给其他神经元,它需要工作一段时间才能达到稳定。

Hopfield神经网络(HNN)

美国加州理工学院物理学家J.J.Hopfield教授于1982年提出一种单层反馈神经网络,后来人们将这种反馈网络称作Hopfield 网。Hopfield神经网络是(HNN)反馈网络中最简单且应用广泛的模型,它具有联想记忆和解决快速寻优问题的功能。

HNN的状态

对于HNN中的每一个节点只有两种状态:0 或者 1,代表闭或开,节点之间彼此互相连接,所有神经元状态的集合就构成反馈网络的状态,但是这种网络是很难分析的,其可能的状态有:

  • 稳定

  • 震荡

  • 混沌

HNN的能量函数与吸引子

研究发现如果模型是对称的,那么整个网络就会存在一个全局能量函数,系统能够收敛到一个最低能量处。因此,我们研究的 Hopfield 网络是一个对称网络。这里所谓的对称即每个节点的输出状态都反馈回来作为除自身外每一个节点的输入。

  • 对于每一个神经元,我们知道其输入与输出的关系为:

  • 离散型(DHNN)与连续型(DHNN)

    根据激励函数的选取我们可以把神经网络定义成离散型与连续型:

    DHNN: 作用函数为符号函数,主要用于联想记忆。

    符号函数sgn(x):

    CHNN:作用函数为S形函数(sigmoid),主要用于优化计算。

    sigmoid函数sigmoid(x):

  • DHNN

    对于每个神经元,其输出状态为:

    稳定点为:

  • DHNN的状态变化

    • 每一个神经元有两种状态(0或1),所有对于N个节点的HNN有2的N次方个可能的状态,即整个网络的状态可以用一个包含0和1的向量表示。
    • 节点的状态更新包括三种情况:0—>1; 1—>0; 保持不变
    • 按照单元异步更新方式,某一时刻网络只有一个节点被选择进行状态更新,当该节点状态变化时,网络状态就以一定概率转移到另一状态;当该节点保持时,网络状态的更新结果保持前一时刻的状态。

    因为我们用权值和阈值训练整个网络,所以,一旦给出确定的HNN权值和神经元的阈值,网络的状态转移序列就确定了,也就是网络的状态就确定了。

HNN的能量函数

按照能量变化为负的思路,可将定义节点i的能量为:

所以对于整个网络,其总能量为:

显然E是对所有的Ei按照某种方式求和得到。因为离散HNN中,wij = wji (单层对称网络),如果直接计算E,将会对Ei中的每一项计算两次。所以在前面有个1/2的因子。

对于能量函数,我们可以改写为:

定义两个差值变量:

则可得出能量变化为:

我们假设t时刻,只有1个神经元调整状态(串行方式工作),假设神经元为j,则此时:
带入上式,得到:

因为神经元不存在自反馈,所以wii为0,则最终能量变化为:

我们考虑:

因此能量E是不断减少的。

吸引子

网络达到稳定时的状态X,称为网络的吸引子。在上述推导中我们证明了网络中的能量是逐渐减少的,通过能量变化公式可知,当能量稳定时(极小点),整个网络的状态也稳定了。我们称此时的状态为网络的吸引子,也就是说此时网络具有了记忆的功能。如果将记忆的样本信息存储于不同的能量极小点,当输入某一模式时,网络就能实现“联想记忆”与其相关的存储样本,实现联想记忆。

权值的设计

通过上面的推导,我们知道HNN主要是通过训练(或者确定)连接权阈值就可以达到存储序列的目的,在实际的过程中我们可令阈值为0,这样一来我们只需要训练连接权就可达到记忆相应的序列的目的。所以,我们下面的问题就是怎么去设计这个权值。

通常训练权值的方法有外积法、伪逆法、正交设计法等。下面讲解了最常用的外积法(Hebb学习法则)

Hebb学习法则

Hebb学习法则是一种比较简单,在一定条件下行之有效的设计劝着的方法。当神经元输入与输出节点的状态相同(即同时兴奋或抑制)时,从第 j 个到第 i 个神经元之间的连接强度则增强,否则则减弱。海布(Hebb)法则是一种无指导的死记式学习算法。学习的目的:对具有 q 个不同的输入样本组X^k = [x1,x2,…,x^k],希望通过调节计算有限的权值矩阵 W,使得当每一组输入样本 X^k,作为系统的初始值,经过网络循环,系统能够收敛到各自输入样本矢量本身。

  • 求权矩阵

    给定输入, k = [1,2,3,…,m], I 为nxn的单位矩阵,则:

  • 每一个神经元的状态

    同时我们须知:x_ii = 0

根据上式,我们可以根据目的存储序列设计出相应的连接权。

HNN的实现

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

HNN的实现流程

  • 第一步:对网络进行初始化
  • 第二步:使用Hebbo法则确定权值
  • 第三步:进行预测

训练集

    zero = [0, 1, 1, 1, 0,1, 0, 0, 0, 1,1, 0, 0, 0, 1,1, 0, 0, 0, 1,1, 0, 0, 0, 1,0, 1, 1, 1, 0]one = [0, 1, 1, 0, 0,0, 0, 1, 0, 0,0, 0, 1, 0, 0,0, 0, 1, 0, 0,0, 0, 1, 0, 0,0, 0, 1, 0, 0]two = [1, 1, 1, 0, 0,0, 0, 0, 1, 0,0, 0, 0, 1, 0,0, 1, 1, 0, 0,1, 0, 0, 0, 0,1, 1, 1, 1, 1]

训练板块

# Hopfield Class
class HOP(object):def __init__(self, N):# Bit Dimensionself.N = N# Weight Matrixself.W = np.zeros((N, N), dtype = floatType)# Calculate Kronecker Square Product of [factor] itself OR use np.kron()def kroneckerSquareProduct(self, factor):ksProduct = np.zeros((self.N, self.N), dtype=floatType)# Calculatefor i in range(0, self.N):ksProduct[i] = factor[i] * factorreturn ksProduct# Training a single stableState once a time, mainly to train [W]def trainOnce(self, inputArray):# Learn with normalizationmean = float(inputArray.sum()) / inputArray.shape[0]self.W = self.W + self.kroneckerSquareProduct(inputArray - mean) / (self.N * self.N) / mean / (1 - mean)# Erase diagonal self-weightindex = range(0, self.N)self.W[index, index] = 0.# Overall training functiondef hopTrain(self, stableStateList):# Preprocess List to Array typestableState = np.asarray(stableStateList, dtype=uintType)# Exceptionif np.amin(stableState) < 0 or np.amax(stableState) > 1:print('Vector Range ERROR!')return# Trainif len(stableState.shape) == 1 and stableState.shape[0] == self.N:print('stableState count: 1')self.trainOnce(stableState)elif len(stableState.shape) == 2 and stableState.shape[1] == self.N:print('stableState count: ' + str(stableState.shape[0]))for i in range(0, stableState.shape[0]):self.trainOnce(stableState[i])else:print('SS Dimension ERROR! Training Aborted.')returnprint('Hopfield Training Complete.')# Run HOP to outputdef hopRun(self, inputList):# Preprocess List to Array typeinputArray = np.asarray(inputList, dtype=floatType)# Exceptionif len(inputArray.shape) != 1 or inputArray.shape[0] != self.N:print('Input Dimension ERROR! Runing Aborted.')return# Runmatrix = np.tile(inputArray, (self.N, 1))matrix = self.W * matrix# print("matrix:",matrix.shape)outputArray = matrix.sum(1)# print("outputArray:",outputArray.shape)# Normalizem = float(np.amin(outputArray))M = float(np.amax(outputArray))outputArray = (outputArray - m) / (M - m)# Binary''' \SWITCH/ : 1/-1 OR 1/0outputArray[outputArray < 0.5] = -1.''' # \Division/outputArray[outputArray < 0.5] = 0.# ''' # \END/outputArray[outputArray > 0] = 1.return np.asarray(outputArray, dtype=uintType)# Reset HOP to initialized statedef hopReset(self):# Weight Matrix RESETself.W = np.zeros((self.N, self.N), dtype = floatType)

输出格式定义

# Utility routine for printing the input vector: [NperGroup] numbers each piece
def printFormat(vector, NperGroup):string = ''for index in range(len(vector)):if index % NperGroup == 0:'''\SWITCH/ : Single-Row OR Multi-Rowstring += ' ''''# \Division/string += '\n'if str(vector[index]) == '0':string += ' 'elif str(vector[index]) == '1':string += '*'else:string += str(vector[index])string += '\n'print(string)

进行测试

# DEMO of Hopfield Net
def HOP_demo():zero = [0, 1, 1, 1, 0,1, 0, 0, 0, 1,1, 0, 0, 0, 1,1, 0, 0, 0, 1,1, 0, 0, 0, 1,0, 1, 1, 1, 0]one = [0, 1, 1, 0, 0,0, 0, 1, 0, 0,0, 0, 1, 0, 0,0, 0, 1, 0, 0,0, 0, 1, 0, 0,0, 0, 1, 0, 0]two = [1, 1, 1, 0, 0,0, 0, 0, 1, 0,0, 0, 0, 1, 0,0, 1, 1, 0, 0,1, 0, 0, 0, 0,1, 1, 1, 1, 1]hop = HOP(5 * 6)hop.hopTrain([zero, one, two])half_zero = [0, 1, 1, 1, 0,1, 0, 0, 0, 1,1, 0, 0, 0, 1,0, 0, 0, 0, 0,0, 0, 0, 0, 0,0, 0, 0, 0, 0]print('Half-Zero:')printFormat(half_zero, 5)result = hop.hopRun(half_zero)print('Recovered:')printFormat(result, 5)half_two = [0, 0, 0, 0, 0,0, 0, 0, 0, 0,0, 0, 0, 0, 0,0, 1, 1, 0, 0,1, 0, 0, 0, 0,1, 1, 1, 1, 1]print('Half-Two:')printFormat(half_two, 5)result = hop.hopRun(half_two)print('Recovered:')printFormat(result, 5)half_two = [1, 1, 1, 0, 0,0, 0, 0, 1, 0,0, 0, 0, 1, 0,0, 0, 0, 0, 0,0, 0, 0, 0, 0,0, 0, 0, 0, 0]print('Another Half-Two:')printFormat(half_two, 5)result = hop.hopRun(half_two)print('Recovered:')printFormat(result, 5)

入口程序

if __name__ == '__main__':start = time.clock()HOP_demo()end = time.clock()print("time: ", end-start)

输出结果

stableState count: 3
Hopfield Training Complete.
Half-Zero:***
*   *
*   *Recovered:***
*   *
*   *
*   *
*   **** Half-Two:**
*
*****Recovered:***  * * **
*
*****Another Half-Two:***  * * Recovered:***  * * **
*
*****time:  0.02231466803018272

附录

参考文档

Hopfield 网络

Hopfield 网络(上)

Hopfield 网络(下)

Hopfield神经网络详解

【Python】改进Hopfield网络代码实现

一种设计离散型Hopfield神经网络权值的新方法

反馈式神经网络之HNN相关推荐

  1. 人工智能之Hopfield神经网络(HNN)

    感觉这位大佬说的不错,搬了过来,后面附上原文链接 神经网络在1980年代复兴归功于物理学家约翰·霍普菲尔德(Hopfield).1982年,霍普菲尔德提出了一种新的神经网络,可以解决一大类模式识别问题 ...

  2. AutoFDO自动反馈式优化

    AutoFDO自动反馈式优化_zhou1519的专栏-CSDN博客_autofdohttps://blog.csdn.net/zhou1519/article/details/84139499 目录 ...

  3. 推动隐私计算技术,360数科提出分割式神经网络框架

    自2016年谷歌首次提出联邦学习概念,这个初衷为保证数据交换时信息安全的人工智能基础技术随即在中国掀起风潮.在隐私数据保护上,360数科(原360金融)于2018年引入隐私计算研究,并在2019年宣布 ...

  4. 6N6+6N1的反馈式并联稳压电路

    电子管的反馈式稳压电路资料很少 这儿是一个计算设计过程: 图如下: 这个电路大概能实现1mV以下的稳压效果,但是这个线路对输入的波纹很敏感,必须是有规律的类似于正弦波的波纹才能得到最佳的效果.如果输入 ...

  5. 【高频电子线路】[元模型]反馈式振荡器

    文章目录 1. 反馈式振荡器 2. 平衡条件 2.1 振幅平衡条件 2.2 相位平衡条件 3. 稳定条件 4. 起振条件 1. 反馈式振荡器 反馈式振荡器是由放大器和反馈网络组成的一个闭合环路, 放大 ...

  6. 电容、电感反馈式振荡器

    [ 1. 三端式LC振荡器 ] 三端式(又称三点式)的振荡器, LC回路的三个端点与晶体管的三个电极分别连接而成的电路. 电抗元件X1,X2,X3可为电感或电容. 工作原理:射同余异,源同余异 一般情 ...

  7. 基于隐式神经网络表达的数据压缩

    数据压缩是一种在日常生活中广泛应用的技术,从算法角度来讲,压缩的过程是通过改变数据的表征范式以达到保留信息.去除冗余的过程.近来,深度学习在数据压缩领域的应用不仅表现出极好的性能,还为数据表征提出了具 ...

  8. 对抗性神经网络百度百科,生成对抗式神经网络

    深度学习什么是对抗式神经网络? 对抗式神经网络GAN让机器学会"左右互搏"GAN网络的原理本质上就是这两篇小说中主人公练功的人工智能或机器学习版本. 一个网络中有两个角色,修炼的过 ...

  9. 【NLP】毕设学习笔记(八)“前馈 + 反馈” = 循环神经网络RNN

    前馈神经网络和循环神经网络分别适合处理什么样的任务? 如果分类任务仅仅是进行判断和识别,例如判断照片上的人的性别,识别图片上是否有小狗图案,那么对输入的数据仅仅需要做特征寻找的工作即可,找到满足该任务 ...

最新文章

  1. 工作242:关于第二个git仓库提交代码
  2. WordPress主题-Real Estate 7–房地产[更至v3.1.0]
  3. 95-10-040-启动-限额管理
  4. go语言 rune切片
  5. 网页视频之H264打包为fmp4调研
  6. 计算机相关技能简历,简历计算机技能有哪些
  7. 华农c语言期末试卷答案,华南农业大学2013学年第1学期程序设计(C语言)期末考试试卷(A卷)...
  8. Cadence Orcad Capture鱼眼视图Fisheye view介绍图文视频教程
  9. 思特威电子通过注册:拟募资28亿 小米红杉联想是股东
  10. 图像处理笔记——边缘检测算子
  11. 嵌入式设备时间同步管理
  12. java ip 获取了两个_用Java获取本地的多个IP地址
  13. DataGrip入门小tips
  14. 文献阅读 | Resetting histone modifications during human parental-to-zygotic transition
  15. BlogBus居然没有人谈及‘魔方’
  16. Python整体缩进和整体去掉缩进
  17. 神州泰岳王宁:从高校团委书记到中关村富豪
  18. python写小说阅读器_用python给自己DIY一款小说阅读器,如此看来,很简单!
  19. 机器学习——决策树算法
  20. FPGA挂载EMMC IP源码 ZYNQ PL端读写EMMC IP 最大52MB吞吐率(8bit) 支持1/4/8/bit 支持块读写

热门文章

  1. centos8磁盘分配
  2. 利用大纲级别自动生成目录的步骤
  3. python unix 时间戳转北京时间,python时间与Unix时间戳相互转换方法详解
  4. debian 添加阿里apt源
  5. 学习笔记总结之JAVA JUC ReentrantReadWriteLock(四)
  6. 光伏并网发电系统MATLAB Simulink仿真设计。 该仿真包括电池,BOOST升压电路,单相全桥逆变电路
  7. 【有利可图网】PS实战系列:打造光滑甜美人像皮肤效果的PS磨皮技巧
  8. python logging学习
  9. 灭绝了6500万年的恐龙,居然发声了?
  10. 五星售后服务认证办理流程与意义