Установка ограничений для параметров в pytorch

#python #vector #pytorch

Вопрос:

Я пытаюсь установить некоторые ограничения для параметров веса в PyTorch, например, сумма каждой строки матрицы веса должна быть ровно одной для полностью подключенного слоя:

 class Net(nn.Module):
    def __init__(self):
        super(Net, self).__init__()
        self.layer1 = nn.Linear(28*28, 10*10)
        self.layer2 = nn.Linear(10*10, 5*5)
        self.layer3 = nn.Linear(5*5, 10)

    def forward(self, x):
        x=torch.sigmoid(self.layer1(x))
        x=torch.sigmoid(self.layer2(x))
        x=torch.sigmoid(self.layer3(x))

model=Net()
 

Ограничением для этого примера сети будет:

 torch.sum(model.linear1.weight,0)==1
torch.sum(model.linear2.weight,0)==1
torch.sum(model.linear3.weight,0)==1
 

Обычно используемый метод установки ограничения, clamp , используется для установки ограничений для каждого элемента, но в этом случае я бы устанавливал ограничение для каждой строки, а не для любого конкретного элемента матрицы веса. Существуют ли какие-либо способы реализации такого рода ограничений?

Комментарии:

1. Пожалуйста, сформулируйте свой вопрос лучше с точки зрения входных данных и требуемых выходных данных. В том виде, в каком он есть сейчас, он не отвечает.

2. Также » clamp не полезно» не является полезным утверждением

3. зачем вам вообще нужно это ограничение для весов? Это эксперимент?

4. @Gulzar Спасибо, добавил пример кода для уточнения

5. @RNanthak Для эксперимента требуются некоторые более сложные ограничения, но я спотыкаюсь даже в самых простых случаях, извините!

Ответ №1:

Способ, о котором я могу подумать, — это, например, нормализовать выбранный вами вектор по его норме, которая даст его направление, с размером 1.

 w0 = model.linear1.weight[0, :]
w0_hat = w0 / torch.linalg.norm(w0) # direction of w0, norm=1
 

Я действительно не вижу способа сделать это для .sum себя , но я также не понимаю, зачем кому-то этого хотеть.


Использование нормы L1 сделает это для .sum , если вы можете гарантировать, что все веса неотрицательны. Возможно, это не то, чего ты хочешь.


Если вы настаиваете на нормализации таким образом, чтобы значение .sum было равно 1, вам придется определить нормализацию самостоятельно, потому что нет единого алгоритма, позволяющего решить, какой индекс веса изменяется и на сколько.

Комментарии:

1. Первая реализация в порядке! Это .sum было сделано только в целях разъяснения и действительно не нужно.