离散Hopfield神经网络摘记

\qquad 多层感知机所采用“分层型”神经网络的结构不同,Hopfield神经网络是基于“相互连接型”的、递归式的网络。

  • 相互连接型网络不分层,采用全连接结构,单元之间可以互相连接。
  • 网络中各单元取值的组合,能够记忆网络的状态,称为“联想记忆”。
  • 采用递归式结构,具有从输出到输入的反馈连接,期望的输出等于网络的输入,实际上是“自联想记忆

1. 离散型Hopfield网络结构

\qquad 离散Hopfield网络的基本结构如下图所示,主要具有以下特征:

( 1 ) \qquad(1) 每个单元没有自反馈(没有到自身的连接),即 w i i = 0 w_{ii}=0

( 2 ) \qquad(2) 单元之间的连接权重是对称的,即 w i j = w j i , i j w_{ij}=w_{ji},\forall i\neq j

( 3 ) \qquad(3) 每个单元的输出值只有 1 “-1” 1 “1” 两种状态,即 x i { 1 , 1 } x_i\in\{-1,1\}

在这里插入图片描述
\qquad 考虑一个包含 N N 二值单元的网络,每个单元的输出可以取 1 “-1” 1 “1” 两个值,因此整个网络包含了 2 N 2^N 种状态、可以采用“状态矢量”来描述。
\qquad

2. 网络中的状态变化

\qquad 假设第 i i 个神经元在 t t 时刻的输入 u i ( t ) u_i(t) 输出 x i ( t ) x_i(t) 连接权重 w i j w_{ij} 、阈值为 θ i ( t ) \theta_i(t) ,神经网络的状态矢量表示为 X ( t ) = [ x 1 ( t ) , x 2 ( t ) , , x N ( t ) ] T \boldsymbol X(t) = [x_1(t),x_2(t),\cdots,x_N(t)]^T

\qquad 由于采用了递归结构,存在输出到输入的反馈。在 t t 时刻,第 i i 个神经元接收来自于其他单元的输入 x j ( t ) ,   j i x_j(t),\ j\neq i ,就有:

u i ( t ) = j = 1 N w i j x j ( t ) θ i ( t ) \qquad\qquad u_i(t)=\displaystyle\sum_{j=1}^N w_{ij}x_j(t)-\theta_i(t)

\qquad 若记权值矩阵 W = [ w i j ] N × N \boldsymbol W=[w_{ij}]_{N\times N} ,记 t t 时刻的状态矢量 X \boldsymbol X ,那么: u i ( t ) = W X θ i ( t ) u_i(t)=\boldsymbol W\boldsymbol X -\theta_i(t)

\qquad 于是就可以得到第 i i 个神经元在第 t + 1 t+1 时刻的输出 x i ( t + 1 ) x_i(t+1) ,表示为:

