#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)