LoginSignup
0

More than 5 years have passed since last update.

numpy > np.exp(1010) : overflow encountered in exp > exp( 709.782712893 超過 )

Last updated at Posted at 2017-08-19
動作環境
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)
run
[ inf  inf  inf]
[ nan  nan  nan]

exp()の計算でoverflowのためinfになる。

どのくらいの値でoverflowになるのか?
以下を見つけた。

引数 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 超過)がオーバーフローになると理解した。

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0