Уравнение аппроксимации свободной энергии в реляционных системах Больцмана
Поясните учебник по устранению неполадок:
Свободная энергия в питоне
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, вычисляет log и суммирует его для скрытого термина.
Я считаю, что это немного отличается от уравнения свободной энергии в Learning Deep Architectures:
FreeEnergy (x) = -b'x - ΣlogΣe ^ hi (ci + Wix).
Где:
-
hi
- это скрытый слой i
,
-
ci
является скрытым смещением i
в векторе c.
Он вычисляет exp и sum, вычисляет log с учетом суммы. после чего суммирует весь эксперт продукта на основе количества видимого блока.
Вышеприведенное уравнение является формулой 2.21 из Изучение глубоких архитектур для ИИ (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, но я запутался в этом. Заранее благодарим за помощь!
Ответы
Ответ 1
Я понимаю, что ваше замешательство связано с определением функции свободной энергии в ссылочном коде python. Если это не то, о чем вы просите, я извиняюсь.
Во-первых, это не приближение. Похоже, они предполагают, что скрытые единицы двоично оценены. Помните, что свободная энергия - это всего лишь (log of) энергия со скрытыми переменными, маргинализированная. Итак, внутренняя сумма в уравнении свободной энергии, указанная выше, является просто суммой по значениям, которые может взять i-й скрытый элемент, в этом случае {0,1}. Так как exp (0) = 1, то внутренняя сумма просто становится 1 + exp (...). См. Раздел "RBMs with Binary Units" в ссылка, которую вы предоставили.
Я не знаком с математической библиотекой apache commons в java, поэтому я не могу получить огромную помощь там, но реализация должна быть прямым переводом с этой функции python.