根据深度学习教程:
蟒蛇中的自由能是
def free_energy(self, v_sample):
''' Function to compute the free energy '''
wx_b = T.dot(v_sample, self.W) + self.hbias
vbias_term = T.dot(v_sample, self.vbias)
hidden_term = T.sum(T.log(1 + T.exp(wx_b)), axis=1)
return -hidden_term - vbias_term
我不太擅长python,基本上它得到每个可见单位的产品专家作为向量wx_b,计算exp和加1,计算日志并将其求和为隐藏项。
我认为这与学习深度架构中的自由能方程略有不同:
FreeEnergy(x( = −b′x − ∑log∑e^hi(ci+Wix(.
哪里:
-
hi
是隐藏层i
单元, -
ci
是向量 c 中i
隐藏偏差。
它计算exp和总和,计算对总和值的对数。 毕竟所有产品专家的总和都基于可见单位的数量。
上面的等式是eq.5.21,来自Learning Deep Architectures for AI(Yoshua Bengio(
下面是我的 java 实现草案vis_v是可见层示例,hid_v是隐藏层单元示例。
private double freeEnergy(RealVector vis_v, RealVector hid_v){
RealVector wx_hb= W.preMultiply(vis_v).add(hBias);
double vbias_term= vis_v.dotProduct(vBias);
double sum_hidden_term = 0;
for(int i=0;i< wx_hb.getDimension();i++){
RealVector vis_expert = hid_v.mapMultiply(wx_hb.getEntry(i));
double hidden_term= StatUtils.sum(vis_expert.map(new Exp()).toArray());
sum_hidden_term+=Math.log(hidden_term);
}
return -sum_hidden_term-vbias_term;
}
这是某种近似值吗?我正在尝试在 java 中实现同样的事情,但对此感到困惑。提前感谢任何帮助!
我发现您的困惑在于参考 python 代码中自由能函数的定义。如果这不是你的要求,我道歉。
首先,这不是一个近似值。看起来他们假设隐藏单位是二进制值的。请记住,自由能只是隐藏变量被边缘化的能量(对数(。因此,您上面列出的自由能方程中的内部和只是 i^th 隐藏单元可以取的值的总和,在这种情况下,为 {0,1}。由于 exp(0( = 1,内部总和正好变为 1+exp(...(。请参阅您提供的链接中的"具有二进制单位的 RBM"部分。
我不熟悉 java 中的 apache commons 数学库,所以我不能在那里提供大量的帮助,但实现应该是该 python 函数的简单翻译。