Отличный ответ - большое спасибо!
ясь узнать, как работает pytorch, я пытаюсь выполнить оценку максимального правдоподобия некоторых параметров в многомерном нормальном распределении. Однако, похоже, он не работает ни для одного из параметров, связанных с ковариацией.
Итак, мой вопрос: почему этот код не работает?
import torch
def make_covariance_matrix(sigma, rho):
return torch.tensor([[sigma[0]**2, rho * torch.prod(sigma)],
[rho * torch.prod(sigma), sigma[1]**2]])
mu_true = torch.randn(2)
rho_true = torch.rand(1)
sigma_true = torch.exp(torch.rand(2))
cov_true = make_covariance_matrix(sigma_true, rho_true)
dist_true = torch.distributions.MultivariateNormal(mu_true, cov_true)
samples = dist_true.sample((1_000,))
mu = torch.zeros(2, requires_grad=True)
log_sigma = torch.zeros(2, requires_grad=True)
atanh_rho = torch.zeros(1, requires_grad=True)
lbfgs = torch.optim.LBFGS([mu, log_sigma, atanh_rho])
def closure():
lbfgs.zero_grad()
sigma = torch.exp(log_sigma)
rho = torch.tanh(atanh_rho)
cov = make_covariance_matrix(sigma, rho)
dist = torch.distributions.MultivariateNormal(mu, cov)
loss = -torch.mean(dist.log_prob(samples))
loss.backward()
return loss
lbfgs.step(closure)
print("mu: {}, mu_hat: {}".format(mu_true, mu))
print("sigma: {}, sigma_hat: {}".format(sigma_true, torch.exp(log_sigma)))
print("rho: {}, rho_hat: {}".format(rho_true, torch.tanh(atanh_rho)))
выход:
mu: tensor([0.4168, 0.1580]), mu_hat: tensor([0.4127, 0.1454], requires_grad=True)
sigma: tensor([1.1917, 1.7290]), sigma_hat: tensor([1., 1.], grad_fn=<ExpBackward>)
rho: tensor([0.3589]), rho_hat: tensor([0.], grad_fn=<TanhBackward>)
>>> torch.__version__
'1.0.0.dev20181127'
Другими словами, почему есть оценкиlog_sigma
а такжеatanh_rho
не перешел от их первоначального значения?