激活函数:阶跃函数、sigmoid函数、ReLU函数、softmax函数 您所在的位置:网站首页 分段怎么表示1-1-1类似题 激活函数:阶跃函数、sigmoid函数、ReLU函数、softmax函数

激活函数:阶跃函数、sigmoid函数、ReLU函数、softmax函数

#激活函数:阶跃函数、sigmoid函数、ReLU函数、softmax函数| 来源: 网络整理| 查看: 265

之前提到的激活函数是以阈值0(界限值)为界的,小于等于0,输出0,否则,输出1。类似于这样的切换输出函数被称之为“阶跃函数”。因此,可以说感知机的激活函数为阶跃函数。那么,如果感知机使用其他函数作为激活函数的话会怎么样呢?实际上,如果将激活函数从阶跃函数换成其他函数,就可以进入神经网络的世界了。

1、阶跃函数

下面我们就用图来表示上面定义的阶跃函数,为此需要使用 matplotlib 库。

# coding: utf-8 import numpy as np import matplotlib.pylab as plt def step_function(x): return np.array(x > 0, dtype=np.int) X = np.arange(-5.0, 5.0, 0.1) Y = step_function(X) plt.plot(X, Y) plt.ylim(-0.1, 1.1) # 指定图中绘制的y轴的范围 plt.show()

np.arange(-5.0, 5.0, 0.1) 在−5.0到5.0的范围内,以0.1为单位,生成NumPy数组( [-5.0, -4.9, ……, 4.9] )。 step_function() 以该NumPy数组为参数,对数组的各个元素执行阶跃函数运算,并以数组形式返回运算结果。对数组 x 、 y 进行绘图,结果如图所示。 

 

上图中,阶跃函数以 0 为界,输出从 0 切换为 1(或从 1切换 0) 。其值呈阶梯式变化,所以称之为阶跃函数。

2、sigmoid函数

公式: h(x)=\frac{1}{1+e^{-x}}

# coding: utf-8 import numpy as np 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()

 

3、阶跃函数和sigmoid函数的比较 

 

# coding: utf-8 import numpy as np import matplotlib.pylab as plt def sigmoid(x): return 1 / (1 + np.exp(-x)) def step_function(x): return np.array(x > 0, dtype=np.int) x = np.arange(-5.0, 5.0, 0.1) y1 = sigmoid(x) y2 = step_function(x) plt.plot(x, y1) plt.plot(x, y2, 'k--') plt.ylim(-0.1, 1.1) #指定图中绘制的y轴的范围 plt.show()

现在我们来比较一下sigmoid 函数和阶跃函数,如下图所示。两者的不同点在哪里呢?又有哪些共同点呢?我们通过观察图来思考一下。观察下图,首先注意到的是“平滑性”的不同。sigmoid函数是一条平滑的曲线,输出随着输入发生连续性的变化。而阶跃函数以0为界,输出发生急剧性的变化。sigmoid函数的平滑性对神经网络的学习具有重要意义 。 

 

 阶跃函数与sigmoid函数(虚线是阶跃函数)

       另一个不同点是,相对于阶跃函数只能返回0或1,sigmoid函数可以返回0.731 . . . 、0.880 . . . 等实数(这一点和刚才的平滑性有关)。也就是说,感知机中神经元之间流动的是0或1的二元信号,而神经网络中流动的是连续的实数值信号。       接着说一下阶跃函数和sigmoid函数的共同性质。阶跃函数和sigmoid函数虽然在平滑性上有差异,但是如果从宏观视角看上图,可以发现它们具有相似的形状。实际上,两者的结构均是“输入小时,输出接近0(为0);随着输入增大,输出向1靠近(变成1)”。也就是说,当输入信号为重要信息时,阶跃函数和sigmoid函数都会输出较大的值;当输入信号为不重要的信息时,两者都输出较小的值。还有一个共同点是,不管输入信号有多小,或者有多大,输出信号的值都在0到1之间。

4、ReLU函数

到目前为止,我们介绍了作为激活函数的阶跃函数和sigmoid函数。在神经网络发展的历史上,sigmoid函数很早就开始被使用了,而最近则主要使用ReLU(Rectified Linear Unit)函数。

公式:h(x)=maximum(0,x)

# coding: utf-8 import numpy as np 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(-1.0, 5.5) plt.show()

 

5、softmax函数

分类问题可以使用softmax函数,其公式表示为: y_k=\frac{e^{a_k}}{\sum_{i=1}^{n}e^{a_i}} 

上式中表示:假设输出层共有n个神经元,计算第k个神经元的输出 y_k 。softmax函数的分子是输入信号a_k的指数函数,分母是所有输入信号的指数函数的和。 

import numpy as np import matplotlib.pyplot as plt def softmax(x): c = np.max(x) exp_x = np.exp(x - c) # 解决溢出问题 sum_exp_x = np.sum(exp_x) y = exp_x / sum_exp_x return y x = np.array([0.3, 2.9, 4.0]) y = softmax(x) plt.plot(x, y) plt.ylim(-0.1, 1.0) plt.show()

注:上述代码中, c表示的是矩阵中最大值,这样操作是溢出对策。因为计算机处理“数”时,数值必须在4字节或8字节的有限数据宽度内。这意味着数存在有效位数,也就是说,可以表示的数值范围是有限的。因此,会出现超大值无法表示的问题。这个问题称为溢出,在进行计算机的运算时必须(常常)注意。

 

 



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有