飞道的博客

让人头大的激活函数:输出层的激活函数softmax

408人阅读  评论(0)

前言

我认为不管是在机器学习里还是深度学习,激活函数的含义不重要,但是这个模型为什么选择这个激活函数很重要。
所以这篇博客我来大概介绍一下那个模型选择那个激活函数。

正文

机器学习中主要可以分为分类问题和回归问题。
分类问题是数据属于哪一个类别的问题,比如区分图像中的人是男是女。
回归问题是根据某个输入预测一个(连续的)数值问题,比如根据图像预测这个人的体重。
输出层的激活函数,要根据求解的问题的性质而定。
一般的,回归问题使用恒等函数,二分类问题使用simgod函数,多元分类问题可以使用softmax函数。
这篇博客就带大家了解一下softmax函数。

softmax函数

解释:

其中,输出的值为yk
分子为输入参数ak的指数函数
分母为所有输入信号的指数函数的和
其实就是算出来每个分子可能存在的概率。

代码实现:
import numpy as np

#softmax的代码实现
a = np.array([0.3,2.9,4.0])
exp_a = np.exp(a)#实现指数函数
print(exp_a)

sum_exp_a = sum(exp_a)
sum_exp_a

sum = exp_a / sum_exp_a
sum

#完整softmax代码
def softmax(a):
    exp_a = np.exp(a)
    exp_sum = np.sum(exp_a)
    sum = exp_a / exp_sum
    return sum
实现softmax的注意事项:

上述函数存在溢满输出的问题,因为指数函数的值非常容易变得非常大,如e10会超过20000,e100会变成一个后面有40多个0的超大值,e1000的结果会返回一个无穷大的inf。
如果在超大值之间进行除法运算,结果会出现不确定的情况

如何解决


将分子分母同时乘C

由这个公式可以看到,softmax在进行运算的时候,加上或者减去某个常数并不会改变运算结果
lnC可以取任何值,但为了防止溢出,我们一般使用信号中的最大值。
改进后的代码:

def softmax(a):
    c = np.max(a)
    exp_a = np.exp(a-c)
    exp_sum = sum(exp_a)
    sum = exp_a / exp_sum
    return sum
单调递增性质

softmax函数是随着输入值越大,输出值也越大的

#多分类,对比softmax与线性的求和
%matplotlib inline
import numpy as np
import matplotlib.pylab as plt
x = np.arange(10)
e = softmax(x)
f = x/np.sum(x)
plt.show(x,e,color='red',marker='o',linestyle='solid')
plt.show(x,f,color='bule',marker='o',linestyle='solid')
plt.show()


转载:https://blog.csdn.net/HHsHH1234/article/details/116207971
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场