シグモイド関数のオーバーフローに対策する

シグモイド関数のオーバーフロー(コンピュータが表現できる数値の桁を超えたこと)という現象が起きます。

本稿では,シグモイド関数のオーバーフローの対策を記述します.

# シグモイド関数のオーバーフロー

シグモイド関数のコードでは、xに負の数で大きい値が入るとオーバーフロー(コンピュータが表現できる数値の桁を超えたこと)という現象が起きます。

y=11+ex y=\dfrac {1}{1+e^{-x}}

例えば,上記の式に,x=-800を代入すると,2.718の800乗というとても大きい数値の算出が発生することになります.

y=11+e(800)=11+(2.718)(800) y=\dfrac {1}{1+e^{-(-800)}}=\dfrac {1}{1+(2.718)^{-(-800)}}

そして,pythonで実行すると下記の通りになります.

import numpy as np

def sigmoid(x):
    return 1 / (1 + np.exp(-x))

print(sigmoid(1))
print(sigmoid(-1))
print(sigmoid(-800))

# 出力結果:
# 0.7310585786300049
# 0.2689414213699951
# 0.0
# /usr/local/lib/python3.7/dist-packages/ipykernel_launcher.py:4: RuntimeWarning: overflow encountered in exp

# オーバーフロー対策

そこで、xが負の数になった場合に備えて、シグモイド関数を下記のように書き換えます。

y=11+ex(a>0) y=\dfrac {1}{1+e^{-x}}\left( a >0\right)

y=exex+1(a<0) y=\dfrac {e^{x}}{e^{x}+1}\left( a <0\right)

pythonで記述すると,下記の通りです.

def sigmoid2(x):
    if x >= 0:
        s = 1 / (1 + np.exp(-x))
    else:
        e=np.exp(x)
        s = e / (e + 1)
    return s

print(sigmoid2(1))
print(sigmoid2(-1))
print(sigmoid2(-800))

# 出力結果:
# 0.7310585786300049
# 0.2689414213699951
# 0.0

# まとめ

シグモイド関数のオーバーフローの対策を記述しました.

# 参考サイト

pythonでシグモイド関数を実装する (opens new window)

Google Colab + seleniumでarxivの論文をアブストも含めてダウンロードし,翻訳も実施する(2022/02/25修正版)
VQGAN + CLIPでテキストから画像の生成

VQGAN + CLIPでテキストから画像の生成

VQGAN + CLIPでテキストから画像を生成します.