softmax函数
在这里插入图片描述

>>> a = np.array([0.3,2.9,4.0])
>>> exp_a=np.exp(a)
>>> print(exp_a)
[ 1.34985881 18.17414537 54.59815003]
>>> sum_exp_a = np.sum(exp_a)
>>> print(sum_exp_a)
74.1221542101633
>>> y=exp_a/sum_exp_a
>>> y
array([0.01821127, 0.24519181, 0.73659691])
>>>
def softmax(x):
    exp_a = np.exp(x)
    sum_exp_a = np.sum(exp_a)
    y = exp_a /sum_exp_a
    return y

以上版本有问题:

>>> a = np.array([1010,1000,990])
>>> np.exp(a)/np.sum(np.exp(a))
__main__:1: RuntimeWarning: overflow encountered in exp
__main__:1: RuntimeWarning: invalid value encountered in true_divide
array([nan, nan, nan])
>>>



公式推导:加上或者减去一个值不影响结果
减去一个最大值,能够得到正确值

>>> a - c
array([  0, -10, -20])
>>> np.exp(a-c)/np.sum(np.exp(a-c))
array([9.99954600e-01, 4.53978686e-05, 2.06106005e-09])
>>>

改进版本

def softmax(a):
    c = np.max(a)
    exp_a = np.exp(a - c)
    sum_exp_a = np.sum(exp_a)
    y = exp_a /sum_exp_a
    return y