f ( x ) = 1 / 1 + e x p ( − x ) f(x)= 1/1+exp(-x) f(x)=1/1+exp(−x)
图像如下形状:
绘制代码
import matplotlib.pylab as plt
def sigmoid(x):
return 1/(1+np.exp(-x))
x=np.arange(-5.0, 5.0, 0.1)
y = sigmoid(x)
plt.plot(x,y)
plt.ylim(-0.1, 1.1)
plt.show()
这个函数的好处是连续函数, 深度刻画在0~1的范围, 自变量小, 则函数值小, 自变量大则函数值大
f ( x ) = m a x ( 0 , x ) f(x) = max(0, x) f(x)=max(0,x)
import matplotlib.pylab as plt
def relu(x):
return np.maximum(0, x)
x=np.arange(-5.0, 5.0, 0.1)
y = relu(x)
plt.plot(x,y)
plt.ylim(-0.1, 6)
plt.show()
f ( x ) = x f(x) = x f(x)=x
这个图就不画了, 图形是均分第一象限的一条直线。
这个函数不能用在神经网络的中间层, 对于回归问题, 一般用在输出层上, 实际上不用也行, 用了为了保值逻辑的一致性。
y k = e x p ( a k ) ∑ i = 0 n e x p ( a i ) y_{k} = \displaystyle \frac{exp(a_k)}{ \sum^{n}_{i=0}{exp(a_i)}} yk=∑i=0nexp(ai)exp(ak)
一般用在分类问题中, 看函数的定义是对每一个分量求自然指数的值, 求和后作为分母, 而分子是每一个分量的自然指数值。 代码实现为:
def softmax(a):
exp_a = np.exp(a)
sum_exp_a = np.sum(exp_a)
return exp_a /sum_exp_a
实际使用过程中为了防止计算机计算时溢出的风险, 会有如下的改进:
y k = e x p ( a k + C ) ∑ i = 0 n e x p ( a i + C ) y_{k} = \displaystyle \frac{exp(a_k+C)}{ \sum^{n}_{i=0}{exp(a_i + C)}} yk=∑i=0nexp(ai+C)exp(ak+C)
其中C是一个常, 一般进行运算是,C 可以取 m a x ( a ) max(a) max(a).
softmax的函数输出是0.0到1.0之间的实数, 并且 softmax函数的输出值的总和是1. 输出总和为1是softmax函数的一个重要性质。正因为有了这个性质, 我们才能把softmax函数的输出解释为“概率”。
y = e x p ( x ) y=exp(x) y=exp(x)是单调递增的, softmax函数, 各元素之间的大小关系不会改变。神经网络在进行分类时, 输出层的softmax 函数可以省略, 正如前面解释的, 经过softmax函数求解后, 最大值的位置不会改变。神经网络只把输出值最大的神经元多对应的类别作为识别结果。