>>> a = np.array([0.3, 2.9, 4.0])
>>>
>>> exp_a = np.exp(a) # 指数関数
>>> exp_a
array([ 1.34985881, 18.17414537, 54.59815003])
>>>
>>> sum_exp_a = np.sum(exp_a) # exp_a の総和
74.1221542101633
>>>
>>> y = exp_a / exp_a_sum # 正規化
>>> y
array([0.01821127, 0.24519181, 0.73659691]) # ← 出力
def softmax(a):
# ↓ここにコードを書いてね
return y
↓こうなればOK
>>> a = np.array([1.2, 6.0, 4.3, 2.1])
>>> softmax(a)
array([0.00679496, 0.82565803, 0.15083412, 0.0167129 ])
def softmax(a):
exp_a = np.exp(a) # 指数を求める
sum_exp_a = np.sum(exp_a) # 合計を求める
y = exp_a / sum_exp_a # 合計で割る
return y
オーバーフローとは
数字がコンピュータに表現できる限界を超えてしまうこと
指数関数は簡単に桁が大きくなるため、オーバーフローが起きやすい
(Pythonでは小数型float
に無限大を示す値inf
が存在するのでエラーは起きません。代わりにWarningが出るようになっています。)
>>> a = np.array([1010, 1000, 900])
>>> np.exp(a) / np.sum(np.exp(a))
Warning...
array([nan, nan, nan])
>>>
>>> a_max = np.max(a) # a_max = 1010
>>> a - a_max
array([ 0, -10, -110])
>>>
>>> np.exp(a - a_max) / np.sum(np.exp(a - a_max))
array([9.99954602e-01, 4.53978687e-05, 1.68883521e-48])
↑ちゃんと計算できた!
def softmax(a):
# ↓ここにコードを書いてね
return y
↓こうなればOK
>>> a = np.array([1000, 1001, 999])
>>> softmax(a)
array([0.24472847, 0.66524096, 0.09003057])
def softmax(a):
a_max = np.max(a)
exp_a = np.exp(a - a_max)
sum_exp_a = np.sum(exp_a)
y = exp_a / sum_exp_a
return y
クラス分類(入力を種類に分類する問題)では個に設定する
今までで不安なところを復習する時間!
mermaid.js