Es allí una manera de optimizar el cálculo de Bernoulli Registro de las Probabilidades para muchos multivariante de las muestras?

0

Pregunta

Actualmente tengo dos Antorcha Tensores, p y xque ambos tienen la forma de (batch_size, input_size).

Quiero calcular el Bernoulli registro de las probabilidades para los datos dados, y devolver un tensor de tamaño (batch_size)

He aquí un ejemplo de lo que me gustaría hacer: Tengo la fórmula para el registro de las probabilidades de variables Aleatorias de Bernoulli:

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

Decir que tengo pTensor: [[0.6 0.4 0], [0.33 0.34 0.33]] Y decir que tengo el x tensor para las entradas binarias basadas en esas probabilidades:

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

Y quiero calcular el registro de probabilidad para cada una de las muestras, lo que daría como resultado:

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

Sería posible hacer este cálculo sin el uso de bucles? Sé que podría utilizar torch.sum(axis=1) para hacer la presentación final entre los troncos, pero es posible hacer el registro de Bernoulli-probabilidad de cálculo sin el uso de bucles? o el uso en la mayoría de los 1 bucle for? Estoy tratando de vectorización esta operación tanto como sea posible. Yo podría haber jurado que podrían utilizar LaTeX para las ecuaciones antes, hizo que algo cambie o es otro sitio web?

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

Mejor respuesta

1

A pesar de que no es una buena práctica, se puede utilizar directamente la fórmula de la tensores de la siguiente manera (funciona porque estos son elemento sabio operaciones):

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

Tenga en cuenta que para evitar log(0) error, he introducido una pequeña constante eps en el interior de la misma.

Una mejor manera de hacer esto es utilizar BCELoss dentro de nn módulo en 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 la AEC, como una pérdida, que antepone su fórmula con un signo negativo. El atributo reduction='none' dice que no quiero que las pérdidas calculadas a reducirse (promedio/suma) de todo el lote de alguna manera. Esto es aconsejable de usar, ya que no necesitamos manualmente cuidar numérico de la estabilidad y el manejo de errores (tales como la adición de eps que la anterior).

De hecho, puede comprobar que las dos soluciones de la realidad devolver el mismo tensor (hasta una tolerancia):

torch.allclose(bll1, bll2)
# True

o los tensores (sin que la suma de cada fila):

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

Siéntase libre de pedir aclaraciones.

2021-11-25 03:42:35

En otros idiomas

Esta página está en otros idiomas

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