目录
[1. 激活函数不是阶跃函数](#1. 激活函数不是阶跃函数)
[1.1 激活函数和阶跃函数都是非线性函数](#1.1 激活函数和阶跃函数都是非线性函数)
[1.2 激活函数不是阶跃函数](#1.2 激活函数不是阶跃函数)
[2. sigmoid 函数](#2. sigmoid 函数)
[2.1 sigmoid 函数表达式](#2.1 sigmoid 函数表达式)
[2.2 sigmoid 函数 Python 实现](#2.2 sigmoid 函数 Python 实现)
[2.4 sigmoid 函数图](#2.4 sigmoid 函数图)
[3. ReLU 函数](#3. ReLU 函数)
[3.1 ReLU 函数表达式](#3.1 ReLU 函数表达式)
[3.2 ReLU 函数 Python 实现](#3.2 ReLU 函数 Python 实现)
[3.4 ReLU 函数图](#3.4 ReLU 函数图)
在下面的文章中提到了激活函数,事实上激活函数有很多种,本文介绍两种最常见的。另外文章中可能会用到一些 numpy、Matplotlib 模块的知识,同学们如果没有了解可以看看下面的文章。
1. 激活函数不是阶跃函数
1.1 激活函数和阶跃函数都是非线性函数
在这里我们会提到数学上的专有名词 "线性函数" 和 "非线性函数",两者是相对的。不是线性函数,就是非线性函数。
激活函数和阶跃函数都是非线性函数。线性和非线性是相对而言的,它们是用来区分函数 y = f(x) 对自变量 x 的依赖关系的。
-
线性:如果函数 y = f(x) 满足以下两个条件,那么它就是一个线性函数:
-
叠加原理成立,即 f(ax + by) = af(x) + bf(y),其中 a 和 b 是任意常数。
-
齐次原理成立,即 f(kx) = kf(x),其中 k 是任意常数。
-
-
非线性:如果函数 y = f(x) 不满足以上两个条件,那么它就是一个非线性函数。
从几何上看,线性函数的图像是一条直线,而非线性函数的图像是一条曲线或者不连续的线段。但是请注意,图像是一条直线的不一定是线性函数。
严格来说,只有过原点的最简单的直线f(x)=kx才被称为一元线性函数;f(x)=kx+b 这种函数是不能满足叠加原理和齐次原理的。但是 f(x)=kx+b 的图是一条直线!
1.2 激活函数不是阶跃函数
激活函数不是阶跃函数,阶跃函数的图是两条直线。激活函数的图是曲线的。
阶跃函数适用于感知机,激活函数适用于神经网络,但是感知机的初级模型和神经网络的神经元图模型非常相似,仅此而已。
下面是阶跃函数的 python 代码实现和图。
python
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
def step_function(x):
return(np.array(x>0,dtype=np.int32))
x=np.arange(-5.0,5.0,0.1)
y=step_function(x)
plt.plot(x,y)
plt.xlabel("x line")
plt.ylabel("y line")
plt.xlim(-5,5.1) #指定 x 轴的位置
plt.ylim(-1,1.1) #指定 y 轴的位置
plt.show()
神经网络的激活函数必须使用非线性函数,如果使用线性函数,那么加深神经网络的层数就没有意义了。
2. sigmoid 函数
sigmoid 函数是一种在数学和工程领域中广泛使用的函数,在人工神经网络中也经常使用。
2.1 sigmoid 函数表达式
它的数学定义可以表示为:
其中 e 是自然对数的底数。这个函数将输入值映射到 (0,1) 的区间内,当输入值趋于正无穷或负无穷时,输出分别趋近于 1 和 0。
Sigmoid函数具有以下特性:
- 连续性和可导性:它是连续且可导的,这使得它在数学处理上非常方便。
- 有界性:函数的值域被限制在 (0,1) 之间,这个性质使得它在需要将输出解释为概率值的场景中非常有用。
- 对称性:关于原点对称,这意味着如果 x 是输入,那么 -x 也是输入,并且输出相同。
- S形曲线:它的图形呈现优美的 S 形曲线,这也是其名称的来源。
- 易于求导:它的导数可以用自身表示,即 f'(x)=f(x)(1-f(x)) ,这大大简化了计算过程。
尽管Sigmoid函数具有上述优点,但它也存在一些缺点:
- 计算量大:由于涉及指数运算,它的计算成本相对较高。
- 梯度消失问题:在反向传播过程中,当输入值很大或很小的时候,梯度会趋近于零,这会导致权重更新缓慢,影响网络的训练效率。
因此,虽然Sigmoid函数在神经网络和逻辑回归中有广泛的应用,但在处理深层网络时可能会遇到一些计算和优化上的挑战。
2.2 sigmoid 函数 Python 实现
sigmoid 函数的 python 实现如下:
python
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
def sigmoid_function(x):
return(1/(1+np.exp(-x)))
x=np.arange(-5.0,5.0,0.1)
y1=step_function(x)
y2=sigmoid_function(x)
plt.plot(x,y1,label="step")
plt.plot(x,y2,linestyle="dashdot",label="sigmoid")
plt.xlabel("x line")
plt.ylabel("y line")
plt.xlim(-5,5.1) #指定 x 轴的位置
plt.ylim(-1,2) #指定 y 轴的位置
plt.show()
2.4 sigmoid 函数图
下面是 sigmoid 函数和阶跃函数的比对图。
从图上看 sigmoid 函数和阶跃函数 还是有很多共同之处:
- 不管输入信号是多少,输出信号都是在 0 和 1 之间。
- 输入信号越大,输出信号越接近 1;输入信号越小,输出信号越接近 0;
3. ReLU 函数
ReLU(Rectified Linear Unit)函数是一种常用的激活函数,近些年 ReLU 函数在深度学习中被广泛应用,因为它的计算简单且能够有效地缓解梯度消失问题。
ReLU函数的优点包括:计算简单,梯度不会饱和,能够加速收敛速度,并且能够提供稀疏激活性。
3.1 ReLU 函数表达式
ReLU 函数在输入大于 0 时候,直接输出该值;在输入小于 0 时候,输出 0.
其数学表达式为:
3.2 ReLU 函数 Python 实现
ReLU 函数的 python 实现如下:
python
def ReLU_function(x):
return(np.maximum(0,x))
x=np.arange(-5.0,5.0,0.1)
y=ReLU_function(x)
plt.plot(x,y,label="ReLU")
plt.xlabel("x line")
plt.ylabel("y line")
plt.xlim(-5,5.1) #指定 x 轴的位置
plt.ylim(-5,5.1) #指定 y 轴的位置
plt.show()
3.4 ReLU 函数图
下面是 sigmoid 函数、阶跃函数、ReLU 的比对图。
'''
要是大家觉得写得还行,麻烦点个赞或者收藏吧,想给博客涨涨人气,非常感谢!
'''