本文摘自《深度学习入门:基于Python的理论与实现》一书。
1. Softmax函数
分类问题中使用的softmax函数可以用下式表示:
期中,
e
x
p
(
x
)
exp(x)
exp(x)是表示
e
x
e^x
ex 的指数函数 (e是纳皮尔常数2.7182 … )
s o f t m a x softmax softmax函数的分子是输入信号 a k a^k ak 的指数函数,分母是所有输入信号的指数函数的和。
2. 代码实现
def softmax(a):
exp_a = np.exp(a)
sum_exp_a = np.sum(exp_a)
y = exp_a / sum_exp_a
return y
3.注意事项
softmax 函数的实现中要进行指数函数的运算,但是此时指数函数的值很容易变得非常大。比如, e 10 e^{10} e10 的值 会超过 20000, e 100 e^{100} e100 会变成一个后面有 40 多个 0 的超大值, e 1000 e^{1000} e1000 的结果会返回 一个表示无穷大的 inf。
例如:
>>> a = np.array([1010, 1000, 990])
>>> np.exp(a) / np.sum(np.exp(a)) # softmax函数的运算
array([ nan, nan, nan])
改进:
(在进行softmax 的指数函数的运算时,加上 ( 或者减去 ) 某个常数并不会改变运算的结果。)
最终代码实现:
import numpy as np
def softmax(x):
c = np.max(x)
exp_a = np.exp(x - c) # 溢出对策
sum_exp_a = np.sum(exp_a)
y = exp_a / sum_exp_a
return y