我尝试在 Pytorch 中定义一个简单的模型。该模型计算高斯分布的负对数概率:
import torch
import torch.nn as nn
class GaussianModel(nn.Module):
def __init__(self):
super(GaussianModel, self).__init__()
self.register_parameter('mean', nn.Parameter(torch.zeros(1),
requires_grad=True))
self.pdf = torch.distributions.Normal(self.state_dict()['mean'],
torch.tensor([1.0]))
def forward(self, x):
return -self.pdf.log_prob(x)
model = GaussianModel()
Run Code Online (Sandbox Code Playgroud)
然后我尝试优化mean
参数:
optimizer = torch.optim.SGD(model.parameters(), lr=0.002)
for _ in range(5):
optimizer.zero_grad()
nll = model(torch.tensor([3.0], requires_grad=True))
nll.backward()
optimizer.step()
print('mean : ', model.state_dict()['mean'],
' - Negative Loglikelihood : ', nll.item())
Run Code Online (Sandbox Code Playgroud)
但看起来梯度为零并且mean
没有改变:
mean : tensor([0.]) - Negative Loglikelihood : 5.418938636779785
mean : tensor([0.]) - Negative Loglikelihood : 5.418938636779785
mean : …
Run Code Online (Sandbox Code Playgroud) 请考虑以下代码:
int a = 5;
int b = a++;
cout << "b is " << b << endl; // b is 5
Run Code Online (Sandbox Code Playgroud)
要么:
int get_number(){
int a = 5;
return a++;
}
int main(){
int b = get_number();
cout << "b is " << b << endl; // b is 5
}
Run Code Online (Sandbox Code Playgroud)
根据此表,后缀++
运算符的优先级高于=
运算符,因此输出应该是b is 6
.但输出是b is 5
.我们怎么解释这个?