文章目录
引言
在前文对 M-P 神经元结构的介绍以及「深度学习|模型推理:端到端任务处理」的推理过程演示中,我们反复提到了激活函数
σ ( ) \sigma() σ() 的概念,它决定了神经元的输出,在神经网络中起着至关重要的作用。激活函数的选择直接影响模型的性能和学习能力。
激活函数是一种用于引入非线性特性的数学函数,用于将加权和转换为更复杂的输出,使神经网络能够学习复杂的模式。通过引入非线性特性,可以解决非线性问题(否则神经网络的输出只是输入的线性组合,无法处理复杂的非线性问题),同时增强网络的表达能力,让其可以处理更复杂的问题。
激活函数对梯度的传播也很重要,一些激活函数(如
ReLU
)具有稀疏激活
性质,可以避免梯度消失问题
,有利于更好的传播误差和加快收敛
速度等作用。这些好的性质我们都将在后文对深度学习的进一步探讨中呈现给大家。
常见的激活函数
激活函数的选择往往根据求解问题的性质决定,一般回归问题可以使用恒等函数
,二分类问题可以使用 sigmoid
函数,多分类问题可以使用 softmax
函数。
前文的手写数字识别任务中,输出层与隐层所用的激活函数 σ \sigma σ() 就有所不同。隐层使用了 ReLU
函数,输出层使用了 softmax
函数,我们将这些激活函数一一展开介绍。
依赖模块
我们会演示实现激活函数的
单个数据
运算的版本和批量数据
运算的版本,其中批量计算将采用对矩阵运算有底层(甚至硬件层面)优化的numpy
模块来实现;同时我们会使用 matplotlib 模块绘制各个激活函数的图形。此处表示全局引入 numpy 与 matplotlib 这两个模块,后文将不再提及。
import numpy as np import matplotlib.pyplot as plt
激活函数图形绘制
我们将统一使用如下的
draw
函数来绘制激活函数的图形:def draw(X, activation_func, title, color='orange'): """ 绘制激活函数图形 :param X: 输入数据 :param activation_func: 激活函数 :param title: 图形标题 :param color: 图形颜色 """ # 创建一个新的图形,figsize 参数指定图形的大小为 6 x 3 plt.figure(figsize=(6, 3)) Y = activation_func(X) plt.plot(X, Y, label=title, color=color) plt.title(title) plt.grid() plt.xlabel('Input') plt.ylabel('Output')
绘图数据准备
创建一批激活函数的输入数据 X,我们可以用它们进行激活函数的功能验证,同时将 X 的元素与对应的输出 Y 的元素构成的点描绘到坐标轴上,即可绘制出激活函数的图形。
# 创建一个从 -10 到 10 的线性空间,共 400 个数据点
X = np.linspace(-10, 10, 400)
阶跃函数
阶跃函数
以阈值为界,输入超过阈值则切换输出。如式 1 所示就是阶跃函数,它以 0 为界,小于 0 时输出 0,超过 0 时输出 1。
σ ( x ) = { 0 ( x ≤ 0 ) 1 ( x > 0 ) (1) \sigma(x) = \begin{cases} 0 & (x \leq 0) \\ 1 & (x > 0) \end{cases} \tag{1} σ(x)={ 01(x≤0)(x>0)(1)
式 1 的 Python 代码实现如下:
def step_single(x):
"""阶跃函数(单个数据计算)"""
return 1 if x > 0 else 0
def step(x):
"""阶跃函数(批量数据计算)"""
return np.array(x > 0, dtype=np.int32)
绘制式 1 的图像:
draw(X, step, 'Step Function')
可以看到,阶跃函数是一条由 0 突变到 1 的曲线,其输出值只有 0 和 1 两种情况,这种函数在神经网络中的应用受到了限制,因为它不是连续的,也不可导。<