Există o modalitate de a optimiza calculul Bernoulli Log-Likelihoods pentru multe multivariată probe?

0

Problema

În prezent am două Lanterna Tensori, p și x, care ambele au forma de (batch_size, input_size).

Aș dori să calculeze Bernoulli log likelihoods pentru date, și să se întoarcă un tensor de dimensiune (batch_size)

Aici este un exemplu de ceea ce aș vrea să fac: Am formula de jurnal likelihoods de variabile Aleatoare Bernoulli:

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

Spun ca am pTensor: [[0.6 0.4 0], [0.33 0.34 0.33]] Și spun că am x tensor pentru intrări binare bazate pe aceste probabilități:

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

Și vreau să se calculeze log likelihood pentru fiecare probă, care ar duce la:

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

Ar fi posibil să fac acest calcul, fără utilizarea de bucle? Stiu ca as putea folosi torch.sum(axis=1) pentru a face raportul final între busteni, dar este posibil să se facă Bernoulli log-probabilitatea de calcul, fără utilizarea de bucle? sau de a folosi cel mult 1 buclă? Am încercat să vectorize această operație cât mai mult posibil. Puteam să jur că am putea folosi LaTeX pentru ecuații înainte, s-a schimbat ceva sau este un alt site?

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

Cel mai bun răspuns

1

Deși nu este o practică bună, puteți folosi direct formula pe tensori după cum urmează (funcționează pentru că acestea sunt element înțelept operațiuni):

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])

Rețineți că, pentru a evita log(0) eroare, am introdus un foarte mic constantă eps în interiorul acestuia.

O modalitate mai bună de a face acest lucru este de a utiliza BCELoss în interiorul nn modul în 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])

Deoarece pytorch calculează BCE ca o pierdere, se adauga inaintea ta formula cu un semn negativ. Atributul reduction='none' spune că nu vreau calculat pierderile să fie reduse (în medie/rezumat), peste lot în nici un fel. Acest lucru este recomandabil de a utiliza, deoarece noi nu avem nevoie de manual pentru a avea grijă de stabilitatea numerică și eroare de manipulare (cum ar fi adăugarea de eps de mai sus.)

Într-adevăr puteți verifica dacă cele două soluții de întoarcere, de fapt, același tensor (pana la o toleranță):

torch.allclose(bll1, bll2)
# True

sau tensori (fără însumarea fiecare rând):

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

Simțiți-vă liber pentru a cere clarificări suplimentare.

2021-11-25 03:42:35

În alte limbi

Această pagină este în alte limbi

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