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;
}
满足了需要的条件以后也就是需要的解。
我们用负距离来进行构建的网络,在这个能量网络的基础上进行的迭代过程也保留着网络的特性,使用能量网络解决问题时,需要对问题进行相应的设计使得问题能够使用能量来进行求解。