Распределение обратной градационной инспекции не соответствует числовому воспроизведению? - PullRequest
0 голосов
/ 14 мая 2019

Я реализовал потери, основанные на функции массовой вероятности отрицательного биномиального распределения.К сожалению, из-за того, что я сам вычисляю числовые выражения, я не могу проверить результаты, которые дает мне метод обратной последовательности.

Я попытался проверить реализацию Pytorch, воспроизведя градиент по отношению к нему.параметры распространения, используя выражения, найденные в цитируемых источниках.Полученные значения не совпадают.Я не уверен, что виновата моя реализация функции потерь, поскольку я считаю, что численное воспроизведение является правильным.

ИСТОЧНИКИ:

источник 1 - (Отрицательное биномиальное распределение PMF иградиент вероятности)

источник 2 - (отрицательное биномиальное распределение PMF и градиент вероятности)

Ниже приведен фрагмент кода с тестом и отпечатками:

import torch
from scipy.special import digamma
import numpy as np

output_soft = torch.tensor([[10], [0.25]], requires_grad=True)

def loss(input, target):
    total_count = input[0]
    probability = input[1]
    target_p_tc_gamma = torch.tensor([target + total_count], dtype=torch.float, requires_grad=True).lgamma()
    r_gamma = total_count.lgamma()
    target_factorial = torch.tensor([target + 1],dtype=torch.float).lgamma()
    combinatorial_term = torch.tensor([target_p_tc_gamma - r_gamma - target_factorial],
                                      dtype=torch.float,
                                      requires_grad=True).exp()
    prob_term = probability.pow(total_count)
    comp_prob_term = torch.tensor([1 - probability], dtype=torch.float, requires_grad=True).pow(target)
    likelihood_target = combinatorial_term * prob_term * comp_prob_term
    return -likelihood_target.log()


target = torch.tensor([15.])
loss = loss(output_soft, target)
loss.backward()
print("Backward gradient inspection", output_soft.grad.detach().numpy())

def neg_PMF_gradient_check(input, target):
    target = target.detach().numpy()
    total_count = input[0].detach().numpy()
    probability = input[1].detach().numpy()
    dg = digamma
    comp_prob = 1-probability
    grad_tc = dg(target + total_count) - dg(total_count) + np.log(total_count / (total_count + target))
    grad_prob=target / probability - total_count / comp_prob
    return [-grad_tc[0], -grad_prob[0]]

print("Numerical reproduction", neg_PMF_gradient_check(output_soft, target))

Полученные отпечатки обоих методов должны быть одинаковыми, но я получаю очень разные результаты.Есть догадки, что не так?Заранее спасибо

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