如何在PyTorch中优化指定范围内的参数?

如何在PyTorch中优化指定范围内的参数?,pytorch,Pytorch,可训练参数p初始化为0.5: class Model(nn.Module): def __init__(self): super(Model, self).__init__() self.p = nn.Parameter(torch.tensor(0.5)) def forward(self, x): y = x * self.p return y model = Model() optimizer = torc

可训练参数
p
初始化为0.5:

class Model(nn.Module):
    def __init__(self):
        super(Model, self).__init__()
        self.p = nn.Parameter(torch.tensor(0.5))

    def forward(self, x):
        y = x * self.p
        return y

model = Model()
optimizer = torch.optim.Adam(model.parameters())
loss_func = torch.nn.MSELoss()
y = torch.tensor([0.1,0.2,0.3])
x = torch.tensor([1.,2.,3.])
model.train()
for i in range(3):
    pred = model(x)
    optimizer.zero_grad()
    loss = loss_func(pred, y)
    loss.backward()
    optimizer.step()

我想在一定范围内优化
p
。例如,
p
的值在每个历元中必须介于0.2到0.6之间。

这是一个玩具示例还是您的实际代码?如果是前者,则梯度下降法可能不是常用的方法。现在,它只是一个线性回归,可以用封闭形式求解。@tilman151,这是一个玩具例子。我想让可训练参数
p
在训练过程中始终处于特定范围内,例如[0.2,0.6],仅仅梯度下降无法解决这类问题。您需要寻找约束优化。如果您的条件较软(意味着
p
可能超出范围,但可能超出的范围最小),那么您可以尝试在损失函数中添加一个惩罚,该惩罚约束
p
尽可能保持在范围内这是一种重参数化技巧。在变分自动编码器中,std是在将值传递给exp函数后建模的,exp函数在没有任何梯度修改或附加正则化器的情况下强制非负性。同样地,你可以将p馈送到0.2+0.4*torch.sigmoid(p)或你设计的分段线性函数,在这里你可以享受预期范围的微分。损失函数总是根据你想要解决的问题进行调整,我们这里不知道。所以很难说。这确实是我心目中的惩罚,尽管你可以用指数、比例因子等增加它的斜率。另一方面,@hkyi的想法确实值得考虑