侧边栏壁纸
  • 累计撰写 131 篇文章
  • 累计创建 16 个标签
  • 累计收到 4 条评论

目 录CONTENT

文章目录

深度学习中的激活函数

激活函数原理

激活函数在神经网络中具有非常重要的作用,其主要作用有以下几点:

  • 引入非线性变换:激活函数的非线性变换使得神经网络可以学习到非线性的关系,从而可以逼近各种复杂的函数和决策边界
  • 解决梯度消失问题:在深层神经网络中,梯度往往会随着层数的增加而指数级衰减,导致深层网络难以训练。而激活函数的合理选择可以缓解这个问题,例如 ReLU 激活函数在正区间具有线性特征,可以使得梯度保持不变,从而有助于深层网络的训练。
  • 控制输出范围:激活函数的输出范围可以控制在一定的范围内,例如sigmoid激活函数的输出范围在0到1之间,tanh激活函数的输出范围在-1到1之间,这可以使得网络的输出具有一定的限制性,有助于提高模型的泛化能力

因此,选择合适的激活函数对于神经网络的性能和训练效果具有非常重要的影响。

激活函数有两个主要功能。一个是涉及前馈步骤的功能本身。二是涉及反向传播步骤函数的导数。可以将前馈视为预测,将反向传播视为训练或学习

前馈步骤

例如在 MLP 网络中,层与层之间的传递过程如上图所示,输入通过加权求和并激活后输出

激活函数主要用于对每一层的输入进行非线性变换,从而得到输出。由于神经元之间的连接权重通常是可调节的,因此激活函数可以通过学习调整连接权重,使得神经网络可以逼近各种非线性函数,从而实现对复杂模式的建模和预测。

例如,对于输入向量 xx 和第 ii 层的权重矩阵 WiW_i,激活函数 ff 的输出 hih_i 可以通过以下公式计算:

hi=f(Wix)h_i=f(W_ix)

反向传播中的导数计算

在神经网络的反向传播 (训练) 过程中,激活函数的导数计算非常重要。在反向传播中,我们需要计算每个神经元的梯度,以便于调整连接权重进行误差反向传播。而激活函数的导数计算梯度的重要组成部分,因为梯度可以通过导数和误差的乘积计算得到。

例如,对于某一层的输出向量 hih_i 和误差向量 ee,该层中每个神经元的梯度可以通过以下公式计算:

eWi=ehihiWi\frac{\partial e}{\partial W_i}=\frac{\partial e}{\partial h_i} \frac{\partial h_i}{\partial W_i}

其中,hiWi\frac{\partial h_i}{\partial W_i} 是激活函数的导数,可以根据不同的激活函数进行计算。

梯度消失和梯度爆炸

这是深度神经网络中常见的问题,它们的根本原因是深度网络的反向传播过程中,梯度会不断地被传递下去,而由于梯度的大小和方向是由网络中每一层的权重和激活函数决定的,因此梯度的大小可能会随着网络层数的增加指数级地衰减或者增加,导致梯度消失或爆炸。

梯度消失的原因是由于梯度在反向传播过程中会不断地被乘以权重矩阵的转置,由于权重矩阵中的元素通常都在[0,1]之间,因此在多层网络中,梯度可能会被不断地缩小,最终变得非常小甚至趋近于0,从而使得网络的训练难以收敛

而梯度爆炸则是由于网络中某些层的权重过大,导致梯度在反向传播过程中会被不断地放大,最终达到非常大的值,甚至溢出,导致训练不稳定或者无法收敛

梯度消失和梯度爆炸问题在深度神经网络中非常普遍,特别是在使用传统的激活函数(如sigmoid函数和tanh函数)时更加严重。因此,为了缓解这些问题,研究人员提出了一系列针对梯度消失和梯度爆炸的技术,例如使用更加稳定的激活函数(如ReLU和LeakyReLU)和权重初始化方法、批归一化技术等。

激活函数详解

不同的激活函数具有不同的特点和适用场景,在实际应用中需要根据具体情况进行选择。

Sigmoid 激活函数

Sigmoid 激活函数是一种常用的非线性激活函数,在神经网络中经常使用。它的定义如下:

σ(z)=11+ez\sigma(z)=\frac{1}{1+e^{-z}}

其中,zz 表示输入的信号,也就是神经元接收到的加权输入ee 表示自然对数的底数。

