pytorch utilise la v1.5.1. Avec la sortie de Linear as (x, y, vxx, vyy, vxy), créez une matrice distribuée co-distribuée et passez-la à MultivariateNormal.
fc = nn.Linear(n, 5)
output = fc(x)
mean = output[:2]
vxx, vyy = nn.Softplus()(output[2:4])
vxy = output[-1]
covariance_matrix = torch.zeros(2, 2)
covariance_matrix[0, 0] += vxx
covariance_matrix[0, 1] += vxy
covariance_matrix[1, 0] += vxy
covariance_matrix[1, 1] += vyy
dist = MultivariateNormal(mean, covariance_matrix)
RuntimeError: cholesky_cuda: For batch 0: U(6,6) is zero, singular U. Puisque MultivariateNormal décompose la matrice distribuée co-distribuée par choleskey, il est nécessaire de donner une matrice de valeur constante positive. Dans l'état actuel des choses, l'erreur ci-dessus se produit car il n'est pas garanti que covariance_matrix soit une matrice de valeurs positives.
fc = nn.Linear(n, 5)
output = fc(x)
mean = output[:2]
a, c = nn.Softplus()(output[2:4])
b = output[-1]
L = torch.zeros(2, 2)
L[0, 0] += a
L[1, 0] += b
L[1, 1] += c
dist = MultivariateNormal(mean, scale_tril=L)
scale_tril (Tensor) – lower-triangular factor of covariance, with positive-valued diagonal
Par conséquent, les composantes diagonales $ a et c $ sont mises à des valeurs positives par softplus.
Décomposition de Cholesky lors de la création d'une matrice distribuée co-distribuée
\Sigma = LL^{T}
selon,
covariance_matrix = np.dot(L, L.T)
Et c'est suffisant.
Recommended Posts