Мне нужно вычислить log(1 + exp(x))
, а затем использовать автоматическое дифференцирование на нем.Но для слишком большого x
он выводит inf
из-за возведения в степень:
>>> x = torch.tensor([0., 1., 100.], requires_grad=True)
>>> x.exp().log1p()
tensor([0.6931, 1.3133, inf], grad_fn=<Log1PBackward>)
Поскольку log(1 + exp(x)) ≈ x
для большого x
, я думал, что смогу заменить infs
на x
используя torch.where
.Но при этом я все равно получаю nan
за градиент слишком больших значений.Знаете ли вы, почему это происходит и есть ли другой способ заставить это работать?
>>> exp = x.exp()
>>> y = x.where(torch.isinf(exp), exp.log1p()) # Replace infs with x
>>> y # No infs
tensor([ 0.6931, 1.3133, 100.0000], grad_fn=<SWhereBackward>)
>>> y.sum().backward() # Automatic differentiation
>>> x.grad # Why is there a nan and how can I get rid of it?
tensor([0.5000, 0.7311, nan])