Existuje spôsob, ako optimalizovať výpočet Bernoulli Log-Likelihoods pre mnohých viacrozmerných vzorky?

0

Otázka

I v súčasnosti majú dve Baterky Ansi, p a x, ktoré obe majú tvar (batch_size, input_size).

Ja by som chcel vypočítať Bernoulli denník likelihoods pre dané dáta, a vrátenie tensor veľkosť (batch_size)

Tu je príklad, čo by som chcel robiť: Mám vzorec pre denník likelihoods z Bernoulli Náhodné premenné:

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

Povedať, že som pTensor: [[0.6 0.4 0], [0.33 0.34 0.33]] A povedať, že mám x tensor pre binárne vstupy na základe týchto pravdepodobností:

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

A chcem vypočítať log likelihood pre každú vzorku, ktorá by mala za následok:

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

Bolo by možné urobiť výpočet bez použitia pre slučky? Viem, že by som mohol použiť torch.sum(axis=1) robiť konečného súčtu medzi denníky, ale je to možné urobiť Bernoulli log-likelihood výpočtu bez použitia pre slučky? alebo použitie na väčšine 1 pre slučky? Snažím sa vectorize tejto operácii, rovnako ako je to možné. Ja by som prisahal by sme mohli používať Latexové pre rovníc pred, niečo zmeniť, alebo je to ďalší stránky?

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

Najlepšiu odpoveď

1

Aj keď nie je dobrou praxou, môžete priamo použiť vzorec na ansi takto (funguje, pretože tieto sú prvkom múdry činnosti):

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

Upozorňujeme, že aby sa zabránilo log(0) chyba, som zaviedli veľmi malé konštantný eps vo vnútri.

Lepší spôsob, ako to urobiť, je použiť BCELoss vnútri 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číta ECB ako strata, sa umiestni pred zavináč svoj vzorec so záporným znamienkom. Atribút reduction='none' hovorí sa, že nechcem vypočítaná straty byť znížená (priemer/zhrnul) v celej dávky, v žiadnom prípade. Je to vhodné použiť, pretože sme nie je potrebné manuálne starať numerickej stability a spracovanie chýb (napríklad pridanie eps vyššie uvedené.)

Môžete skutočne overiť, že dve riešenia skutočne vrátiť istej tensor (až toleranciou):

torch.allclose(bll1, bll2)
# True

alebo ansi (bez sčítanie každý riadok):

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

Neváhajte a opýtajte sa na ďalšie vysvetlenia.

2021-11-25 03:42:35

V iných jazykoch

Táto stránka je v iných jazykoch

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