优点:将 zz 映射到了 (0,1)(0,1) 区间内的一个连续值,具有平滑的、连续的非线性特性,并可用来实现二分类问题的输出层

缺点:由于它的导数范围在 (0,0.25)(0,0.25),在神经网络的深层网络中容易出现梯度消失的问题,因此在一些情况下,它的使用有一定的局限性。且执行指数运算,计算机运行得较慢。

Softmax 函数

Softmax函数也是一种常用的激活函数,用于输出层,特别适用于多分类问题。Softmax函数将输入的K维向量转化为概率分布,每个分量的取值范围在(0,1)之间且所有分量的和为1。Softmax函数的公式为:

fj(z)=ezjk=1Kezk(j=1,2,...,K)f_j(z) = \frac{e^{z_j}}{\sum_{k=1}^{K}e^{z_k}} \qquad (j=1,2,...,K)

其中,zz是一个大小为KK的向量,fj(z)f_j(z)代表了将输入向量zz映射到第jj个输出的概率

Softmax函数有几个重要的性质。首先,它可以将输入向量映射到一个概率分布中,这意味着Softmax函数输出概率值的总和为1,可以作为多分类问题输出层的激活函数。其次,Softmax函数是可导的,可以使用反向传播算法来训练模型参数。另外,Softmax函数是光滑的,有助于提高模型的稳定性和泛化能力

需要注意的是,Softmax函数在计算过程中可能会出现数值上溢或下溢的问题。数值上溢是由于输入值过大而导致的,可能会返回不正确的概率,数值下溢是由于输入值过小而导致的,在计算机中会返回0。为了避免这些问题,通常使用数值稳定的计算方法,如将每个输入值先减去最大值,然后再进行计算。

如果神经元输出的值很大或很小,梯度会接近于零。这会导致在反向传播时,这些神经元的参数几乎不会被更新,从而降低了学习率,甚至导致网络无法学习。

Tanh 激活函数

Tanh(双曲正切)激活函数是一种非线性激活函数,它在神经网络中也是一种常用的激活函数。它的定义如下:

tanh(z)=ezezez+ez\tanh(z)=\frac{e^z-e^{-z}}{e^z+e^{-z}}

Tanh 激活函数的输入范围是 (,+)(-\infty, +\infty)输出范围(1,1)(-1, 1)。它具有类似 Sigmoid 激活函数的连续性和平滑性,但与 Sigmoid 激活函数不同的是,它的输出区间是对称的。因此,在一些需要对称性的任务中,Tanh 激活函数可以表现的更好。

Tanh 激活函数也存在在输入值偏离 0 时,导数会快速趋近于 0,梯度消失问题,但相对于 Sigmoid 激活函数来说,它的导数范围在 (0,1)(0,1),较为适中。因此,在一些需要使用非线性激活函数的深度神经网络中,Tanh 激活函数也是一种常用的选择。

Step 函数

Step函数常常也被称为阶跃函数或单位阶跃函数,是一种分段常数函数。在人工神经网络中,Step函数常常被用作激活函数,但其在实际神经网络中很少被使用,因为它既不可微,也不允许反向传播误差。

ReLu 函数

ReLU函数是一种非常简单而广泛使用的激活函数,它的定义为

f(x)=max(0,x)f(x) = max(0, x)

优点在于它具有简单、易于计算的特性,因为它是分段线性函数,能够有效地解决梯度消失的问题,并且在许多深度学习应用中表现出色。它是非常常用的激活函数之一。

ReLU函数具有不能输出负值的特性,它自动将负值设置为零。这种非线性变换使得神经网络具有更强的拟合能力,因为它能够非常有效地将线性模型变为非线性模型。在实践中,ReLU函数的使用因其高效的优势而非常普遍。

然而,ReLU函数也存在一些缺点,比如当输入为负数时,梯度始终为零,这可能导致神经元“死亡”,因此在大规模深度神经网络中,需要进行适当的参数初始化和正则化防止ReLU神经元的失效

SoftPlus 函数

SoftPlus函数是ReLu函数的平滑版本,它以更平滑的方式逼近线性性,也可以将负值作为输入并产生非负输出。SoftPlus函数的公式为:

f(x)=ln(1+ex)f(x) = ln(1+e^x)

SoftPlus的输出非常接近于线性函数,但相对于线性函数,它的导数具有连续性和光滑性,可以通过求导得到,而ReLu函数的导数在输入为0处是未定义的。

