web-dev-qa-db-fra.com

KL Divergence pour deux distributions de probabilité dans PyTorch

J'ai deux distributions de probabilité. Comment dois-je trouver la divergence KL entre eux dans PyTorch? L'entropie croisée régulière n'accepte que les étiquettes entières.

8
Mojtaba Komeili

Oui, PyTorch a une méthode nommée kl_div sous torch.nn.functional pour calculer directement la convergence KL entre les tenseurs. Supposons que vous ayez le tenseur a et b de même forme. Vous pouvez utiliser le code suivant:

import torch.nn.functional as F
out = F.kl_div(a, b)

Pour plus de détails, consultez la documentation de la méthode ci-dessus.

12
jdhao

une fonction kl_div n'est pas la même chose que l'explication de wiki .

J'utilise ce qui suit:

# this is the same example in wiki
P = torch.Tensor([0.36, 0.48, 0.16])
Q = torch.Tensor([0.333, 0.333, 0.333])

(P * (P / Q).log()).sum()
# tensor(0.0863), 10.2 µs ± 508

F.kl_div(Q.log(), P, None, None, 'sum')
# tensor(0.0863), 14.1 µs ± 408 ns

comparer aux kl_div, même plus vite

3
hantian_pang

Si vous avez deux distributions de probabilité sous forme de objet pytorch distribution . Il vaut mieux alors utiliser la fonction torch.distributions.kl.kl_divergence(p, q). Pour la documentation, suivez le lien

2
Gaurav Shrivastava