Я пишу реализацию Bayesian Dropout, и следующий код работал после нескольких часов отладки:
class DropoutLayer(nn.Module):
def __init__(self, n_in, n_out, dropout_rate):
super(DropoutLayer,self).__init__()
self.M = Parameter(torch.normal(torch.zeros(n_in,n_out),0.01))
self.m = Parameter(torch.rand(n_out))
# 1-p is used to be consistent with original dropout definition
self.z = Bernoulli(torch.tensor([1-dropout_rate]))
self.W = Parameter(torch.mm(
torch.diagflat(self.z.sample(sample_shape=(n_in,))),
self.M))
def forward(self,x,act):
activation = torch.mm(x,self.W) + self.m
out = act(activation)
return out
Однако я, похоже, не понимаю, почему умножение матриц в self.W требует переноса параметров. Я предположил бы, что как только я назначу self.M как параметр в autograd, мне не нужно будет делать это для любых значений, которые используют его в дальнейшем. Зачем мне это здесь?
После добавления этой оболочки нейронная сеть сходится без проблем.
Не могли бы вы сказать мне, почему это так, и есть ли более простое заменитель этого решения, которое мне не нравится?