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

之前提到的激活函数是以阈值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字节的有限数据宽度内。这意味着数存在有效位数,也就是说,可以表示的数值范围是有限的。因此,会出现超大值无法表示的问题。这个问题称为溢出,在进行计算机的运算时必须(常常)注意。

 

 

  • 17
    点赞
  • 70
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值