#python #tensorflow #deep-learning #neural-network #pytorch
#python #тензорный поток #глубокое обучение #нейронная сеть #pytorch
Вопрос:
Веса в плотном слое нейронной сети представляют собой матрицу (n, d), и я хочу заставить некоторые из этих весов всегда быть равными нулю. У меня есть другая матрица (n, d), которая является маской, записи которой могут быть ненулевыми. Идея заключается в том, что слой не должен быть действительно плотным, но некоторые соединения отсутствуют (т. Е. равны 0).
Как этого добиться при обучении с помощью PyTorch (или Tensorflow)? Я не хочу, чтобы эти веса становились ненулевыми во время обучения.
Одним из методов, если он не поддерживает его напрямую, было бы обнуление желаемых записей после каждой итерации обучения.
Комментарии:
1. Вы могли бы использовать регуляризацию L1.
Ответ №1:
Вы можете воспользоваться разреженным типом данных pytorch:
class SparseLinear(nn.Module):
def __init__(self, in_features, out_features, sparse_indices):
super(SparseLinear, self).__init__()
self.weight = nn.Parameter(data=torch.sparse.FloatTensor(sparse_indices, torch.randn(sparse_indices.shape[1]), [in_features, out_features]), requires_grad=True)
self.bias = nn.Parameter(data=torch.randn(out_features), requires_grad=True)
def forward(self, x):
return torch.sparse.admm(self.bias, self.weight, x, 1., 1.)
Ответ №2:
Я предполагаю, что вы хотите использовать плотные тензоры для реализации такого рода разреженно связанного слоя. Если это так, вы можете определить матрицу маски (тензор) равной 0.0 для элементов, которые вы хотите замаскировать (без подключения) и 1.0 в противном случае. Затем при прямом переходе вы можете просто умножить свой тензор веса на тензор маски (вы хотите использовать поэлементное произведение, которое используется по умолчанию при использовании оператора * в PyTorch), прежде чем выполнять умножение матрицы на входные данные для вашего разреженного слоя.
Чтобы это работало должным образом, вы должны убедиться, что ваш тензор маски не получает градиент, иначе он будет обновлен и станет недействительным при обучении вашей модели. Для этого вы просто устанавливаете requires_grad=False
при создании тензор маски (смотрите здесь).