Existuje způsob, jak optimalizovat výpočet Bernoulliho Log-Pravděpodobností o mnoho více vzorků?

0

Otázka

V současné době mám dva Pochodeň Tenzory, p a x, které oba mají tvar (batch_size, input_size).

Já bych chtěl spočítat Bernoulliho log pravděpodobností pro dané dat, a vrátit tenzor velikosti (batch_size)

Zde je příklad toho, co bych chtěl udělat: Mám vzorec pro log pravděpodobností z Bernoulliho Náhodné proměnné:

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

Říct, že jsem pTenzor: [[0.6 0.4 0], [0.33 0.34 0.33]] A že mám x tenzor pro binární vstupy na základě těchto pravděpodobností:

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

A chci vypočítat logaritmus pravděpodobnosti pro každý vzorek, což by mělo za následek:

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

Bylo by možné udělat tento výpočet bez použití smyčky for? Vím, že jsem mohl použít torch.sum(axis=1) udělat závěrečné shrnutí mezi protokoly, ale je to možné udělat Bernoulliho log-pravděpodobnosti, výpočty bez použití smyčky for? nebo použít maximálně 1 pro smyčce? Snažím se vectorize tato operace, stejně jako je to možné. Přísahal bych, že bychom mohli použít LaTeX pro rovnice, než se něco změnit, nebo je to jiné webové stránky?

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

Nejlepší odpověď

1

I když není dobré praxe, můžete přímo použít vzorec na tenzory takto (funguje, protože tyto jsou prvkem moudrý operace):

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

Všimněte si, že, aby se zabránilo log(0) chyba, jsem si představil velmi malé konstantní eps uvnitř to.

Lepší způsob, jak to udělat, je použít BCELoss uvnitř nn modul 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])

Od pytorch vypočítá PŘ. n. l. jako ztráta, připojí svůj vzorec se záporným znaménkem. Atribut reduction='none' říká, že nechci vypočtené ztráty se sníží (v průměru/sečtou) celé šarže v žádném případě. Toto je vhodné použít, protože není třeba ručně postarat se o numerické stability a zpracování chyb (jako je například přidání eps výše uvedené.)

Můžete skutečně ověřit, že obě řešení skutečně vrátí stejný tenzor (do tolerance):

torch.allclose(bll1, bll2)
# True

nebo tenzory (bez součet každého řádku):

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

Neváhejte požádat o další vysvětlení.

2021-11-25 03:42:35

V jiných jazycích

Tato stránka je v jiných jazycích

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