Pytorch: градиент выхода с параметрами.rt - PullRequest
0 голосов
/ 04 мая 2018

Меня интересует поиск градиента выходных данных нейронной сети относительно параметров (весов и смещений).

В частности, предположим, что у меня есть следующая структура нейронной сети [6,4,3,1]. Размер входных выборок равен 20. Что меня интересует, так это нахождение градиента выходных данных нейронной сети по отношению к весам (и смещениям), которое, если я не ошибаюсь, в данном случае будет 47. В литературе этот градиент иногда называют Weight_Jacobian.

Я использую Pytorch версии 0.4.0 на Python 3.6 на ноутбуке Jupyter.

Код, который я создал, таков:

def init_params(layer_sizes, scale=0.1, rs=npr.RandomState(0)):
    return [(rs.randn(insize, outsize) * scale,   # weight matrix
                 rs.randn(outsize) * scale)           # bias vector
                 for insize, outsize in 
                 zip(layer_sizes[:-1],layer_sizes[1:])]
layers = [6, 4, 3, 1]
w = init_params(layers)
first_layer_w = Variable(torch.tensor(w[0][0],requires_grad=True))
first_layer_bias = Variable(torch.tensor(w[0][1],requires_grad=True))
second_layer_w = Variable(torch.tensor(w[1][0],requires_grad=True))
second_layer_bias = Variable(torch.tensor(w[1][1],requires_grad=True))
third_layer_w = Variable(torch.tensor(w[2][0],requires_grad=True))
third_layer_bias = Variable(torch.tensor(w[2][1],requires_grad=True))
X = Variable(torch.tensor(X_batch),requires_grad=True)
output=torch.tanh(torch.mm(torch.tanh(torch.mm(torch.tanh(torch.mm(X,first_layer_w)+first_layer_bias),second_layer_w)+second_layer_bias),third_layer_w)+third_layer_bias)
output.backward()

Как видно из кода, я использую гиперболический тангенс в качестве нелинейности. Код создает выходной вектор длиной 20. Теперь мне интересно найти градиент этого выходного вектора со всеми весами (все 47 из них). Я прочитал документацию Pytorch на здесь . Я также видел подобные вопросы, например, здесь . Однако мне не удалось найти градиент выходного вектора w.r.t параметров. Если я использую функцию Pytorch backward (), она выдаст ошибку как

RuntimeError: grad can be implicitly created only for scalar outputs

У меня вопрос, есть ли способ рассчитать градиент выходного вектора по параметрам, который по сути можно представить в виде матрицы 20 * 47, поскольку у меня размер выходного вектора равен 20, а размер вектора параметров равен 47? Если так, то как? Что-то не так в моем коде? Вы можете взять любой пример X, если его размер равен 20 * 6.

...