前言
我认为不管是在机器学习里还是深度学习,激活函数的含义不重要,但是这个模型为什么选择这个激活函数很重要。
所以这篇博客我来大概介绍一下那个模型选择那个激活函数。
正文
机器学习中主要可以分为分类问题和回归问题。
分类问题是数据属于哪一个类别的问题,比如区分图像中的人是男是女。
回归问题是根据某个输入预测一个(连续的)数值问题,比如根据图像预测这个人的体重。
输出层的激活函数,要根据求解的问题的性质而定。
一般的,回归问题使用恒等函数,二分类问题使用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
查看评论