双向联想记忆网络的原理与python简单实现
文章目录
- 原理
- 处理步骤
- 思考
- 源代码
- 1. 计算网络
- 2. 验证网络能力:
原理
联想记忆功能分为自联想和异联想,异联想也称为双向联想记忆,简写为BAM。BAM存储器可存储两组矢量,若有如下N维矢量A与P维矢量B:
A = [ a 0 , a 1 , … , a N − 1 ] ∈ { − 1 , 1 } N A=[a_0,a_1,\dots,a_{N-1}]\in \{-1,1\}^N A=[a0,a1,…,aN−1]∈{−1,1}N
B = [ b 0 , b 1 , … , b P − 1 ] ∈ { − 1 , 1 } P B=[b_0,b_1,\dots,b_{P-1}]\in \{-1,1\}^P B=[b0,b1,…,bP−1]∈{−1,1}P
构成M对矢量 ( A s , B s ) (A_s, B_s) (As,Bs), s = 0,1,…, M-1,将它们存入BAM存储器即可进行由A到B或由B到A的双向联想,即给定A(或B)可经联想得到对应的标准样本B(或A),当有噪声或缺损时,联想功能可使样本对复原。
人工神经网络力图实现这种功能。Kosko的BAM网络就是其中的一种。如图所示,与矢量A相应的一层有N个节点,另一层对应矢量B,有P个节点,两层间双向连接。假定B到A的传输为正向,正向的权矩阵为W,反之,A到B为反向传输,权矩阵为 W T W^T WT。
如果输入矢量由上层加入,且相应于网络中B的稳定状态,则经W之作用产生A稳定状态。同理,如果输入矢量在下层,且相应于网络中A的稳定状态,经 W T W^T WT之作用产生B稳定状态。
当任意矢量输入时,网络要经若干次迭代计算演变至稳态,过程为
W B ( t ) → A ( t + 1 ) W T A ( t + 1 ) → B ( t + 2 ) W B ( t + 2 ) → A ( t + 3 ) ⋯ WB(t)\rightarrow A(t+1)\\ W^TA(t+1)\rightarrow B(t+2)\\ WB(t+2)\rightarrow A(t+3)\\ \cdots WB(t)→A(t+1)WTA(t+1)→B(t+2)WB(t+2)→A(t+3)⋯
直到A,B为稳态,演变过程结束。
网络学习遵从Hebb规则,若给定M个双极性矢量对
( A 0 , B 0 ) , ( A 1 , B 1 ) … , ( A M − 1 , B M − 1 ) (A_0,B_0),(A_1,B_1)…,(A_{M-1},B_{M-1}) (A0,B0),(A1,B1)…,(AM−1,BM−1)
则正、反向权矩阵为
W = ∑ s = 0 M − 1 A s B s T W=\sum_{s=0}^{M-1}A_sB_s^T W=s=0∑M−1AsBsT
根据转置的性质:
W T = ∑ s = 0 M − 1 B s A s T W^T=\sum_{s=0}^{M-1}B_sA_s^T WT=s=0∑M−1BsAsT
如果BAM网络神经元函数阂值为0,则称为齐次BAMⅥ网终,其能量函
数为
E ( A , B ) = − 1 2 A T W B − − 1 2 B T W T A = − A T W B E(A, B)=-\frac{1}{2}A^TWB--\frac{1}{2}B^TW^TA=-A^TWB E(A,B)=−21ATWB−−21BTWTA=−ATWB
若神经元非线性函数为f,则述齐次BAM动态特性的差分方程为
- 正向联想(B→A)
a i ( t + 1 ) = f [ ∑ j = 1 P w i j b j ( t ) ] a_i(t+1)=f\left[\sum_{j=1}^Pw_{ij}b_j(t)\right] ai(t+1)=f[j=1∑Pwijbj(t)] - 反向联想(A→B)
b j ( t + 1 ) = f [ ∑ i = 1 N w i j a i ( t + 1 ) ] b_j(t+1)=f\left[\sum_{i=1}^Nw_{ij}a_i(t+1)\right] bj(t+1)=f[i=1∑Nwijai(t+1)]
处理步骤
所处理的数据为:
A 1 = [ 1 , − 1 , 1 , − 1 , 1 , − 1 , 1 , − 1 , 1 , − 1 , 1 , − 1 , 1 , − 1 , 1 ] T \mathbf{A}_{1}=[1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1,-1,1]^{T} A1=[1,−1,1,−1,1,−1,1,−1,1,−1,1,−1,1,−1,1]T
A 2 = [ 1 , 1 , − 1 , − 1 , 1 , 1 , − 1 , − 1 , 1 , 1 , − 1 , − 1 , 1 , 1 , − 1 ] T \mathbf{A}_{2}=[1,1,-1,-1,1,1,-1,-1,1,1,-1,-1,1,1,-1]^{T} A2=[1,1,−1,−1,1,1,−1,−1,1,1,−1,−1,1,1,−1]T
A 3 = [ 1 , 1 , 1 , − 1 , − 1 , − 1 , 1 , 1 , − 1 , − 1 , 1 , 1 , 1 ] T \mathbf{A}_{3}=[1,1,1,-1,-1,-1,1,1,-1,-1,1,1,1]^{T} A3=[1,1,1,−1,−1,−1,1,1,−1,−1,1,1,1]T
A 4 = [ 1 , 1 , 1 , 1 , − 1 , − 1 , − 1 , − 1 , 1 , 1 , 1 , 1 , − 1 , − 1 , − 1 ] T \mathbf{A}_{4}=[1,1,1,1,-1,-1,-1,-1,1,1,1,1,-1,-1,-1]^{T} A4=[1,1,1,1,−1,−1,−1,−1,1,1,1,1,−1,−1,−1]T
B 1 = [ 1 , 1 , 1 , 1 , − 1 , − 1 , − 1 , − 1 , 1 , 1 ] T B 2 = [ 1 , 1 , 1 , − 1 , − 1 , − 1 , 1 , 1 , 1 , − 1 ] T B 3 = [ 1 , 1 , − 1 , − 1 , 1 , 1 , − 1 , − 1 , 1 , 1 ] T B 4 = [ 1 , − 1 , 1 , − 1 , 1 , − 1 , 1 , − 1 , 1 , − 1 ] T \begin{aligned} \mathbf{B}_{1} &=[1,1,1,1,-1,-1,-1,-1,1,1]^{T} \\ \mathbf{B}_{2} &=[1,1,1,-1,-1,-1,1,1,1,-1]^{T} \\ \mathbf{B}_{3} &=[1,1,-1,-1,1,1,-1,-1,1,1]^{T} \\ \mathbf{B}_{4} &=[1,-1,1,-1,1,-1,1,-1,1,-1]^{T} \end{aligned} B1B2B3B4=[1,1,1,1,−1,−1,−1,−1,1,1]T=[1,1,1,−1,−1,−1,1,1,1,−1]T=[1,1,−1,−1,1,1,−1,−1,1,1]T=[1,−1,1,−1,1,−1,1,−1,1,−1]T
- 选择齐次 Koske型BAM网终编制程序实现联想记忆。设神经元非线性函数f为硬限幅函数,即f(x)=sgn(x);当x=0时,神经元的输出维持不变。
- 根据Hebb规则算出网终的连接权矩阵:
W = [ 4 2 2 − 2 0 − 2 0 − 2 4 0 2 0 0 − 4 2 0 2 0 2 − 2 2 0 0 0 2 0 − 2 − 4 2 2 − 2 − 4 0 0 2 0 2 0 − 2 − 2 0 2 2 2 − 4 − 2 0 2 0 0 − 2 0 0 0 − 2 0 2 4 − 2 − 2 0 2 − 2 2 0 2 − 4 − 2 0 4 − 2 0 − 4 0 2 4 − 2 0 − 2 2 4 2 2 − 2 0 − 2 0 − 2 4 0 0 − 2 2 − 2 0 − 2 4 2 0 − 4 0 − 2 2 2 0 − 2 0 − 2 0 0 − 2 − 4 0 0 2 0 2 0 − 2 − 2 2 4 0 0 − 2 0 − 2 0 2 2 0 2 − 2 − 2 0 2 0 2 0 0 0 2 − 2 2 0 2 − 4 − 2 0 4 ] W=\begin{bmatrix} 4 & 2 & 2 & -2 & 0 & -2 & 0 & -2 & 4 & 0 \\ 2 & 0 & 0 & -4 & 2 & 0 & 2 & 0 & 2 & -2 \\ 2 & 0 & 0 & 0 & 2 & 0 & -2 & -4 & 2 & 2 \\ -2 & -4 & 0 & 0 & 2 & 0 & 2 & 0 & -2 & -2 \\ 0 & 2 & 2 & 2 & -4 & -2 & 0 & 2 & 0 & 0 \\ -2 & 0 & 0 & 0 & -2 & 0 & 2 & 4 & -2 & -2 \\ 0 & 2 & -2 & 2 & 0 & 2 & -4 & -2 & 0 & 4 \\ -2 & 0 & -4 & 0 & 2 & 4 & -2 & 0 & -2 & 2 \\ 4 & 2 & 2 & -2 & 0 & -2 & 0 & -2 & 4 & 0 \\ 0 & -2 & 2 & -2 & 0 & -2 & 4 & 2 & 0 & -4 \\ 0 & -2 & 2 & 2 & 0 & -2 & 0 & -2 & 0 & 0 \\ -2 & -4 & 0 & 0 & 2 & 0 & 2 & 0 & -2 & -2 \\ 2 & 4 & 0 & 0 & -2 & 0 & -2 & 0 & 2 & 2 \\ 0 & 2 & -2 & -2 & 0 & 2 & 0 & 2 & 0 & 0 \\ 0 & 2 & -2 & 2 & 0 & 2 & -4 & -2 & 0 & 4 \end{bmatrix} W=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡422−20−20−2400−2200200−420202−2−2−4422200020−2−422200−2−2−2−4002020−2−2200−220222−4−2020002−200−2000−2024−2−2−2002202−2202−4−20402−20−4−20−4024−20−22−2002−2422−20−20−2400−22000−22−20−2420−40−2204⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤
四对矢量所对应的稳定状态的能量值:[-158 -142 -158 -146]
- 验证网络的联想能力。
选择标准样本 A i A_i Ai输入网终进行迭代运算直至网络稳定,观察上下两层的状态是否为 ( A i , B i ) (A_i,B_i) (Ai,Bi)。
经过权值和符号函数的非线性作用,进行一次迭代之后,迭代成功没有偏差。
A i = s g n ( W ∗ B i ) , i = 1 , 2 , 3 , 4 B i = s g n ( W T ∗ A i ) , i = 1 , 2 , 3 , 4 A_i=sgn(W*B_i),i=1,2,3,4\\ B_i=sgn(W^T*A_i),i=1,2,3,4 Ai=sgn(W∗Bi),i=1,2,3,4Bi=sgn(WT∗Ai),i=1,2,3,4 - 验证网络的抗噪能力。
随机选取标准矢量 A 1 A_1 A1若干位(如2位)取反形成畸变矢量
A 1 ′ = [ 1 − 1 1 − 1 1 − 1 − 1 − 1 1 1 1 − 1 1 − 1 1 ] T A_1'=\begin{bmatrix}1&-1&1&-1&1&-1&-1&-1&1&1&1&-1&1&-1&1\end{bmatrix}^T A1′=[1−11−11−1−1−1111−11−11]T
将其输入网络迭代至稳态,观察到结果:
A 1 ′ = A 1 , B 1 ′ = B 1 A_1'=A_1,B_1'=B_1 A1′=A1,B1′=B1
经过两次迭代期间能量变化为:
[-118, -158]
网络能量E在迭代过程中是减小的。 - 噪声大小对联想能力的影响。
统计个A矢量分别在1~3位取反时的联想正确率。记录所得结果产观察联想正确率和取反位数之间的关系
噪声对网络联想正确率的影响:
取反位数 | 1 | 2 | 3 |
---|---|---|---|
A1 | 100% | 93.4% | 81.6% |
A2 | 100% | 96.4% | 80.4% |
A3 | 100% | 90.5% | 76.2% |
A4 | 100% | 90.15% | 75.1% |
噪声对网络联想次数的影响:
取反位数 | 1 | 2 | 3 |
---|---|---|---|
A1 | 2 | 1.988 | 2.091 |
A2 | 2 | 2.0585 | 2.26 |
A3 | 2 | 2.0055 | 2.035 |
A4 | 2 | 1.9905 | 2.0655 |
- 比较正、反向联想的抗噪能力。统计4个B矢量分别在1-3位取反时的正确率
噪声对网络联想正确率的影响:
取反位数 | 1 | 2 | 3 |
---|---|---|---|
B1 | 100% | 70.2% | 31.4% |
B2 | 80.8% | 61.1% | 27.1% |
B3 | 90.25% | 69.9% | 23.55% |
B4 | 78.8% | 56.5% | 26.35% |
噪声对网络联想次数的影响:
取反位数 | 1 | 2 | 3 |
---|---|---|---|
B1 | 2. | 2.1605 | 2.219 |
B2 | 1.808 | 2.0555 | 2.252 |
B3 | 1.9025 | 1.9975 | 2.2105 |
B4 | 1.788 | 1.9355 | 2.165 |
- 伪稳定状态。
除以上四对矢量对应的稳定状态外,寻找2个伪稳定状态并分别计算所对应的能量值。
第一个样本所对应的伪稳定性:
A 1 ′ = [ 1 , − 1 , 1 , − 1 , 1 , − 1 , 1 , 1 , 1 , − 1 , − 1 , − 1 , 1 , 1 , 1 ] , B 1 ′ = [ 1 , 1 , − 1 , 1 , − 1 , 1 , − 1 , − 1 , 1 , 1 ] A 2 ′ = [ 1 , 1 , 1 , − 1 , − 1 , − 1 , 1 , − 1 , 1 , − 1 , 1 , − 1 , 1 , − 1 , 1 ] , B 2 ′ = [ 1 , 1 , 1 , 0 , 1 , − 1 , − 1 , − 1 , 1 , 1 ] A_1'=[1,-1,1,-1,1,-1,1,1,1,-1,-1,-1,1,1,1],B_1'=[1,1,-1,1,-1,1,-1,-1,1,1]\\ A_2'=[1,1,1,-1,-1,-1,1,-1,1,-1,1,-1,1,-1,1],B_2'=[1,1,1,0,1,-1,-1,-1,1,1] A1′=[1,−1,1,−1,1,−1,1,1,1,−1,−1,−1,1,1,1],B1′=[1,1,−1,1,−1,1,−1,−1,1,1]A2′=[1,1,1,−1,−1,−1,1,−1,1,−1,1,−1,1,−1,1],B2′=[1,1,1,0,1,−1,−1,−1,1,1]
此时对应的能量值分别为:
E 1 = − 146 E 2 = − 130 E_1=-146\\ E_2=-130 E1=−146E2=−130
而第一个样本所对应的能量值为-158。
思考
在步骤4中观察网络能量E是如何变化的?
从步骤4中可以看出,网络能量随着迭代次数的增加而减小。这是因为双向联想网络是Hopfield网络的一种,所以也具有Hopfeld网络特性。而对于标准Hopfield网络其能量函数E对时间的导数为负值。
d E d t = − ∑ i C i ( d V i d t ) 2 d f i − 1 ( V i ) d V i ≤ 0 \frac{\mathrm{d}E}{\mathrm{d}t}=-\sum_i C_i \left(\frac{\mathrm{d}V_i}{\mathrm{d}t}\right)^2 \frac{\mathrm{d}f_i^{-1}(V_i)}{\mathrm{d}V_i}\leq 0 dtdE=−i∑Ci(dtdVi)2dVidfi−1(Vi)≤0
也就是说网络息是朝着能量函数E减小的方问运动,且达到稳态时取极小值。如果我们想要“擦除”存储矢量对中的某对(Aa,B3},应如何调整网
络?
双向联想记忆网络特性主要体现在权值W,如果想要擦除存储矢量中的某对 ( A i , B i ) (A_i,B_i) (Ai,Bi),只需对权值进行调整。
因为权值为
W = ∑ s = 0 M − 1 A s B s T W=\sum_{s=0}^{M-1}A_sB_s^T W=s=0∑M−1AsBsT
所以为了尽量减小运算量,更新权值为:
W ′ = W − A i B i T W'=W-A_iB_i^T W′=W−AiBiT通过总结笫5步和第6步结果,能得岀什么结论?
- 随着网络噪声的增大,网络联想正确率下降,说明网络恢复的能力是有限的。
- 网络对不同样本组的记忆力大体相同。
- 随着噪声的增大,网络达到稳态所需的迭代次数略有增加。
源代码
所使用语言为python:
1. 计算网络
import numpy as np
import random;A= np.array([[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]] )
B=np.array([[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]])
A=A.T
B=B.T
# 计算权值矩阵
w=np.dot(A,B.T)
# 计算能量函数
e=np.zeros(4)
for i in range(4):e[i]=-np.dot(np.dot(A[:,i].T,w),B[:,i])
print(e)
2. 验证网络能力:
a0=A[:,0]r=random.sample(range(len(A)),2)
a=a0.copy()
a[r]=-a[r]
print(a0)
print(a)
temp=np.zeros((15,1),dtype=int)
# temp=0
# print(temp)
tempB=np.sign(np.dot(w.T,a))# temp=np.array( (15,4),dtype=int )timeNum=0
errArr=[]
while not((temp==a).all()):temp=a.copy()b=np.sign(np.dot(w.T,a))b[np.where(b==0)]=tempB[np.where(b==0)]tempB=b.copy()ee=-np.dot(np.dot(a.T,w),b)a=np.sign(np.dot(w,b))a[np.where(a==0)]=temp[np.where(a==0)]errArr.append(ee)timeNum+=1
# print(temp==A)
# print(tempB==B)
print(timeNum)
print(a)
print(errArr)
- 验证网络抗噪能力
验证对A样本的抗噪能力:
timeAll=np.zeros((4,3),dtype=int)
correctNum=np.zeros((4,3),dtype=int)
for i in range(4):for j in range(1,4):a0=A[:,i]for k in range(2000):r=random.sample(range(len(A)),j)a=a0.copy()a[r]=-a[r]temp=np.zeros((15,1),dtype=int)# temp=0# print(temp)tempB=np.sign(np.dot(w.T,a))timeNum=0errArr=[]while not((temp==a).all()):temp=a.copy()b=np.sign(np.dot(w.T,a))b[np.where(b==0)]=tempB[np.where(b==0)]tempB=b.copy()ee=-np.dot(np.dot(a.T,w),b)a=np.sign(np.dot(w,b))a[np.where(a==0)]=temp[np.where(a==0)]errArr.append(ee)timeNum+=1# print(temp==A)# print(tempB==B)timeAll[i][j-1]+=timeNumif (a0==a).all():correctNum[i][j-1]+=1#else:#print(i,a,b,ee)
print(timeAll/2000.0,correctNum/2000.0*100)
验证对B样本的抗噪能力:
timeAll=np.zeros((4,3),dtype=int)
correctNum=np.zeros((4,3),dtype=int)
for i in range(4):for j in range(1,4):b0=B[:,i]for k in range(2000):r=random.sample(range(len(B)),j)b=b0.copy()b[r]=-b[r]temp=np.zeros((10,1),dtype=int)# temp=0# print(temp)tempA=np.sign(np.dot(w,b))
# tempA[np.where(tempB==0)]=1timeNum=0errArr=[]while not((temp==b).all()):temp=b.copy()a=np.sign(np.dot(w,b))a[np.where(a==0)]=tempA[np.where(a==0)]tempA=a.copy()ee=-np.dot(np.dot(a.T,w),b)b=np.sign(np.dot(w.T,a))b[np.where(b==0)]=temp[np.where(b==0)]errArr.append(ee)timeNum+=1# print(temp==A)# print(tempB==B)timeAll[i][j-1]+=timeNumif (b0==b).all():correctNum[i][j-1]+=1
print(timeAll/2000.0,correctNum/2000.0*100)
双向联想记忆网络的原理与python简单实现相关推荐
- PID原理及python简单实现与调参
一.前言 近期在实际项目中使用到了PID控制算法,于是就该算法做一总结. 二.PID控制算法详解 2.1 比例控制算法 例子: 假设一个水缸,需要最终控制水缸的水位永远维持在1米的高度. 水位目标:T ...
- 蒙版原理以及Python简单实现
第一次发博客,就试试看的心态,不喜勿喷~ 蒙版可以将两张毫不相关的图片合成为一张图,其实就是使用蒙版mask对两张图片的像素做了加权平均处理的结果. 比如对于像素点(x1,y1,v1), (x2,y2 ...
- python网络爬虫程序_Python写的网络爬虫程序(很简单)
Python写的网络爬虫程序(很简单) 这是我的一位同学传给我的一个小的网页爬虫程序,觉得挺有意思的,和大家分享一下.不过有一点需要注意,要用python2.3,如果用python3.4会有些问题出现 ...
- 信号处理之频谱原理与python实现
目录 频谱分析 FFT频谱分析原理 下面就用python案例进行说明 案例1 案例2 短时傅里叶变换STFT 本分享为脑机学习者Rose整理发表于公众号:脑机接口社区.QQ交流群:941473018 ...
- python原理_强化学习:原理与Python实现
强化学习:原理与Python实现 作者:肖智清 著 出版日期:2019年08月 文件大小:17.18M 支持设备: ¥60.00 适用客户端: 言商书局 iPad/iPhone客户端:下载 Andro ...
- 网络编程原理进阶___TCP/IP(javaee)
点击跳转 本章重点 网络编程原理进阶 应用层 DNS 传输层 UDP TCP面试重点 `TCP`原理 确认应答 超时重传 连接管理(面试重点) 3次握手 4次挥手 滑动窗口 流量控制 拥塞控制 延时应 ...
- 条件生成对抗神经网络,生成对抗网络gan原理
关于GAN生成式对抗网络中判别器的输出的问题 . ...摘要生成式对抗网络GAN(Generativeadversarialnetworks)目前已经成为人工智能学界一个热门的研究方向.GAN的基本思 ...
- Apriori 算法原理以及python实现详解
Apriori 算法原理以及python实现 Apriori算法是第一个关联规则挖掘算法,也是最经典的算法.它利用逐层搜索的迭代方法找出数据库中项集的关系,以形成规则,其过程由连接(类矩阵运算)与 ...
- BP神经网络理解原理——用Python编程实现识别手写数字(翻译英文文献)
BP神经网络理解原理--用Python编程实现识别手写数字 备注,这里可以用这个方法在csdn中编辑公式: https://www.zybuluo.com/codeep/note/163962 一 ...
最新文章
- Pandas 数据类型概述与转换实战
- 大年初一微信闪退?看看如何修复的
- Python3中使用map()结果出错的解决方法
- 【Flask项目2】创建模型类映射到数据库,密码加密实现(3)
- 变分推断(Variational Inference)最新进展简述
- win7 VS2013 新建工程 编译lua5.2.0 静态库
- Apollo进阶课程⑯丨Apollo感知之旅——感知概貌
- oracle菜鸟学习之 复杂的更新语句使用
- 试述hadoop生态系统以及每个部分的具体功能_Hadoop在大数据分析中的意义和作用...
- python3 闭包
- git删除某次提交(某个commit)的方法【转】
- WINDOWS环境下RABBITMQ的启动和停止命令
- [渝粤教育] 西南科技大学 微机原理与应用 在线考试复习资料(2)
- SharePoint 2010的Form认证的用户注册功能
- mysql算法优化原则_Mysql语句优化的原则——让你写sql更加顺手
- win10便签常驻桌面_Win10用户的印象笔记便签深度体验 | 大使专栏
- AIR202/208使用AT指令方式连接MQTT调试笔记
- 规则库捕获漏洞信息专用脚本
- RxJava过滤操作符
- react 项目框架的搭建(一)