第十六章 Boltzmann波尔兹曼机

Boltzmann波尔兹曼机

Hinton、 Ackley等人以模拟退火思想为基础,对Hopfield模型引入了随机机制,提出了Boltzmann机。

和Hopfield模型一样,Boltzmann机的思想也是能量的思想,Hopfield模型是在计算状态转移时是一种确定的机制,Boltzmann机在计算下一个输出的时候并不是一种确定的状态,而是通过概率进行转移。

Boltzmann机结合多层前馈神经网络和离散Hopfield网络在网络结构、学习算法和动态运行机制方面的优点,是建立在离散Hopfield网基础上的,具有学习能力,能够通过一个模拟退火过程寻求最优解。

这里我们以一个例子来考虑Boltzmann波尔兹曼机的建立过程。

经常碰到这样的问题,也就是旅行商问题。这里有十个城市,如果想十个城市走一遍,怎么样的一种走法距离是最合理的。

在我们的脑子里想象一个这样的画面,十个城市,每个城市相当于一个节点,节点跟节点之间存在着联系,为了构建旅行商的问题,我们构造这样的一个网络,网络中有10排节点,每一排有10个节点,每个节点代表一个城市,节点和节点之间为城市和城市之间的负距离,这样构建了一个能量网络,求解旅行商的问题,是训练网络达到一种状态,使得一排的输出一个节点,10排中输出10个节点代表10个城市,而且每一排输出的节点都不能重复。因为我们构建的网络用距离来代表能量,符合的节点输出代表着距离最短的特性。

训练节点的参数也较为容易,使用距离作为连接参数,创建连接之间的各个权限:

void CalculateWeights(NET* Net)
{
  INT  n1,n2,n3,n4;
  INT  i,j;
  INT  Pred_n3, Succ_n3;
  REAL Weight;

  for (n1=0; n1<NUM_CITIES; n1++) {
    for (n2=0; n2<NUM_CITIES; n2++) {
      i = n1*NUM_CITIES+n2;
      for (n3=0; n3<NUM_CITIES; n3++) {
        for (n4=0; n4<NUM_CITIES; n4++) {
          j = n3*NUM_CITIES+n4;
          Weight = 0;
          if (i!=j) {
            Pred_n3 = (n3==0 ? NUM_CITIES-1 : n3-1);
            Succ_n3 = (n3==NUM_CITIES-1 ? 0 : n3+1);
            if ((n1==n3) OR (n2==n4))
              Weight = -Gamma;
            else if ((n1 == Pred_n3) OR (n1 == Succ_n3))
              Weight = -Distance[n2][n4];
          }
          Net->Weight[i][j] = Weight;
        }
      }
      Net->Threshold[i] = -Gamma/2;
    }
  }
}

具体的求解过程,步骤如下:

1.从n个节点中随机的选取节点j;

2.计算节点$j(1 \lt j\lt n)$的输入$u_j(t)$:$u<>j(t)=\sum{i\neq j}w_{ji}v_i-\theta_j$

3.以概率$P_j=f(u_j(t)/T)$,其中$f(x)=\frac{1}{2+exp^{(-x)}}$

4.其他节点不变v_i(t+1)=v_i(t):

5.下降温度T,回到步骤1,直到符合条件为止。

第二步和第三步中,几率的计算公式为:1 / (1 + exp(-Sum / Net->Temperature)),引入随机概率,根据温度进行选择,判断下一个是怎样的状态

void PropagateUnit(NET* Net, INT i)
{
  INT  j;
  REAL Sum, Probability;

  Sum = 0;
  for (j=0; j<Net->Units; j++) {
    Sum += Net->Weight[i][j] * Net->Output[j];
  }
  Sum -= Net->Threshold[i];
  Probability = 1 / (1 + exp(-Sum / Net->Temperature));
  if (RandomEqualREAL(0, 1) <= Probability)
    Net->Output[i] = TRUE;
  else
    Net->Output[i] = FALSE;
}

减低温度继续训练: void Anneal(NET<> Net) { Net->Temperature = 100; do { BringToThermalEquilibrium(Net); WriteTour(Net); Net->Temperature = 0.99; } while (NOT ValidTour(Net)); }

如果满足了我们的条件也就是每一排产生一个城市,每个城市都不重复:

BOOL ValidTour(NET* Net)
{
  INT n1,n2;
  INT Cities, Stops;

  for (n1=0; n1<NUM_CITIES; n1++) {
    Cities = 0;
    Stops  = 0;
    for (n2=0; n2<NUM_CITIES; n2++) {
      if (Net->Output[n1*NUM_CITIES+n2]) {
        if (++Cities > 1) 
          return FALSE;
      }
      if (Net->Output[n2*NUM_CITIES+n1]) {
        if (++Stops > 1) 
          return FALSE;
      }
    }
    if ((Cities != 1) OR (Stops != 1))
      return FALSE;
  }
  return TRUE;
}

满足了需要的条件以后也就是需要的解。

我们用负距离来进行构建的网络,在这个能量网络的基础上进行的迭代过程也保留着网络的特性,使用能量网络解决问题时,需要对问题进行相应的设计使得问题能够使用能量来进行求解。

PS: 如本文对您有帮助,不妨通过一下方式支持一下博主噢 ^_^

官方
微信
官方微信
Q Q
咨询
意见
反馈
返回
顶部