> 文章列表 > 使用log_softmax而不是softmax

使用log_softmax而不是softmax

使用log_softmax而不是softmax

  • 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)       # 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⁡exiex1+...+exn\\ln \\frac {e^{xi}} {e^{x1}+...+e^{xn}}lnex1+...+exnexi
  • 计算时会先令分子和分母除以eMe^MeM,M是xi的最大值,即ln⁡exi−Mex1−M+...+exn−M\\ln \\frac {e^{xi-M}} {e^{x1-M}+...+e^{xn-M}}lnex1M+...+exnMexiM
  • 再根据对数运算法则,变成xi−M−ln⁡(ex1−M+...+exn−M)xi-M-\\ln(e^{x1-M}+...+e^{xn-M})xiMln(ex1M+...+exnM)
  • 其中ex1−M+...+exn−Me^{x1-M}+...+e^{xn-M}ex1M+...+exnM是肯定不小于1的,保证了计算的可行性。