Уравнение приближения свободной энергии в ограничительных машинах Больцмана - PullRequest
12 голосов
/ 30 марта 2012

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

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

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, вычисляет лог и суммирует его для скрытого термина

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

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

Где:

  • hi это единица измерения i скрытый слой,
  • ci - это скрытое смещение i в векторе c.

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

Вышеприведенное уравнение - уравнение 5.21 из Изучение глубоких архитектур для ИИ (Йошуа Бенжио)

Ниже приведен мой черновой вариант реализации 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, но меня это смущает. Заранее спасибо за любую помощь!

1 Ответ

3 голосов
/ 30 марта 2012

Я понимаю, что ваше замешательство связано с определением функции свободной энергии в эталонном коде Python. Если это не то, что вы просите, я прошу прощения.

Во-первых, это не приближение. Похоже, они предполагают, что скрытые единицы имеют двоичное значение. Помните, что свободная энергия - это просто логарифм энергии со скрытыми переменными. Итак, внутренняя сумма в приведенном выше уравнении свободной энергии - это просто сумма значений, которые может принять i-я скрытая единица, которые в данном случае равны {0,1}. Поскольку exp (0) = 1, эта внутренняя сумма просто становится 1 + exp (...). См. Раздел «RBMs с двоичными единицами» в предоставленной вами ссылке .

Я не знаком с математической библиотекой apache commons в java, поэтому я не могу оказать здесь огромную помощь, но реализация должна быть простым переводом из этой функции python.

...