Веса не обновляются на каждой итерации в theano

#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 равны нулю, но почему они становятся равными нулю даже при случайной инициализации весов?