PyTorch, как реализовать отключение (подключения и соответствующие градиенты маскируются)? - PullRequest
0 голосов
/ 07 июня 2018

Я пытаюсь реализовать следующий график.Как вы можете видеть, нейроны не полностью связаны, то есть веса замаскированы и их соответствующие градиенты.

enter image description here

import torch
import numpy as np

x = torch.rand((3, 1))
# tensor([[ 0.8525],
#         [ 0.1509],
#         [ 0.9724]])

weights = torch.rand((2, 3), requires_grad=True)
# tensor([[ 0.3240,  0.0792,  0.6858],
#         [ 0.5248,  0.4565,  0.3625]])

mask = torch.Tensor([[0,1,0],[1,0,1]])
# tensor([[ 0.,  1.,  0.],
#         [ 1.,  0.,  1.]])

mask_weights = weights * mask
# tensor([[ 0.0000,  0.0792,  0.0000],
#         [ 0.5248,  0.0000,  0.3625]])

y = torch.mm(mask_weights, x)
# tensor([[ 0.0120],
#         [ 0.7999]])

ЭтоВопрос изначально размещен на Pytorch Forum .Обратите внимание на вышеприведенный способ

mask_weights = weights * mask

НЕ подходит, так как соответствующие градиенты не равны 0.

IsЕсть ли элегантный способ сделать это, пожалуйста?

Спасибо заранее.

1 Ответ

0 голосов
/ 15 июня 2018

На самом деле, вышеуказанный метод является правильным. Разъединения по существу блокируют прямую и обратную передачу на соответствующих соединениях. Другими словами, веса и градиенты маскируются.Коды, о которых идет речь, показывают первое, в то время как этот ответ показывает второе.

mask_weights.register_hook(print)

z = torch.Tensor([[1], [1]])
# tensor([[ 1.],
#         [ 1.]])

out = (y-z).mean()
# tensor(-0.6595)

out.backward()
# tensor([[ 0.1920,  0.1757,  0.0046],
#         [ 0.1920,  0.1757,  0.0046]])

weights.grad
# tensor([[ 0.0000,  0.1757,  0.0000],
#         [ 0.1920,  0.0000,  0.0046]])

Как видите, градиенты весов маскируются автоматически.

...