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