Softmax 的上下溢出问题解决方案

在审核RD写的线性分类解读时,看到了这么一条:

在 Softmax 函数的计算过程中,还需要注意上溢出和下溢出的问题

之前遇到过,但都是调包来解决的,今儿看到了之后,整理如下:

给定一个张量:
x = [ x 1 , x 2 , . . . . , x n ] T \bm{x} = [x_1, x_2, ...., x_n] ^ T x=[x1,x2,....,xn]T
经过 s o f t m a x softmax softmax函数为:
x ~ = [ x ~ 1 , x ~ 2 , . . . . , x ~ n ] T \bm{\tilde{x}} = [\tilde{x}_1, \tilde{x}_2, ...., \tilde{x}_n] ^ T x~=[x~1,x~2,....,x~n]T
其中:
x ~ k = e x k e x 1 + e x 2 + . . . + e x k + . . . + e x n \tilde{x}_k = \frac {e^{x_k}} {e^{x_1}+e^{x_2}+...+e^{x_k}+...+e^{x_n}} x~k=ex1+ex2+...+exk+...+exnexk

看到指数出现在分子或者分母上就害怕

  • 函数 y = e x y=e^x y=ex x x x取超级大的正数,float32就溢出了,这个叫上溢出
  • 如果 x x x取超级小的负数, y y y就是 0.000000000 0.000000000 0.000000000几,超过有效数字后, y y y就是0了,而如果分母都是0,就出现了除0错,这个叫下溢出

这咋办??

显然,这两种情况同时出现时,只需要考虑上溢出的情况就行

先给结论吧,分子上下,同时除以 m a x ( x ) {\color{red} max(\bm x)} max(x)
x ~ k = e x k − m a x ( x ) e x 1 − m a x ( x ) + e x 2 − m a x ( x ) + . . . + e x k − m a x ( x ) + . . . + e x n − m a x ( x ) \tilde{x}_k = \frac {e^{x_k-max(\bm x)}} {e^{x_1-max(\bm x)}+e^{x_2-max(\bm x)}+...+e^{x_k-max(\bm x)}+...+e^{x_n-max(\bm x)}} x~k=ex1max(x)+ex2max(x)+...+exkmax(x)+...+exnmax(x)exkmax(x)

m a x ( x ) max(\bm x) max(x) 是取张量 x \bm x x中的最大值


接下来简单说明下,当发生上溢出时, x k ′ = x k − m a x ( x ) x_k' = x_k-max(\bm x) xk=xkmax(x) 中最大值为0,故而避免了上溢出

而发生下溢出时, x k ′ = x k − m a x ( x ) x_k' = x_k-max(\bm x) xk=xkmax(x) 中最大值为0,分母中 e x k − m a x ( x ) e^{x_k-max(\bm x)} exkmax(x)至少有一个为1,避免了除0错,故而避免了下溢出

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值