Я пытаюсь реализовать разреженно связанные весовые матрицы для моей простой трехслойной модели с прямой связью. Для этого я реализовал маску для каждого из моих слоев с определенным процентом нулей, идея заключалась в том, что я хотел бы обнулять один и тот же набор весов после каждого шага оптимизатора, чтобы мои слои не были полностью связаны. Но у меня с этим проблемы, потому что, когда я выполняю поэлементное умножение маски на весовые матрицы, веса перестают меняться при последующих обратных проходах. Чтобы проверить, не является ли моя маска причиной проблемы, я просто умножил свои весовые матрицы на скаляр 1,0, и это воссоздало проблему. Что здесь может происходить? Я проверил, и градиенты все еще рассчитываются. Просто потери больше не уменьшаются и веса не меняются. Выполняет ли это умножение какое-то отключение весов от графика?
Моя модель:
class TSP(nn.Module):
def __init__(self, input_size, hidden_size):
super(TSP, self).__init__()
self.sc1 = nn.Linear(input_size, hidden_size)
self.sc2 = nn.Linear(hidden_size, input_size)
torch.nn.init.normal_(self.sc1.weight, mean=0, std=0.1)
torch.nn.init.normal_(self.sc2.weight, mean=0, std=0.1)
def forward(self, x):
x = torch.relu(self.sc1(x))
x = (self.sc2(x))
return x
def predict_hidden(self, x):
x = torch.relu(self.sc1(x))
return x
Чтобы воссоздать эту проблему, все, что нужно, — это следующее, и веса перестанут обновляться:
model.sc1.weight = nn.Parameter(1. * model.sc1.weight)
model.sc2.weight = nn.Parameter(1. * model.sc2.weight)
Подробнее здесь: https://stackoverflow.com/questions/786 ... h-a-scalar