news 2026/1/31 7:32:46

神经网络(激活函数)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
神经网络(激活函数)

激活函数

式(3.3)表示的激活函数以阈值为界,一旦输入超过阈值,就切换输出。
这样的函数称为“阶跃函数”。因此,可以说感知机中使用了阶跃函数作为
激活函数。也就是说,在激活函数的众多候选函数中,感知机使用了阶跃函数。
那么,如果感知机使用其他函数作为激活函数的话会怎么样呢?实际上,如
果将激活函数从阶跃函数换成其他函数,就可以进入神经网络的世界了。下
面我们就来介绍一下神经网络使用的激活函数。

sigmoid 函数

神经网络中经常使用的一个激活函数就是式(3.6)表示的sigmoid 函数
(sigmoid function)。
公式如下:

h(x)=11+exp⁡(−x) h(x) = \frac{1}{1 + \exp(-x)}h(x)=1+exp(x)1

式(3.6)中的exp(−x)exp(-x)exp(x)表示e−xe^{-x}ex,其中 e 是纳皮尔常数 (2.7182\cdots)。
虽然 sigmoid 函数形式看起来复杂,但它本质上是一个函数,即给定某个输入后会返回某个输出的转换器。
例如,向 sigmoid 函数输入 1.0 或 2.0,会得到如下输出:

h(1.0)=0.731⋯ ,h(2.0)=0.880⋯ h(1.0) = 0.731 \cdots, \quad h(2.0) = 0.880 \cdotsh(1.0)=0.731,h(2.0)=0.880

神经网络中用sigmoid 函数作为激活函数,进行信号的转换,转换后的信号被传送给下一个神经元。实际上,上一章介绍的感知机和接下来要介绍
的神经网络的主要区别就在于这个激活函数。其他方面,比如神经元的多层
连接的构造、信号的传递方法等,基本上和感知机是一样的。下面,让我们
通过和阶跃函数的比较来详细学习作为激活函数的sigmoid 函数。

阶跃函数的实现

这里我们试着用Python画出阶跃函数的图(从视觉上确认函数的形状对
理解函数而言很重要)。阶跃函数如式(3.3)所示,当输入超过0 时,输出1,
否则输出0。可以像下面这样简单地实现阶跃函数。

defstep_function(x):ifx>0:return1else:return0

这个实现简单、易于理解,但是参数x只能接受实数(浮点数)。也就是
说,允许形如step_function(3.0)的调用,但不允许参数取NumPy数组,例
如step_function(np.array([1.0, 2.0]))。为了便于后面的操作,我们把它修
改为支持NumPy数组的实现。为此,可以考虑下述实现。

defstep_function(x):y=x>0returny.astype(np.int)

上述函数的内容只有两行。由于使用了NumPy中的“技巧”,可能会有
点难理解。下面我们通过Python解释器的例子来看一下这里用了什么技巧。
下面这个例子中准备了NumPy数组x,并对这个NumPy数组进行了不等号
运算。

>>>importnumpyasnp>>>x=np.array([-1.0,1.0,2.0])>>>x array([-1.,1.,2.])>>>y=x>0>>>y array([False,True,True],dtype=bool)

对NumPy数组进行不等号运算后,数组的各个元素都会进行不等号运算,
生成一个布尔型数组。这里,数组x中大于0 的元素被转换为True,小于等
于0 的元素被转换为False,从而生成一个新的数组y。

数组y是一个布尔型数组,但是我们想要的阶跃函数是会输出int型的0
或1 的函数。因此,需要把数组y的元素类型从布尔型转换为int型。

>>>y=y.astype(np.int)>>>y array([0,1,1])

如上所示,可以用astype()方法转换NumPy数组的类型。astype() 方
法通过参数指定期望的类型,这个例子中是np.int型。Python 中将布尔型
转换为int型后,True会转换为1,False会转换为0。以上就是阶跃函数的
实现中所用到的NumPy的“技巧”。

阶跃函数的图形

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

importnumpyasnpimportmatplotlib.pylabaspltdefstep_function(x):returnnp.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进行绘图,结果如图3-6 所示。

如图3-6 所示,阶跃函数以0 为界,输出从0 切换为1(或者从1 切换为0)。
它的值呈阶梯式变化,所以称为阶跃函数。

sigmoid 函数的实现

