离散Hopfield神经网络摘记
- 1. 离散型Hopfield网络结构
- 2. 网络中的状态变化
- 3. 训练网络
- 4. 网络的能量函数
- 5. Hopfield模型的实现
- 5.1 算法步骤
- 5.2 算法仿真——3个神经元模型
与多层感知机所采用“分层型”神经网络的结构不同,Hopfield神经网络是基于“相互连接型”的、递归式的网络。
- 相互连接型网络不分层,采用全连接结构,单元之间可以互相连接。
- 网络中各单元取值的组合,能够记忆网络的状态,称为“联想记忆”。
- 采用递归式结构,具有从输出到输入的反馈连接,期望的输出等于网络的输入,实际上是“自联想记忆”
1. 离散型Hopfield网络结构
离散Hopfield网络的基本结构如下图所示,主要具有以下特征:
每个单元没有自反馈(没有到自身的连接),即
单元之间的连接权重是对称的,即
每个单元的输出值只有 或 两种状态,即
考虑一个包含 个二值单元的网络,每个单元的输出可以取 或 两个值,因此整个网络包含了 种状态、可以采用“状态矢量”来描述。
2. 网络中的状态变化
假设第 个神经元在 时刻的输入为 、输出为 、连接权重为 、阈值为 ,神经网络的状态矢量表示为 。
由于采用了递归结构,存在输出到输入的反馈。在 时刻,第 个神经元接收来自于其他单元的输入 ,就有:
若记权值矩阵为,记 时刻的状态矢量为 ,那么:
于是就可以得到第 个神经元在第 时刻的输出 ,表示为:
Hopfield神经网络中的状态变化采用“异步模式”,每个时刻随机选择一个神经元的状态发生变化。比如 时刻的状态 到了 时刻,只有 变成了 ,而其他的状态均保持不变,即: 。
3. 训练网络
Hopfield网络的训练采用Hebb规则:如果一条突触两侧的两个神经元同时被激活,那么突触的强度将会增大。
在Hopfield网络中,突触表示权值 ,如果神经元 和神经元 同时活跃,那么权值 的值会增大。这里的“活跃”指的是:若神经元 的输出 和神经元 的输出 同时为正 、或者同时为负 ,权值会增大;若 和 的符号相反,则会被抑制,权值就会减小。
因此,针对权值
显然,这符合对于“活跃”的解释。
考虑状态矢量
由于网络中的神经元“没有到自身的连接”,即 ,若假设权值矩阵的初始值为全0阵,那么输入一个训练模式后的权值矩阵为:
即:
从另一个角度来分析:由于Hopfield网络是“自联想网络”,如果向网络那个输入一个模式 ,那么网络的输出的也应该同样是该模式 ,实现了自我联想记忆。
对于第 个神经元,其反馈后的输出为 ,不考虑 时就有 ,因此权值矩阵反映的规则实际上是一个“线性联想器”。
若只用一个模式 进行训练,则有 ,考虑以下情况:
- 考虑理想情况,如果 是正交向量,那么
- 对于一般情况,如果 不是正交向量,那么 的结果就需要 之类的激活函数来把每个神经元的输入 规范化为输出 ,经过若干次迭代, 会接近目标值
也就是说,Hebb规则输入模式非正交时,会产生误差。
【详细内容可参考:Hagan《神经网络设计》第七章】
如果想要在网络中存储 ,为了训练网络的连接权重,也就是要将 个模式 输入到网络中,同样能够得到对应的模式 ,那么所有模式的连接权重就表示为:
即:
有些资料为了数学表达上的方便,常常增加了一个比例因子:。
4. 网络的能量函数
Hopfield网络的能量函数定义为:
按照前文中公式
由于Hopfield网络采用异步模式,假设在 时刻只有第 个分量发生了变化,其他的状态均保持不变,也就是 。因此,可以在能量函数中单独列出第 个分量 ,此时的能量函数可写为:
从 时刻到 时刻, 发生了改变, 可能的值只可能是 和 ,因此能量函数的变化值为:
显然
因此,采用异步模式更新网络状态时,网络的能量函数值总是下降的。随着时间不断推进,网络的能量函数值逐渐减小,直到达到稳定状态。
5. Hopfield模型的实现
5.1 算法步骤
假设有 个模式
或者:
通过异步模式更新 中元素的状态,
直到 的状态稳定、不再变化时,作为输出
5.2 算法仿真——3个神经元模型
考虑三个神经元的Hopfield网络,如下图所示。
Simon Haykin. Neural Networks and Learning Machines (3rd Edition). Fig.13.14(b)
这样的3个神经元的二值网络,有2个稳定的状态,分别为 和 ,网络的权值为:
其它的6个状态输入网络中,最终都会收敛到 或 。
测试代码:
function hopfieldNN
x1 = [1, -1, 1]';
x2 = [-1, 1, -1]';
w = x1*x1' + x2*x2' - 2*eye(3);
w = w/3;
x3 = [1,1,1]';
x4 = [1,1,-1]';
x5 = [-1,1,1]';
x6 = [-1,-1,1]';
x7 = [1,-1,-1]';
x8 = [-1,-1,-1]';
x = [x3,x4,x5,x6,x7,x8];
for i=1:6
output = recog(w, x(:,i))';
end
end
function out = enery(w,x)
out = -x'*w*x/2;
end
function out = recog(weight, test)
flag = 1;
n = 1;
while (flag)
t0 = enery(weight,test);
col = ceil(rand()*numel(test));
out = weight(col,:)*test;
if out>0
test(col) = 1;
elseif out<0
test(col) = -1;
end
n = n + 1;
if n==10
flag = 0;
out = test;
t0 = enery(weight,test);
end
end
end
输出结果:
input = [ 1 1 1 ], output = [ 1 -1 1 ]
input = [ 1 1 -1 ], output = [ -1 1 -1 ]
input = [ -1 1 1 ], output = [ -1 1 -1 ]
input = [ -1 -1 1 ], output = [ 1 -1 1 ]
input = [ 1 -1 -1 ], output = [ 1 -1 1 ]
input = [ -1 -1 -1 ], output = [ -1 1 -1 ]
如果单独考虑某个输入,观察异步模式和网络能量变化,比如某一次运行:
input = [ -1 1 1 ]
E=0.6667, -1 1 1 ,chosed neuron:1
E=0.6667, -1 1 1 ,chosed neuron:1
E=0.6667, -1 1 1 ,chosed neuron:2
E=0.6667, -1 1 1 ,chosed neuron:1
E=0.6667, -1 1 1 ,chosed neuron:2
E=0.6667, -1 1 1 ,chosed neuron:2
E=0.6667, -1 1 1 ,chosed neuron:3 直到这一步,才随机选对了需要改变状态的神经元
E=-2.0000, -1 1 -1 ,chosed neuron:3
E=-2.0000, -1 1 -1 ,chosed neuron:2
ultimate value = -2.0000
output = [ -1 1 -1 ]