Birçok çok değişkenli örnek için Bernoulli Log Olasılıklarının hesaplanmasını optimize etmenin bir yolu var mı?

0

Soru

Şu anda iki Meşale Tensörüm var, p ve x her ikisi de şu şekildedir (batch_size, input_size).

Verilen veriler için Bernoulli log olasılıklarını hesaplamak ve bir boyut tensörü döndürmek istiyorum (batch_size)

İşte ne yapmak istediğime bir örnek: Bernoulli Rasgele değişkenlerinin log olasılıkları için formülüm var:

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

Sahip olduğumu söyle p Tensör: [[0.6 0.4 0], [0.33 0.34 0.33]] Ve sahip olduğumu söyle x bu olasılıklara dayalı ikili girdiler için tensör:

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

Ve her örnek için günlük olasılığını hesaplamak istiyorum, bu da sonuçlanacak:

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

Bu hesaplamayı for döngüleri kullanmadan yapmak mümkün olabilir mi? Kullanabileceğimi biliyorum torch.sum(axis=1) günlükler arasındaki son toplamı yapmak için, ancak for döngüleri kullanılmadan Bernoulli log-olabilirlik hesaplamasını yapmak mümkün mü? veya döngü için en fazla 1 kullanın? Bu işlemi mümkün olduğunca vektörize etmeye çalışıyorum. Daha önce denklemler için Latex'i kullanabileceğimize yemin edebilirdim, bir şey değişti mi yoksa başka bir web sitesi mi?

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

En iyi cevabı

1

İyi bir uygulama olmasa da, formülü doğrudan tensörler üzerinde aşağıdaki gibi kullanabilirsiniz (bunlar eleman bilge işlemler olduğu için çalışır):

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

Bunu önlemek için unutmayın log(0) hata, çok küçük bir sabit tanıttım eps içinde.

Bunu yapmanın daha iyi bir yolu içeride BCELoss kullanmaktır nn modül içinde 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])

Dan beri pytorch Bce'yi bir kayıp olarak hesaplar, formülünüzü negatif bir işaretle hazırlar. Öznitelik reduction='none' hesaplanan kayıpların parti genelinde herhangi bir şekilde azaltılmasını (ortalama/toplam) istemediğimi söylüyor. Sayısal kararlılığa ve hata işlemeye (ekleme gibi) manuel olarak dikkat etmemize gerek olmadığı için bunu kullanmanız önerilir eps yukarıda.)

Gerçekten de, iki çözümün aslında aynı tensörü döndürdüğünü doğrulayabilirsiniz (bir toleransa kadar):

torch.allclose(bll1, bll2)
# True

veya tensörler (her satırı toplamadan):

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

Daha fazla açıklama istemekten çekinmeyin.

2021-11-25 03:42:35

Diğer dillerde

Bu sayfa diğer dillerde

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