ideone (Python3)
@ゼロから作るDeep Learning
p68
3.5.2 ソフトマックス関数の実装上の注意
ソフトマックス関数の指数計算での注意が記載されている。
掲示されたコード(インタラクティブシェル実行)をscriptに変更してideoneで実行してみた。
(np.exp()を出力する処理も追加した)
import numpy as np
a = np.array([1010, 1000, 990])
res = np.exp(a)
print(res)
res = np.exp(a) / np.sum(np.exp(a))
print(res)
[ inf inf inf]
[ nan nan nan]
exp()の計算でoverflowのためinfになる。
どのくらいの値でoverflowになるのか?
以下を見つけた。
-
ロジスティック回帰+確率的勾配降下法
-
具体的には exp の中身が 700 を超えるあたりから Inf になってしまうので、ちょっと大きめの特徴量があるだけで結構簡単に発生する。
-
-
[c][数値計算]exp関数の (実装の) 限界を体感Add Star
-
おぉ,やはり709と710の間でオーバーフローしてしまった!
-
引数 number の値が 709.782712893 を超えると、オーバーフロー エラーが発生します。定数 e の値は約 2.718282 です。
709.782712893 という数値は何で決まっているのか?
なお、値に 709.782712893 以上の数値を指定した場合は、倍精度浮動小数点数型(Double)の範囲を超える為、オーバーフローエラーが発生します。
google検索で「log2(exp(709.782712893))」にて
1024
指数部は11ビットである。しかしながら、以下のため、[0, 2047]は[-1023, 1024]の範囲になる。
double型
...
指数部-1023 が指数の値となる.
指数部が1024を超過するという点でexp ( 709.782712893 超過)がオーバーフローになると理解した。