创建协方差矩阵的方式不是后验概率:
def make_covariance_matrix(sigma, rho):
return torch.tensor([[sigma[0]**2, rho * torch.prod(sigma)],
[rho * torch.prod(sigma), sigma[1]**2]])
从(多个)张量创建新张量时,仅保留输入张量的值。来自输入张量的所有附加信息都被剥离,因此所有图连接您的参数从此时开始被切断,因此反向传播无法通过。
这是一个简短的例子来说明这一点:
import torch
param1 = torch.rand(1, requires_grad=True)
param2 = torch.rand(1, requires_grad=True)
tensor_from_params = torch.tensor([param1, param2])
print('Original parameter 1:')
print(param1, param1.requires_grad)
print('Original parameter 2:')
print(param2, param2.requires_grad)
print('New tensor form params:')
print(tensor_from_params, tensor_from_params.requires_grad)
Output:
Original parameter 1:
tensor([ 0.8913]) True
Original parameter 2:
tensor([ 0.4785]) True
New tensor form params:
tensor([ 0.8913, 0.4785]) False
正如您所看到的,根据参数创建的张量param1
and param2
,不跟踪梯度param1
and param2
.
因此,您可以使用此代码来保留图形连接 and is 后验概率:
def make_covariance_matrix(sigma, rho):
conv = torch.cat([(sigma[0]**2).view(-1), rho * torch.prod(sigma), rho * torch.prod(sigma), (sigma[1]**2).view(-1)])
return conv.view(2, 2)
使用以下方法将这些值连接到一个平面张量torch.cat
。然后使用将它们调整为正确的形状view()
.
这会产生与函数中相同的矩阵输出,但它保持与参数的连接log_sigma
and atanh_rho
.
这是更改后的步骤之前和之后的输出make_covariance_matrix
。如您所见,现在您可以优化参数,并且值确实会发生变化:
Before:
mu: tensor([ 0.1191, 0.7215]), mu_hat: tensor([ 0., 0.])
sigma: tensor([ 1.4222, 1.0949]), sigma_hat: tensor([ 1., 1.])
rho: tensor([ 0.2558]), rho_hat: tensor([ 0.])
After:
mu: tensor([ 0.1191, 0.7215]), mu_hat: tensor([ 0.0712, 0.7781])
sigma: tensor([ 1.4222, 1.0949]), sigma_hat: tensor([ 1.4410, 1.0807])
rho: tensor([ 0.2558]), rho_hat: tensor([ 0.2235])
希望这可以帮助!