下面,我们来实现sigmoid 函数。用Python可以像下面这样写出式(3.6)
表示的sigmoid 函数。

def sigmoid(x): return 1 / (1 + np.exp(-x))

这里,np.exp(-x)对应exp(−x)。这个实现没有什么特别难的地方,但
是要注意参数x为NumPy数组时,结果也能被正确计算。实际上,如果在
这个sigmoid 函数中输入一个NumPy数组,则结果如下所示。

>>>x=np.array([-1.0,1.0,2.0])>>>sigmoid(x)array([0.26894142,0.73105858,0.88079708])

之所以sigmoid 函数的实现能支持NumPy数组,秘密就在于NumPy的
广播功能(1.5.5 节)。根据NumPy 的广播功能,如果在标量和NumPy数组
之间进行运算,则标量会和NumPy数组的各个元素进行运算。这里来看一
个具体的例子。

>>>t=np.array([1.0,2.0,3.0])>>>1.0+t array([2.,3.,4.])>>>1.0/t array([1.,0.5,0.33333333])

在这个例子中,标量(例子中是1.0)和NumPy数组之间进行了数值运
算(+、/ 等)。结果,标量和NumPy数组的各个元素进行了运算,运算结
果以NumPy数组的形式被输出。刚才的sigmoid 函数的实现也是如此,因
为np.exp(-x)会生成NumPy数组,所以1 / (1 + np.exp(-x))的运算将会在
NumPy数组的各个元素间进行。

下面我们把sigmoid 函数画在图上。画图的代码和刚才的阶跃函数的代
码几乎是一样的,唯一不同的地方是把输出y的函数换成了sigmoid 函数。

x=np.arange(-5.0,5.0,0.1)y=sigmoid(x)plt.plot(x,y)plt.ylim(-0.1,1.1)# 指定y轴的范围plt.show()

运行上面的代码,可以得到图3-7。

sigmoid 函数和阶跃函数的比较

现在我们来比较一下sigmoid 函数和阶跃函数,如图3-8 所示。两者的
不同点在哪里呢?又有哪些共同点呢?我们通过观察图3-8 来思考一下。

观察图3-8,首先注意到的是“平滑性”的不同。sigmoid 函数是一条平
滑的曲线,输出随着输入发生连续性的变化。而阶跃函数以0 为界,输出发
生急剧性的变化。sigmoid 函数的平滑性对神经网络的学习具有重要意义。

另一个不同点是,相对于阶跃函数只能返回0 或1,sigmoid 函数可以返
回0.731 . . .、0.880 . . . 等实数(这一点和刚才的平滑性有关)。也就是说,感
知机中神经元之间流动的是0 或1 的二元信号,而神经网络中流动的是连续
的实数值信号。

如果把这两个函数与水联系起来,则阶跃函数可以比作“竹筒敲石”A,
sigmoid 函数可以比作“水车”。阶跃函数就像竹筒敲石一样,只做是否传送
水(0 或1)两个动作,而sigmoid 函数就像水车一样,根据流过来的水量相应
地调整传送出去的水量。

接着说一下阶跃函数和sigmoid 函数的共同性质。阶跃函数和sigmoid
函数虽然在平滑性上有差异,但是如果从宏观视角看图3-8,可以发现它们
具有相似的形状。实际上,两者的结构均是“输入小时,输出接近0(为0);
随着输入增大,输出向1 靠近(变成1)”。也就是说,当输入信号为重要信息时,
阶跃函数和sigmoid函数都会输出较大的值;当输入信号为不重要的信息时,
两者都输出较小的值。还有一个共同点是,不管输入信号有多小,或者有多
大,输出信号的值都在0 到1 之间。

非线性函数

阶跃函数和sigmoid 函数还有其他共同点,就是两者均为非线性函数。
sigmoid 函数是一条曲线,阶跃函数是一条像阶梯一样的折线,两者都属于
非线性的函数。

在介绍激活函数时,经常会看到“非线性函数”和“线性函数”等术语。
函数本来是输入某个值后会返回一个值的转换器。向这个转换器输
入某个值后,输出值是输入值的常数倍的函数称为线性函数(用数学
式表示为h(x) = cx。c 为常数)。因此,线性函数是一条笔直的直线。
而非线性函数,顾名思义,指的是不像线性函数那样呈现出一条直
线的函数。

