Функция логарифмического правдоподобия в NumPy - PullRequest
0 голосов
/ 24 апреля 2019

Я следовал этому учебнику , и меня смутила часть, где автор определяет потерянную функцию отрицательного логарифмического вероятности.

def nll(input, target):
    return -input[range(target.shape[0]), target].mean()

loss_func = nll

Здесь target.shape[0] равно 64 иtarget - это вектор длиной 64

tensor([5, 0, 4, 1, 9, 2, 1, 3, 1, 4, 3, 5, 3, 6, 1, 7, 2, 8, 6, 9, 4, 0, 9, 1, 1, 2, 4, 3, 2, 7, 3, 8, 6, 9, 0, 5, 6, 0, 7, 6, 1, 8, 7, 9, 3, 9, 8, 5, 9, 3, 3, 0, 7, 4, 9, 8, 0, 9, 4, 1, 4, 4, 6, 0]).

Каким образом эта пустая индексация приводит к функции потерь?Кроме того, каким должен быть вывод массива numpy, если в квадратной скобке есть range () и другой массив?

1 Ответ

1 голос
/ 24 апреля 2019

В этом уроке input и target равны torch.tensor.

Отрицательная логарифмическая потеря вероятности вычисляется следующим образом:

nll = -(1/B) * sum(logPi_(target_class)) # for all sample_i in the batch.

Где:

  • B: размер партии
  • C: Количество классов
  • Pi: формы [num_classes,] вектор вероятности предсказания для выборки i.Он получается по значению softmax logit вектора для образца i.
  • logPi: логарифм Pi, мы можем просто получить его по F.log_softmax(logit_i).

Давайте разберем его для простого примера: ожидается

  • input как значения log_softmax формы [B, C].
  • target ожидаетсяв качестве основных классов истинности, имеющих форму [B, ].

Для уменьшения помех, давайте возьмем B = 4 и C = 3.

import torch 

B, C = 4, 3

input = torch.randn(B, C)
"""
>>> input
tensor([[-0.5043,  0.9023, -0.4046],
        [-0.4370, -0.8637,  0.1674],
        [-0.5451, -0.5573,  0.0531],
        [-0.6751, -1.0447, -1.6793]])
"""

target = torch.randint(low=0, high=C, size=(B, ))
"""
>>> target
tensor([0, 2, 2, 1])
"""

# The unrolled version
nll = 0
nll += input[0][target[0]] # add -0.5043
nll += input[1][target[1]] # add -0.1674
nll += input[2][target[2]] # add  0.0531
nll += input[3][target[3]] # add -1.0447
nll *= (-1/B)
print(nll)
# tensor(0.3321)


# The compact way using numpy indexing
_nll = -input[range(0, B), target].mean()
print(_nll)
# tensor(0.3321)

Два способа вычисления похожи.Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...