指数和的对数
形如
log
∑
n
=
1
N
e
x
n
\log\sum_{n=1}^Ne^{x_n}
log∑n=1Nexn的指数和的对数,这是非常常见的需求,比如要计算softmax的对数似然。如果
x
n
x_n
xn比较大或者比较小,指数就会接近0或者很大,由于浮点数只有64位,即便x的取值为[1000,1000,1000]左右,取了对数之后的值就会上溢或者下溢。
解决办法就是:取
a
=
max
n
x
n
a=\max\limits_{n}x_n
a=nmaxxn,这样
x
n
−
a
x_n-a
xn−a,这样指数最大不会超过0。原式=
a
+
log
∑
n
=
1
N
e
x
n
−
a
a + \log\sum_{n=1}^Ne^{x_n-a}
a+log∑n=1Nexn−a,不会发生上溢,即便发生下溢,你也能得到一个合理的值。