机器学习入门:第十七章 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 < j < n ) j(1 \lt j\lt n) j(1<j<n)的输入 u j ( t ) u_j(t) uj(t) u j ( t ) = ∑ i ≠ j w j i v i − θ j u_j(t)=\sum_{i\neq j}w_{ji}v_i-\theta_j uj(t)=i=jwjiviθj

3.以概率 P j = f ( u j ( t ) / T ) P_j=f(u_j(t)/T) Pj=f(uj(t)/T),其中 f ( x ) = 1 2 + e x p ( − x ) f(x)=\frac{1}{2+exp^{(-x)}} f(x)=2+exp(x)1

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;
}

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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

go2coding

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值