Ограниченная реализация машины Больцмана на python

#python #machine-learning #deep-learning #neural-network

Вопрос:

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

 import numpy as np

n_v, n_h = 32, 3 # size of visible and hidden units
s_v = np.random.randint(0,2, size = n_v) # input spin
s_h = np.random.randint(0, 2, size = n_h) #hidden spin

def sigmoid(x):
  return 1./(1.   np.exp(-x))

#Initialise parameters

weights = np.random.normal(size=(n_h, n_v)) # initialise weights(i, j): connection between hidden unit i and visible unit j 
B_field = np.random.normal(size=n_v) # B field in visible unit
c_bias = np.random.normal(size=n_h) #bias in hidden unit

def sample(prob):
  return np.random.binomial(1, prob)

def sample_visible(s_h, B_field, W):
  '''
  s_h is array of hidden units
  W is the weight
  returns: updated visible units
  '''
  argument = B_field   np.dot(weights.T, s_h) #sum_i (W_(il)*h_i b_l)
  prob_ = np.array(sigmoid(argument), dtype=float)
  return prob_, sample(sigmoid(argument)) # return either 0 or 1


def sample_hidden(s_v, c_bias, W):
  '''
  s_v is array of hidden units
  W is the weight
  returns: updated hidden units
  '''
  argument = c_bias   np.dot(weights, s_v) #sum_i (W_(il)*h_i b_l)
  prob_ = sigmoid(argument)
  return prob_, sample(sigmoid(argument)) # return either 0 or 1


for epoch in range(20):
  s_vk = np.copy(s_v)
  s_v0 = np.copy(s_v)
  prob_h0, _ = sample_hidden(s_v0, c_bias, weights)
  #print(prob_h0)
  for k in range(10):
    _, s_hk = sample_hidden(s_vk, c_bias, weights)
    _, s_vk = sample_visible(s_hk, B_field, weights)
  prob_hk, _ = sample_hidden(s_vk, c_bias, weights)
  weights  = np.einsum('i, j-> ij', prob_h0, s_v0) - np.einsum('i, j-> ij', prob_hk, s_vk)
  B_field  = s_v0 - s_vk
  c_bias  = prob_h0 - prob_hk
  train_loss = np.mean(s_v0-s_vk)
  print(train_loss)

print(B_field, weights, c_bias)