神经网络的激活函数必须使用非线性函数。换句话说,激活函数不能使
用线性函数。为什么不能使用线性函数呢?因为使用线性函数的话,加深神
经网络的层数就没有意义了。

线性函数的问题在于,不管如何加深层数,总是存在与之等效的“无隐藏层的神经网络”。为了具体地(稍微直观地)理解这一点,我们来思考下面这个简单的例子。这里我们考虑把线性函数 $h(x) = cx $ 作为激活函数,把 $ y(x) = h(h(h(x))$ 的运算对应 3 层神经网络。这个运算法则进行 $ y(x) = c \times c \times c \times x $ 的乘法运算,但是同样的处理可以由 $ y(x) = ax(注意,(注意,(注意,a = c^3 $这一次乘法运算(即没有隐藏层的神经网络)来表示。如本例所示,使用线性函数时,无法发挥多层网络带来的优势。因此,为了发挥叠加层所带来的优势,激活函数必须使用非线性函数。

ReLU函数

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

ReLU函数在输入大于0 时,直接输出该值;在输入小于等于0 时,输
出0(图3-9)。

ReLU函数可以表示为下面的式(3.7)。
h(x)={x(x>0)0(x⩽0) h(x) = \begin{cases} x & (x > 0) \\ 0 & (x \leqslant 0) \end{cases}h(x)={x0(x>0)(x0)
如图3-9 和式(3.7)所示,ReLU 函数是一个非常简单的函数。因此,
ReLU函数的实现也很简单,可以写成如下形式。

defrelu(x):returnnp.maximum(0,x)

这里使用了NumPy的maximum函数。maximum函数会从输入的数值中选
择较大的那个值进行输出。

本章剩余部分的内容仍将使用sigmoid 函数作为激活函数,但在本书的
后半部分,则将主要使用ReLU函数。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/1/24 8:51:13

课程达成情况评价系统的设计与实现文献翻译

重庆理工大学毕业设计(论文)文 献 翻 译学 院 (全称) 班 级 (写全) 学生姓名 学 号 (写全) 译 文 要 求1、译文内容必须与课题(或专业)内容相关…

作者头像 李华
网站建设 2026/1/28 0:21:12

HeyGem系统通过FastStone Capture注册码优化截图标注流程

HeyGem系统通过FastStone Capture注册码优化截图标注流程 在AI数字人技术快速落地的今天,内容生成效率与操作可视化之间的矛盾日益凸显。以HeyGem这类基于大模型驱动的口型同步视频合成平台为例,其强大的本地化部署能力让企业能够安全高效地批量制作数字…

作者头像 李华
网站建设 2026/1/24 17:26:17

HeyGem数字人系统日志查看技巧:实时监控运行状态与错误排查

HeyGem数字人系统日志查看技巧:实时监控运行状态与错误排查 在AI数字人技术快速落地的今天,越来越多的企业开始部署自动化视频生成系统。然而,当服务部署到云服务器或边缘设备后,一个常见的痛点浮现出来:系统看似正常运…

作者头像 李华
网站建设 2026/1/24 17:26:16

HeyGem系统旅游行业打造景点导游数字人服务

HeyGem系统赋能旅游行业:打造智能化景点导游数字人服务 在智慧旅游浪潮席卷全球的今天,游客对导览体验的要求早已超越“走马观花”。他们希望获得更个性、更沉浸、更即时的信息服务。然而,传统人工导游模式却面临人力成本高、多语言支持难、服…

作者头像 李华
网站建设 2026/1/30 11:01:09

HeyGem系统任务进度条可视化展示当前处理状态

HeyGem系统任务进度条可视化展示当前处理状态 在AI视频生成系统中,用户上传一段音频和多个数字人视频后点击“批量生成”,接下来会发生什么?页面卡住了吗?是程序崩溃了还是正在运行?第一个视频处理到哪一步了&#xff…

作者头像 李华
网站建设 2026/1/27 3:42:09

AI数字人未来趋势:HeyGem系统展现低门槛创作潜力

AI数字人未来趋势:HeyGem系统展现低门槛创作潜力 在内容爆炸的时代,视频已成为信息传递的核心载体。但高质量视频的生产成本依然居高不下——尤其当涉及人物出镜时,拍摄、剪辑、配音环环相扣,耗时费力。有没有一种方式&#xff0c…

作者头像 李华