在审核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=ex1−max(x)+ex2−max(x)+...+exk−max(x)+...+exn−max(x)exk−max(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′=xk−max(x) 中最大值为0,故而避免了上溢出
而发生下溢出时, x k ′ = x k − m a x ( x ) x_k' = x_k-max(\bm x) xk′=xk−max(x) 中最大值为0,分母中 e x k − m a x ( x ) e^{x_k-max(\bm x)} exk−max(x)至少有一个为1,避免了除0错,故而避免了下溢出