Аппроксимационное уравнение свободной энергии в машинах Больцмана с ограничением

Согласно учебнику по глубокому обучению :

Свободная энергия в питоне

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

Я не очень хорошо разбираюсь в питоне, в основном он получает эксперт по продукту каждой видимой единицы в виде вектора wx_b, вычисляет exp и плюс 1, вычисляет log и суммирует его для скрытого термина.

Я считаю, что это немного отличается от уравнения свободной энергии в Learning Deep Architectures:

FreeEnergy(x) = −b′x − ∑log∑e^hi(ci+Wix).

Где:

  • hi— единица iскрытого слоя,
  • ciiскрытое смещение в векторе c.

Вычисляет exp и сумму, вычисляет логарифм относительно значения суммы. ведь суммируют все продукты эксперта исходя из количества видимых единиц.

Приведенное выше уравнение — это уравнение 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, но меня это смущает. Заранее благодарю за любую помощь!

12
задан hippietrail 1 December 2012 в 01:43
поделиться