优点在于它可以帮助避免神经网络输出的破碎梯度问题Exploding Gradients问题。同时,它的输出值也非常平滑,这对于某些任务,如图像分割和目标检测等需要输出非常平滑的场景来说是非常有用的。

但是,SoftPlus函数的计算代价相对较大,计算速度比起ReLu函数等其他激活函数要慢。与此同时,在某些情况下,由于它的平滑性,它可能过度拟合了一些数据集。因此,当选择使用SoftPlus函数时,需要根据具体的任务和数据集特性进行评估和选择。

Leaky ReLU 函数

Leaky ReLU是ReLU函数的一种变体,它被设计来解决ReLU在负半轴上梯度为零的问题。Leaky ReLU与ReLU不同的是,当输入为负数时,它会产生一个小的非零输出。Leaky ReLU的公式为:

f(x)={x,if x0ax,otherwisef(x) =\begin{cases}x, & \text{if } x \geq 0 \\ax, & \text{otherwise}\end{cases}

其中,aa是一个小的数值,通常取0.01,可以根据具体情况进行调整。

Leaky ReLU的优点在于它保留了ReLU的高效性和非线性特性,同时避免了ReLU在负半轴上梯度为零的问题。这使得Leaky ReLU在一些深度学习应用中比ReLU表现更好。另外,与ReLU相比,Leaky ReLU可以缓解梯度消失的问题,并且不会出现ReLU神经元“死亡”的情况。

但是,与ReLU一样,不具有指数增长的特性。与其他激活函数相比,Leaky ReLU的增长速度较慢,可能需要更多的神经元或层数才能达到较好的性能。

Softsign 函数

ELU 函数

Swish 函数

Sinc 函数

Mish 函数

总结

激活函数 优点 缺点 适用问题
ReLU 收敛速度快,解决梯度消失问题,计算速度快 会出现“死亡”神经元,输出不包括负数部分 在处理多层神经网络时需要在参数化优化方面进行针对性的调整
Tanh 具有非线性度强、能够中心化输出的优良特性,适合进行求导 容易发生梯度消失,计算代价大 适用于需要处理对称数据的任务,例如图像分类
Sigmoid 能够映射到[0,1]区间,适用于二分类或试图估计概率的问题 容易发生梯度消失,局限于分类 适用于需要进行二分类或推断概率的任务
Softmax 可以用于多分类问题,将输出映射到[0,1]区间并进行归一化处理 容易受到“数值不稳定”问题影响 适用于需要进行多分类任务的场景
Leaky ReLU 解决ReLU“死亡”问题,具有良好的效果,在图像、视频识别和机器翻译等任务中表现优异 参数需要手工调整,与ReLU存在同样问题 适用于需要处理细节和对抗噪声的任务
PReLU 具有多项初始值选项,不仅仅在负值上有输出 可能因为过度自由的表达式而降低性能 适用于性能要求较高的任务
ELU 通过负值解决了“死亡ReLU”问题,适合采用高维数据的深度学习模型 计算代价大,训练可能会更加复杂 适用于需要处理高维数据的场景
Swish 具有一定的非线性性质,并且对反向传播有良好的性质 在某些数据集上过度拟合,需要进行正则化 适用于需要进行高维度数据计算的深度学习任务
TanH-ReLU 结合了Tanh和ReLU的优点,有效地处理负输出值,具有通用性 计算复杂,少数情况下效果不如ReLU 适用于图像和视频识别、机器翻译等常规深度学习任务
Softsign 具有连续、可导和平滑的性质,适用于文本分类和人脸识别等任务 计算复杂,在输入处接近0处斜率较大,训练相对复杂 适用于需要进行文本分类和人脸识别的任务
ArcTan 中间值靠近0,求导不容易出现问题 输出区间为[-1.57,1.57],有梯度弥散和梯度消失的问题 适用于进行分类等任务
SoftPlus 具有较平滑的输出,且有很小的梯度 计算代价大,性能需要考虑 适用于图像分割和目标检测等需要较平滑输出的场景
Identity 高效、简单,适用于需要对神经元的输入不加改变的场景 无法解决非线性问题 适用于批归一化和残差映射等场景
SoftClipping 可以防止神经元的溢出或饱和 适用场景仍需研究与实践 适用于语音识别等场景
0

评论区