- log_softmax在理论上等于先softmax再log,但在实际使用中,后者会导致inf和nan
- 举个例子
import torch
import torch.nn.functional as F
a=torch.tensor([0.01,999])
b=F.softmax(a,dim=0) # tensor([0., 1.])
torch.log(b) # tensor([-inf, 0.])
c=F.log_softmax(a,dim=0) # tensor([-998.9900, 0.0000])
torch.exp(c) # tensor([0., 1.])
- 原因:log_softmax的公式是 ln e x i e x 1 + . . . + e x n \ln \frac {e^{xi}} {e^{x1}+...+e^{xn}} ln