#python #machine-learning #theano
#python #машинное обучение #theano
Вопрос:
символьные переменные
x = T.dmatrix('x')
y = T.dmatrix('y')
Это веса нейронной сети
W1_vals = np.asarray(rng.randn(input, hidden), dtype=theano.config.floatX)
W1 = shared(value=W1_vals, name='W1')
W2_vals = np.asarray(rng.randn(hidden, output), dtype=theano.config.floatX)
W2 = shared(value=W2_vals, name='W2')
cost = T.mean(T.nnet.categorical_crossentropy(prob_y_given_x, y))
params = [W1, W2]
grads = T.grad(cost, params)
правило обновления:
lr = 0.01
updates = [(param, param-lr*grad) for param, grad in zip(params, grads)]
функция для обучения модели
train = function(inputs=[x, y], outputs=cost, updates=updates)
Когда я печатаю значения W1
и W2
использую W1.get_value()
и W2.get_value()
после вызова каждой итерации функции train, я обнаруживаю, что меняются только W2
значения, тогда W1
как значения остаются неизменными и не меняются.
Чего мне не хватает в моем коде?
Комментарии:
1. по-видимому, все кажется правильным, как вы вычисляли
prob_y_given_x
? Единственная причина, по которой веса не меняются, заключается в том, что градиент равен нулю, что может произойти только тогда, когда вы получаете правильные прогнозы даже из ваших рандомизированных весов.2. hidden_activations = T.nnet.relu(T.dot(x, W1)) prob_y_given_x = T.nnet.softmax(T.dot(hidden_activations, W2)) Крайне маловероятно, что правильные прогнозы выполняются при случайных весах!
3. Оказывается, градиенты wrt
W1
равны нулю, но почему они становятся равными нулю даже при случайной инициализации весов?