C'è un modo per ottimizzare il calcolo di Bernoulli Log-Verosimiglianze per molti multivariata dei campioni?

0

Domanda

Attualmente ho due Torcia Tensori, p e xche entrambi hanno la forma di (batch_size, input_size).

Vorrei calcolare il registro di Bernoulli verosimiglianze per i dati di ritorno e di un tensore di dimensioni (batch_size)

Ecco un esempio di ciò che vorrei fare: Ho la formula per il log verosimiglianze di Bernoulli variabili Casuali:

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

Dire che ho pTensore: [[0.6 0.4 0], [0.33 0.34 0.33]] E dire che ho il x tensore per gli ingressi binari base a tali probabilità:

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

E voglio calcolare la probabilità log per ogni campione, il che comporterebbe:

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

Sarebbe possibile fare questo calcolo, senza l'uso di loop? So che potrei usare torch.sum(axis=1) per fare il finale sommatoria tra i tronchi, ma è possibile fare Bernoulli log-verosimiglianza di calcolo senza l'uso di loop? o l'utilizzo al massimo di 1 ciclo for? Sto cercando di vectorize questa operazione, per quanto possibile. Avrei giurato potremmo usare LaTeX per le formule prima, è cambiato qualcosa o è un altro sito?

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

Migliore risposta

1

Anche se non è una buona pratica, è possibile utilizzare direttamente la formula della tensori come segue (funziona perché questi sono elemento saggio operazioni):

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

Nota che, per evitare log(0) errore, ho introdotto una piccola costante eps all'interno di esso.

Un modo migliore per farlo è quello di utilizzare BCELoss all'interno nn modulo 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])

Dal pytorch calcola la BCE come una perdita, si antepone la formula con un segno negativo. L'attributo reduction='none' dice che io non voglio che le perdite calcolate per essere ridotto (in media/riassunto) di tutto il lotto, in qualche modo. Questo è consigliabile usare dal momento che non abbiamo bisogno di manuale di prendersi cura di stabilita ' numerica e la gestione degli errori (ad esempio l'aggiunta di eps più sopra).

Si può infatti verificare che le due soluzioni in realtà restituire lo stesso tensore (fino a un livello di tolleranza):

torch.allclose(bll1, bll2)
# True

o i tensori (senza somma di ogni riga):

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

Non esitate a chiedere per ulteriori chiarimenti.

2021-11-25 03:42:35

In altre lingue

Questa pagina è in altre lingue

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