Existe uma maneira de otimizar o cálculo de Bernoulli Log-Probabilidade para muitos multivariada amostras?

0

Pergunta

Atualmente tenho dois Tocha Tensores, p e x, que têm a forma de (batch_size, input_size).

Eu gostaria de calcular o Bernoulli registo de probabilidade para os dados e retornar um tensor de tamanho (batch_size)

Aqui está um exemplo do que eu gostaria de fazer: Eu tenho a fórmula para o registo de probabilidade de Bernoulli variáveis Aleatórias:

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

Dizem que eu tenho pTensor: [[0.6 0.4 0], [0.33 0.34 0.33]] E dizer que eu o x tensor para as entradas binárias com base nessas probabilidades:

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

E eu quero calcular o log de probabilidade para cada amostra, o que resultaria em:

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

Seria possível fazer este cálculo, sem o uso de loops? Eu sei que eu poderia usar torch.sum(axis=1) para fazer o final de soma entre os registros, mas é possível fazer Bernoulli log-probabilidade de computação sem o uso de loops? ou use no máximo 1 para o loop? Eu estou tentando para vectorize esta operação, tanto quanto possível. Eu poderia ter jurado que nós poderíamos usar o LaTeX para equações antes, fiz algo mudar ou é de outro site?

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

Melhor resposta

1

Apesar de não ser uma boa prática, você pode usar diretamente a fórmula sobre os tensores da seguinte forma (funciona porque estas são elemento sábio operações):

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

Observe que, para evitar log(0) erro, eu ter introduzido um pequeno constante eps dentro de ti.

A melhor maneira de fazer isso é usar BCELoss dentro nn módulo 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])

Desde pytorch calcula a AC como uma perda, ele acrescenta a sua fórmula com um sinal negativo. O atributo reduction='none' diz que eu não quero que o calculado perdas de ser reduzida (média/somados) em todo o lote de forma alguma. Esta é aconselhável usar desde que não precisamos manualmente cuidar de estabilidade numérica e de tratamento de erro (como a adição de eps acima.)

Na verdade, você pode verificar que as duas soluções, na verdade, retornam o mesmo tensor (até uma tolerância):

torch.allclose(bll1, bll2)
# True

ou os tensores (sem soma de cada linha):

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

Sinta-se livre para pedir mais esclarecimentos.

2021-11-25 03:42:35

Em outros idiomas

Esta página está em outros idiomas

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