- log_softmax在理论上等于先softmax再log,但在实际使用中,后者会导致inf和nan
- 举个例子
import torch
import torch.nn.functional as Fa=torch.tensor([0.01,999])
b=F.softmax(a,dim=0)
torch.log(b)
c=F.log_softmax(a,dim=0)
torch.exp(c)
- 原因:log_softmax的公式是lnexiex1+...+exn\\ln \\frac {e^{xi}} {e^{x1}+...+e^{xn}}lnex1+...+exnexi
- 计算时会先令分子和分母除以eMe^MeM,M是xi的最大值,即lnexi−Mex1−M+...+exn−M\\ln \\frac {e^{xi-M}} {e^{x1-M}+...+e^{xn-M}}lnex1−M+...+exn−Mexi−M
- 再根据对数运算法则,变成xi−M−ln(ex1−M+...+exn−M)xi-M-\\ln(e^{x1-M}+...+e^{xn-M})xi−M−ln(ex1−M+...+exn−M)
- 其中ex1−M+...+exn−Me^{x1-M}+...+e^{xn-M}ex1−M+...+exn−M是肯定不小于1的,保证了计算的可行性。