x i ( t + 1 ) = f ( u i ( t ) ) = { 1 , u i ( t ) > 0 x i ( t ) , u i ( t ) = 0 1 , u i ( t ) < 0 \qquad\qquad x_i(t+1)=f(u_i(t))=\left\{\begin{matrix}1&,u_i(t)>0\\ \\x_i(t)&,u_i(t)=0 \\ \\ -1 &,u_i(t)<0 \end{matrix}\right.

\qquad Hopfield神经网络中的状态变化采用“异步模式”,每个时刻随机选择一个神经元的状态发生变化。比如 t t 时刻的状态 X ( t ) = [ x 1 ( t ) , , x k ( t ) , , x N ( t ) ] T \boldsymbol X(t) = [x_1(t),\cdots,x_k(t),\cdots,x_N(t)]^T 到了 t + 1 t+1 时刻,只有 x k ( t ) x_k(t) 变成了 x k ( t + 1 ) x_k(t+1) ,而其他的状态均保持不变,即: x i ( t + 1 ) = x i ( t ) ,   i k x_i(t+1)=x_i(t),\ \forall i\neq k
\qquad

3. 训练网络

\qquad Hopfield网络的训练采用Hebb规则如果一条突触两侧的两个神经元同时被激活,那么突触的强度将会增大

\qquad 在Hopfield网络中,突触表示权值 w i j w_{ij} ,如果神经元 i i 和神经元 j j 同时活跃,那么权值 w i j w_{ij} 的值会增大。这里的活跃指的是:若神经元 i i 的输出 x i x_i 和神经元 j j 的输出 x j x_j 同时为正 ( x i = + 1 , x j = + 1 ) (x_i=+1,x_j=+1) 、或者同时为负 ( x i = 1 , x j = 1 ) (x_i=-1,x_j=-1) ,权值会增大;若 x i x_i x j x_j 的符号相反,则会被抑制,权值就会减小

\qquad 因此,针对权值 w i j w_{ij} 的调整方式可以设定为:

{ w i j = x i x j w i j n e w = w i j o l d + w i j \qquad\qquad\left\{ \begin{aligned} w_{ij}&=x_i x_j \\ \\w_{ij}^{new}&=w_{ij}^{old}+w_{ij}\end{aligned}\right.

\qquad 显然,这符合对于“活跃”的解释。

\qquad
\qquad 考虑状态矢量 X = [ x 1 , x 2 , , x N ] T , x i { + 1 , 1 } \boldsymbol X = [x_1,x_2,\cdots,x_N]^T,x_i\in\{+1,-1\} 作为网络的输入,则对权值的调整可以表示为:

W = X X T = [ x 1 x 2 x N ] [ x 1 , x 2 , , x N ] = [ x 1 x 1 x 1 x 2 x 1 x N x 2 x 1 x 2 x 2 x 2 x N x N x 1 x N x 2 x N x N ] \qquad\qquad \boldsymbol W=\boldsymbol X \boldsymbol X^T= \left[\begin{matrix} x_1 \\ x_2 \\ \vdots \\x_N \\ \end{matrix}\right] [x_1,x_2,\cdots,x_N]= \left[\begin{matrix} x_1x_1&x_1x_2&\cdots &x_1x_N \\ x_2x_1&x_2x_2&\cdots &x_2x_N \\ \vdots&\vdots& &\vdots \\x_Nx_1&x_Nx_2&\cdots &x_Nx_N \\ \end{matrix}\right]

\qquad 由于网络中的神经元“没有到自身的连接”,即 w i i = x i x i = 0 w_{ii}=x_i x_i=0 ,若假设权值矩阵的初始值为全0阵,那么输入一个训练模式后的权值矩阵为:

W = X X T I = [ 0 x 1 x 2 x 1 x N x 2 x 1 0 x 2 x N x N x 1 x N x 2 0 ] \qquad\qquad \boldsymbol W=\boldsymbol X \boldsymbol X^T-\bold I=\left[\begin{matrix} 0&x_1x_2&\cdots &x_1x_N \\ x_2x_1&0&\cdots &x_2x_N \\ \vdots&\vdots& &\vdots \\x_Nx_1&x_Nx_2&\cdots &0 \\ \end{matrix}\right]

\qquad\qquad 即: w i j = x i x j , i j w_{ij}=x_i x_j,\qquad i\neq j

\qquad 从另一个角度来分析:由于Hopfield网络是“自联想网络”,如果向网络那个输入一个模式 X \boldsymbol X ,那么网络的输出的也应该同样是该模式 X \boldsymbol X ,实现了自我联想记忆。

对于第 i i 个神经元,其反馈后的输出为 x i ( t + 1 ) = f ( j = 1 N w i j x j ( t ) ) { + 1 , 1 } x_i(t+1)=f\left(\sum_{j=1}^N w_{ij}x_j(t)\right)\in\{+1,-1\} ,不考虑 f ( ) f(\cdot) 时就有 X ( t + 1 ) = W X ( t ) \boldsymbol X(t+1)=\boldsymbol W\boldsymbol X(t) ,因此权值矩阵 W \boldsymbol W 反映的规则实际上是一个“线性联想器”。
 
若只用一个模式 X ( 1 ) \boldsymbol X(1) 进行训练,则有 W = X ( 1 ) X ( 1 ) T \boldsymbol W=\boldsymbol X(1) \boldsymbol X(1)^T ,考虑以下情况:

  • 考虑理想情况,如果 X ( 1 ) \boldsymbol X(1) 是正交向量,那么 X ( 2 ) = W X ( 1 ) = X ( 1 ) X ( 1 ) T X ( 1 ) = X ( 1 ) \boldsymbol X(2)=\boldsymbol W\boldsymbol X(1)=\boldsymbol X(1) \boldsymbol X(1)^T\boldsymbol X(1)=\boldsymbol X(1) ,也就是实现了自我联想记忆
  • 对于一般情况,如果 X ( 1 ) \boldsymbol X(1) 不是正交向量,那么 X ( 2 ) = W X ( 1 ) \boldsymbol X(2)=\boldsymbol W\boldsymbol X(1) 的结果就需要 f ( ) = s g n ( ) f(\cdot)=sgn(\cdot) 之类的激活函数来把每个神经元的输入 u i ( 1 ) u_i(1) 规范化为输出 x i ( 2 ) { + 1 , 1 } x_i(2)\in\{+1,-1\} ,经过若干次迭代, X ( t ) \boldsymbol X(t) 会接近目标值 X ( 1 ) \boldsymbol X(1)
     
    也就是说,Hebb规则输入模式非正交时,会产生误差。
    【详细内容可参考:Hagan《神经网络设计》第七章】

\qquad 如果想要在网络中存储 M M 个模式,为了训练网络的连接权重,也就是要将 M M 个模式 X m = [ x 1 m , x 2 m , , x N m ] T ,   ( m = 1 , 2 , , M ) \boldsymbol X^m=[x_1^m,x_2^m,\cdots,x_N^m]^T,\ (m=1,2,\cdots,M) 输入到网络中,同样能够得到对应的模式 X m \boldsymbol X^m ,那么所有模式的连接权重就表示为:

W = X 1 ( X 1 ) T + X 2 ( X 2 ) T + + X M ( X M ) T M I = m = 1 M X m ( X m ) T M I \qquad\qquad \begin{aligned} \boldsymbol W&=\boldsymbol X^1 (\boldsymbol X^1)^T+\boldsymbol X^2 (\boldsymbol X^2)^T+\cdots+\boldsymbol X^M (\boldsymbol X^M)^T-M\bold I \\ &=\displaystyle\sum_{m=1}^M\boldsymbol X^m (\boldsymbol X^m)^T-M\bold I\end{aligned}

\qquad\qquad 即: w i j = m = 1 M x i m x j m , i j w_{ij}=\displaystyle\sum_{m=1}^M x_i^m x_j^m,\qquad i\neq j

\qquad 有些资料为了数学表达上的方便,常常增加了一个比例因子: w i j = 1 N m = 1 M x i m x j m ,   i j w_{ij}=\dfrac{1}{N}\displaystyle\sum_{m=1}^M x_i^m x_j^m,\ i\neq j
\qquad

4. 网络的能量函数

\qquad Hopfield网络的能量函数定义为:

E = 1 2 i = 1 N j = 1 N w i j x i x j + i = 1 N θ i x i \qquad\qquad E=-\dfrac{1}{2}\displaystyle\sum_{i=1}^N\displaystyle\sum_{j=1}^N w_{ij} x_i x_j+\displaystyle\sum_{i=1}^N\theta_i x_i

\qquad 按照前文中公式 x i ( t + 1 ) = f ( j = 1 N w i j x j ( t ) ) x_i(t+1)=f\left(\sum_{j=1}^N w_{ij}x_j(t)\right) 所定义的状态变化规则,上式定义的能量函数总是非递增的。

\qquad 由于Hopfield网络采用异步模式,假设在 t + 1 t+1 时刻只有第 k k 个分量发生了变化,其他的状态均保持不变,也就是 x k ( t + 1 ) x k ( t ) ,   x i ( t + 1 ) = x i ( t ) ,   i k x_k(t+1)\neq x_k(t),\ x_i(t+1)=x_i(t),\ \forall i\neq k 。因此,可以在能量函数中单独列出第 k k 个分量 x k x_k ,此时的能量函数可写为:

E = 1 2 i = 1 N j = 1 N w i j x i x j + i = 1 N θ i x i = 1 2 i = 1 N ( j k w i j x i x j + w i k x i x k ) + i k θ i x i + θ k x k = 1 2 i k ( j k w i j x i x j + w i k x i x k ) 1 2 j k w k j x k x j + i k θ i x i + θ k x k = 1 2 i k j k w i j x i x j + i k θ i x i      1 2 i k w i k x i x k 1 2 j k w k j x k x j + θ k x k \qquad\qquad \begin{aligned} E&=-\dfrac{1}{2}\displaystyle\sum_{i=1}^N\displaystyle\sum_{j=1}^N w_{ij} x_i x_j+\displaystyle\sum_{i=1}^N\theta_i x_i \\ &=-\dfrac{1}{2}\displaystyle\sum_{i=1}^N\left(\displaystyle\sum_{j\neq k} w_{ij} x_i x_j+w_{ik} x_i x_k\right)+\displaystyle\sum_{i\neq k}\theta_i x_i + \theta_k x_k\\ &=-\dfrac{1}{2}\displaystyle\sum_{i\neq k}\left(\displaystyle\sum_{j\neq k} w_{ij} x_i x_j+w_{ik} x_i x_k\right) -\dfrac{1}{2} \displaystyle\sum_{j\neq k} w_{kj} x_k x_j +\displaystyle\sum_{i\neq k}\theta_i x_i + \theta_k x_k\\ &=-\dfrac{1}{2}\displaystyle\sum_{i\neq k}\displaystyle\sum_{j\neq k} w_{ij} x_i x_j +\displaystyle\sum_{i\neq k}\theta_i x_i \\ &\ \ \ \ -\dfrac{1}{2}\displaystyle\sum_{i\neq k}w_{ik} x_i x_k -\dfrac{1}{2} \displaystyle\sum_{j\neq k} w_{kj} x_k x_j + \theta_k x_k\\ \end{aligned}

\qquad t t 时刻到 t + 1 t+1 时刻, x k ( t ) x k ( t + 1 ) x_k(t)\longrightarrow x_k(t+1) 发生了改变, Δ x k = x k ( t + 1 ) x k ( t ) \Delta x_k=x_k(t+1)-x_k(t) 可能的值只可能是 + 2 +2 2 -2 ,因此能量函数的变化值为:

Δ E k = 1 2 i k w i k x i Δ x k 1 2 j k w k j x j Δ x k + θ k Δ x k = ( j = 1 N w k j x j θ k ) Δ x k , w k k = 0 , w i k = w k i = u k Δ x k \qquad\qquad \begin{aligned} \Delta E_k &= -\dfrac{1}{2}\displaystyle\sum_{i\neq k}w_{ik} x_i \Delta x_k -\dfrac{1}{2} \displaystyle\sum_{j\neq k} w_{kj}x_j\Delta x_k + \theta_k \Delta x_k \\ &= -\left(\displaystyle\sum_{j=1}^N w_{kj}x_j - \theta_k\right) \Delta x_k,\qquad 由于w_{kk}=0, w_{ik}=w_{ki}\\ &= -u_k \Delta x_k \\ \end{aligned}

\qquad 显然

{ u k > 0 , Δ x k = x k ( t + 1 ) x k ( t ) = 2     u k < 0 , Δ x k = x k ( t + 1 ) x k ( t ) = 2 u k Δ x k > 0 Δ E k < 0 \qquad\qquad\left\{\begin{matrix} u_k>0,\Delta x_k=x_k(t+1)-x_k(t)=2\\ \\ \ \ \ u_k<0,\Delta x_k=x_k(t+1)-x_k(t)=-2\end{matrix}\right.\Longrightarrow u_k \Delta x_k>0\Longrightarrow\Delta E_k<0

\qquad 因此,采用异步模式更新网络状态时,网络的能量函数值总是下降的。随着时间不断推进,网络的能量函数值逐渐减小,直到达到稳定状态。
\qquad

5. Hopfield模型的实现

5.1 算法步骤

\qquad 假设有 M M 个模式 X m = [ x 1 m , x 2 m , , x N m ] T ,   ( m = 1 , 2 , , M ) \boldsymbol X^m=[x_1^m,x_2^m,\cdots,x_N^m]^T,\ (m=1,2,\cdots,M)

( 1 ) \qquad(1) 训练网络

W = m = 1 M X m ( X m ) T M I \qquad\qquad\qquad \boldsymbol W=\displaystyle\sum_{m=1}^M\boldsymbol X^m (\boldsymbol X^m)^T-M\bold I
\qquad   或者:
w i j = m = 1 M x i m x j m   ( i j ) ,   w i i = 0 \qquad\qquad\qquad w_{ij}=\displaystyle\sum_{m=1}^M x_i^m x_j^m \ (i\neq j),\ w_{ii}=0

( 2 ) \qquad(2) 异步模式更新状态

\qquad   通过异步模式更新 X ( t ) = [ x 1 ( t ) , x 2 ( t ) , , x N ( t ) ] T \boldsymbol X(t) = [x_1(t),x_2(t),\cdots,x_N(t)]^T 中元素的状态,
\qquad   每次迭代时,随机选择其中一个元素进行状态更新:

x i ( t + 1 ) = f ( j = 1 N w i j x j ( t ) ) \qquad\qquad\qquad x_i(t+1)=f\left(\sum_{j=1}^N w_{ij}x_j(t)\right)

\qquad   直到 X \boldsymbol X 的状态稳定、不再变化时,作为输出
\qquad

5.2 算法仿真——3个神经元模型

\qquad 考虑三个神经元的Hopfield网络,如下图所示。
在这里插入图片描述

Simon Haykin. Neural Networks and Learning Machines (3rd Edition). Fig.13.14(b)

\qquad 这样的3个神经元的二值网络,有2个稳定的状态,分别为 X 1 = [ 1 , 1 , 1 ] T \boldsymbol X^1=[1,-1,1]^T X 2 = [ 1 , 1 , 1 ] T \boldsymbol X^2=[-1,1,-1]^T ,网络的权值为:

W = X 1 ( X 1 ) T + X 2 ( X 2 ) T 2 I = [ 0 2 2 2 0 2 2 2 0 ] \qquad\qquad\boldsymbol W=\boldsymbol X^1 (\boldsymbol X^1)^T+\boldsymbol X^2 (\boldsymbol X^2)^T-2\bold I=\left[\begin{matrix}0&-2&2\\-2&0&-2\\2&-2&0\end{matrix}\right]

\qquad 其它的6个状态输入网络中,最终都会收敛到 X 1 \boldsymbol X^1 X 2 \boldsymbol X^2

测试代码

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 ]

\qquad 如果单独考虑某个输入,观察异步模式和网络能量变化,比如某一次运行:

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  \rightarrow  直到这一步,才随机选对了需要改变状态的神经元
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 ]

猜你喜欢

转载自blog.csdn.net/xfijun/article/details/105011305
今日推荐