Czy istnieje sposób, aby zoptymalizować obliczenia logarytmiczne prawdopodobieństwa Bernoulliego dla wielu wielowymiarowych próbek?

0

Pytanie

Obecnie mam dwa tensora pochodni, p i x, które obie mają kształt (batch_size, input_size).

Chciałbym obliczyć prawdopodobieństwo logarytmu Bernoulliego dla zadanych danych i przywrócić niezmiennymi tensora mapie (batch_size)

Oto przykład tego, co chciałbym zrobić: U mnie jest to wzór dla logarytmicznych prawdopodobieństwa losowych Bernoulliego:

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

Powiedz, co mam pNiezmiennymi tensora: [[0.6 0.4 0], [0.33 0.34 0.33]] I powiedz mi, co mam x niezmiennymi tensora dla binarnych danych wejściowych, bazując na tych możliwości:

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

I chcę obliczyć logarytmicznej prawdopodobieństwo dla każdej próbki, co może prowadzić do:

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

Czy można byłoby wykonać to obliczenie bez użycia pętli for? Wiem, że mógłbym użyć torch.sum(axis=1) aby wykonać ostateczne podsumowanie między rejestrami, ale czy to możliwe wykonać obliczenie logarytmicznej prawdopodobieństwa Bernoulli bez użycia pętli for? lub użyj nie więcej niż 1 dla cyklu? Staram się maksymalnie векторизовать tę operację. Mógłbym przysiąc, że możemy korzystać z lateksu dla równań wcześniej, że coś się zmieniło, czy to w inną stronę?

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

Najlepsza odpowiedź

1

Chociaż nie jest to bardzo dobra praktyka, można bezpośrednio użyć formuły dla тензоров w następujący sposób (działa, bo to operacje z elementami).:

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

Należy pamiętać, że w celu uniknięcia log(0) błąd, wpisałem bardzo małą stałą eps wewnątrz niego.

Najlepszym sposobem, aby to zrobić, jest użycie BCELoss wewnątrz nn moduł w 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])

Z pytorch oblicza się, że WSZYSTKO jest jak strata, dodaje do swojej formule znak ujemny. Atrybut reduction='none' mówi, że ja w żaden sposób nie chcę, aby obliczone straty zostały zmniejszone (średnie/streszczają) w całej partii. Jest to zalecane, ponieważ nie musimy ręcznie dbać o numeryczna stabilność i obsługi błędów (na przykład dodawać eps powyżej.)

Naprawdę można się upewnić, że dwa rozwiązania naprawdę zwracają ten sam niezmiennymi tensora (z dokładnością do tolerancji):

torch.allclose(bll1, bll2)
# True

lub тензоры (bez sumowania każdego wiersza):

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

Nie wahaj się z nami za dalszymi wyjaśnieniami.

2021-11-25 03:42:35

W innych językach

Ta strona jest w innych językach

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