Я реализовал потери, основанные на функции массовой вероятности отрицательного биномиального распределения.К сожалению, из-за того, что я сам вычисляю числовые выражения, я не могу проверить результаты, которые дает мне метод обратной последовательности.
Я попытался проверить реализацию 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))
Полученные отпечатки обоих методов должны быть одинаковыми, но я получаю очень разные результаты.Есть догадки, что не так?Заранее спасибо