Est-il un moyen d'optimiser le calcul de Bernoulli Journal-Probabilités pour de nombreux multivariée des échantillons?

0

La question

J'ai actuellement deux Torche Tenseurs, p et xqui ont à la fois la forme de (batch_size, input_size).

Je voudrais calculer la loi de Bernoulli journal des probabilités pour les données fournies, et le retour d'un tenseur de taille (batch_size)

Voici un exemple de ce que je voudrais faire: J'ai la formule pour le journal des probabilités des variables Aléatoires de Bernoulli:

\sum_i^d x_{i} ln(p_i) + (1-x_i) ln (1-p_i)

Dire que j'ai pTenseur: [[0.6 0.4 0], [0.33 0.34 0.33]] Et dire que j'ai l' x tenseur pour les entrées binaires basées sur les probabilités:

[[1 1 0], [0 1 1]]

Et je veux calculer la log-vraisemblance pour chaque échantillon, ce qui aurait pour résultat:

[[ln(0.6)+ln(0.4)], [ln(0.67)+ln(0.34)+ln(0.33)]]

Serait-il possible de faire ce calcul sans l'utilisation des boucles for? Je sais que je pourrais utiliser torch.sum(axis=1) pour faire la dernière sommation entre les journaux, mais est-il possible de faire la loi de Bernoulli log-vraisemblance calcul sans l'utilisation des boucles for? ou de l'utilisation à plus 1 pour la boucle? Je suis en train de vectoriser cette opération autant que possible. J'aurais pu jurer que nous pourrions utiliser LaTeX pour les équations avant, a fait quelque chose de changer ou est-il un autre site?

log-likelihood math pytorch
2021-11-24 00:17:07
1

La meilleure réponse

1

Bien que pas une bonne pratique, vous pouvez utiliser directement la formule sur les tenseurs comme suit (fonctionne parce que ce sont des élément sage opérations):

import torch
p = torch.tensor([
    [0.6, 0.4, 0],
    [0.33, 0.34, 0.33]
])

x = torch.tensor([
    [1., 1, 0],
    [0, 1, 1]
])

eps = 1e-8
bll1 = (x * torch.log(p+eps) + (1-x) * torch.log(1-p+eps)).sum(axis=1)
print(bll1)
#tensor([-1.4271162748, -2.5879497528])

Notez que pour éviter d' log(0) erreur, j'ai introduit une très petite constante eps à l'intérieur.

Une meilleure façon de le faire est d'utiliser BCELoss à l'intérieur nn module pytorch.

import torch.nn as nn
bce = nn.BCELoss(reduction='none')
bll2 = -bce(p, x).sum(axis=1)
print(bll2)
#tensor([-1.4271162748, -2.5879497528])

Depuis pytorch calcule la BCE comme une perte, il ajoute une formule avec un signe négatif. L'attribut reduction='none' dit que je ne veux pas le calcul des pertes réduites (moyenne/résumé) dans le lot en aucune façon. C'est conseillé de l'utiliser puisque nous n'avons pas besoin d'manuellement prendre soin de stabilité numérique et de la gestion des erreurs (comme l'ajout de eps ci-dessus).

En effet, vous pouvez vérifier que les deux solutions en fait le retour le même tenseur (jusqu'à une tolérance):

torch.allclose(bll1, bll2)
# True

ou les tenseurs (sans sommation chaque ligne):

torch.allclose((x * torch.log(p+eps) + (1-x) * torch.log(1-p+eps)), -bce(p, x))
# True

N'hésitez pas à demander plus de précisions.

2021-11-25 03:42:35

Dans d'autres langues

Cette page est dans d'autres langues

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................