深度学习最常用的 10 大激活函数数学原理及优缺点

激活函数(Activation Function)是一种添加到人工神经网络中的函数,旨在帮助网络学习数据中的复杂模式,是确定神经网络输出的数学方程式

by deepgram

激活函数是神经网络模型重要的组成部分,俺们从激活函数的数学原理出发,详解激活函数的优缺点。文末总结处,看闻[激]起舞;文字略长,建议先收藏再细品…

  1. Sigmoid函数
    1.1 定义和函数形式

Sigmoid函数是一种常用的激活函数,其数学形式为:

它将输入的实数映射到(0,1)之间,常用于输出层的二分类问题,可以将神经网络的输出解释为概率。

1.2 手动实现并可视化

你可以使用Python代码手动实现Sigmoid函数,并通过绘图工具将其可视化,以便理解其形状和特点。

import numpy as np
import matplotlib.pyplot as plt

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

x = np.linspace(-10, 10, 100)
y = sigmoid(x)

plt.plot(x, y)
plt.title(‘Sigmoid 大侠’)
plt.xlabel(‘Input’)
plt.ylabel(‘Output’)
plt.grid(True)
plt.show()

1.3 作用和用途

Sigmoid函数在神经网络中主要用于输出层的二分类问题,将神经网络的输出映射到(0,1)之间的概率值,便于进行分类决策。

1.4 优点和局限性

优点:
输出范围为(0,1),可以被解释为概率。
平滑的S形曲线,可以保持梯度的连续性,有利于反向传播算法的稳定性。
局限性:
Sigmoid函数存在梯度饱和问题,当输入较大或较小时,梯度会接近于零,导致梯度消失,影响网络的训练。
Sigmoid函数的输出不是以零为中心的,可能导致梯度更新不均匀,影响训练速度。

1.5 梯度消失和梯度爆炸问题

Sigmoid函数在输入较大或较小时,会出现梯度接近于零的问题,导致梯度消失,使得网络难以收敛或学习缓慢。

1.6 建议的使用场景

二分类问题的输出层。
对输出范围有明确要求的任务。

  1. Tanh函数
    2.1 定义和函数形式

Tanh函数(双曲正切函数)是一种常用的激活函数,其数学形式为:

它将输入的实数映射到(-1,1)之间,具有S形曲线,常用于隐藏层的激活函数。

2.2 手动实现并可视化

你可以使用Python代码手动实现Tanh函数,并通过绘图工具将其可视化,以便理解其形状和特点。

import numpy as np
import matplotlib.pyplot as plt

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

x = np.linspace(-10, 10, 100)
y = tanh(x)

plt.plot(x, y)
plt.title(‘Tanh 大侠’)
plt.xlabel(‘Input’)
plt.ylabel(‘Output’)
plt.grid(True)
plt.show()

2.3 作用和用途

Tanh函数在神经网络中常用于隐藏层的激活函数,将输入映射到(-1,1)之间,可以提供更广泛的输出范围,有利于神经网络的学习。

2.4 优点和局限性

优点:
输出范围为(-1,1),相比Sigmoid函数更广泛,可以提供更大的梯度,有利于神经网络的学习。
Tanh函数是Sigmoid函数的平移和缩放版本,具有相似的S形曲线,但输出以零为中心,有助于减少梯度更新不均匀的问题。
局限性:
Tanh函数同样存在梯度饱和问题,当输入较大或较小时,梯度会接近于零,导致梯度消失,影响网络的训练。
Tanh函数的输出范围仍然有限,可能在某些情况下导致梯度爆炸或梯度消失问题。

2.5 梯度消失和梯度爆炸问题

Tanh函数在输入较大或较小时,同样会出现梯度接近于零的问题,导致梯度消失,使得网络难以收敛或学习缓慢。

2.6 建议的使用场景

隐藏层的激活函数,特别是对输出范围有明确要求的任务。
在需要使用Sigmoid函数的情况下,考虑使用Tanh函数代替,因为Tanh函数具有更广泛的输出范围。

  1. ReLU函数(Rectified Linear Unit)

3.1 定义和函数形式

ReLU函数是一种简单而有效的激活函数,其数学形式为:

它将输入的实数映射到大于等于零的范围,如果输入小于零,则输出为零;如果输入大于零,则输出与输入相同。

3.2 手动实现并可视化

你可以使用Python代码手动实现ReLU函数,并通过绘图工具将其可视化,以便理解其形状和特点。

import numpy as np
import matplotlib.pyplot as plt

def relu(x):
return np.maximum(0, x)

x = np.linspace(-10, 10, 100)
y = relu(x)

plt.plot(x, y)
plt.title(‘ReLU 大侠’)
plt.xlabel(‘Input’)
plt.ylabel(‘Output’)
plt.grid(True)
plt.show()

3.3 作用和用途

ReLU函数在神经网络中广泛用于隐藏层的激活函数,能够加速训练过程,避免了Sigmoid函数和Tanh函数存在的梯度消失问题。

3.4 优点和局限性

优点:
ReLU函数在输入大于零时,梯度恒为1,不会饱和,避免了梯度消失问题,有利于加速训练过程。
计算简单,只需比较输入和零的大小即可,运算速度快。
只有一个分段,导数在大多数情况下为常数,便于反向传播计算。
局限性:
ReLU函数在输入小于零时,导数为零,称为“神经元死亡”,可能导致对应神经元永远无法激活,称为“ReLU死亡”问题。
输出不以零为中心,可能导致梯度更新不均匀,影响网络性能。

3.5 梯度消失和梯度爆炸问题

ReLU函数在输入小于零时,导数为零,可能导致梯度消失问题。但在输入大于零时,梯度恒为1,不会饱和,避免了梯度爆炸问题。

3.6 建议的使用场景

隐藏层的激活函数,特别是在需要加速训练过程和处理稀疏数据的情况下。
对于不需要输出负值的任务,可以考虑使用ReLU函数代替其他激活函数。

  1. Leaky ReLU函数

4.1 定义和函数形式

Leaky ReLU函数是对ReLU函数的改进,其数学形式为:

其中a是一个小的斜率(通常接近于零),当输入小于零时,不再输出零,而是输出输入的一个小比例,以解决ReLU函数在负数部分输出为零的问题。

4.2 手动实现并可视化

你可以使用Python代码手动实现Leaky ReLU函数,并通过绘图工具将其可视化,以便理解其形状和特点。

import numpy as np
import matplotlib.pyplot as plt

def leaky_relu(x, alpha=0.1): # 通常取0.01,此处为了可视化明显取 0.1
return np.maximum(alpha*x, x)

x = np.linspace(-10, 10, 100)
y = leaky_relu(x)

plt.plot(x, y)
plt.title(‘Leaky ReLU 大侠’)
plt.xlabel(‘Input’)
plt.ylabel(‘Output’)
plt.grid(True)
plt.show()

4.3 作用和用途

Leaky ReLU函数在神经网络中用于隐藏层的激活函数,能够解决ReLU函数在负数部分输出为零的问题,避免“神经元死亡”的情况。

4.4 优点和局限性

优点:
解决了ReLU函数在负数部分输出为零的问题,避免了“神经元死亡”的情况。
保留了ReLU函数的大部分优点,计算简单,不会出现梯度爆炸问题。
局限性:
需要额外的参数a,需要手动调整或者通过训练学习,可能增加了模型的复杂性。
当a的值选择不当时,可能会导致模型性能下降。

4.5 梯度消失和梯度爆炸问题

Leaky ReLU函数在输入小于零时,输出的斜率为常数,不会出现梯度消失问题;在输入大于零时,输出的斜率为1,不会出现梯度爆炸问题。

4.6 示例和应用

隐藏层的激活函数,特别是在需要避免ReLU死亡问题的情况下。
适用于训练速度较慢的深度神经网络。

4.7 建议的使用场景

在需要避免ReLU函数输出为零的情况下使用,例如对负值敏感的任务或深度神经网络中的隐藏层。
当需要控制负值部分输出的比例时,可以通过调整参数a来灵活使用Leaky ReLU函数。

  1. Parametric ReLU函数

5.1 定义和函数形式

Parametric ReLU函数是对ReLU函数的改进,其数学形式为:

其中a是一个学习的参数,可以被网络训练得到,与Leaky ReLU函数不同的是,Parametric ReLU函数的斜率是通过训练得到的。

5.2 手动实现并可视化

你可以使用Python代码手动实现Parametric ReLU函数,并通过绘图工具将其可视化,以便理解其形状和特点。

import numpy as np
import matplotlib.pyplot as plt

class ParametricReLU:
def init(self, a=0.1):# 通常取0.01,此处为了可视化明显取 0.1
self.a = a

def forward(self, x):
    return np.maximum(self.a * x, x)

x = np.linspace(-10, 10, 100)
param_relu = ParametricReLU(a=0.1)
y = param_relu.forward(x)

plt.plot(x, y)
plt.title(‘Parametric ReLU 大侠’)
plt.xlabel(‘Input’)
plt.ylabel(‘Output’)
plt.grid(True)
plt.show()

5.3 作用和用途

Parametric ReLU函数在神经网络中用于隐藏层的激活函数,与ReLU和Leaky ReLU相比,其斜率可以通过训练过程中学习得到,具有更强的灵活性。

5.4 优点和局限性

优点:
可以通过学习得到参数a,具有更强的灵活性,可以根据任务自动调整斜率。
解决了ReLU函数输出为零和Leaky ReLU函数固定斜率的问题。
局限性:
需要额外的参数a,增加了模型的复杂度。
需要更多的计算资源和训练时间,可能导致训练过程更加复杂和耗时。

5.5 梯度消失和梯度爆炸问题

Parametric ReLU函数在输入小于零时,具有可学习的斜率,有助于避免梯度消失问题;在输入大于零时,输出的斜率为1,不会出现梯度爆炸问题。

5.6 示例和应用

隐藏层的激活函数,特别是在需要更灵活的斜率调整的情况下。
适用于需要对负值部分输出进行自适应调节的任务。

5.7 建议的使用场景

当需要更灵活的斜率调整时,可以考虑使用Parametric ReLU函数代替ReLU和Leaky ReLU函数。
当任务要求输出的负值部分具有不同的影响程度时,可以使用Parametric ReLU函数进行自适应调节。

  1. ELU函数(Exponential Linear Unit)

6.1 定义和函数形式

ELU函数是一种激活函数,其数学形式为:

其中,α是一个较小的正数,通常取为1。ELU函数结合了ReLU的优点,并且解决了ReLU函数在负数部分输出为零的问题。

6.2 手动实现并可视化

你可以使用Python代码手动实现ELU函数,并通过绘图工具将其可视化,以便理解其形状和特点。

import numpy as np
import matplotlib.pyplot as plt

def elu(x, alpha=1.0):
return np.where(x > 0, x, alpha * (np.exp(x) - 1))

x = np.linspace(-5, 5, 100)
y = elu(x)

plt.plot(x, y)
plt.title(‘ELU 大侠’)
plt.xlabel(‘Input’)
plt.ylabel(‘Output’)
plt.grid(True)
plt.show()

6.3 作用和用途

ELU函数在神经网络中作为激活函数,结合了ReLU的优点,能够加速训练,并解决了ReLU函数在负数部分输出为零的问题。

6.4 优点和局限性

优点:
在输入大于零时,ELU函数的导数始终为1,避免了ReLU函数的“神经元死亡”问题,有利于加速训练。
在输入小于等于零时,ELU函数不会输出零,解决了ReLU函数的“神经元死亡”问题,增强了模型的稳定性。
局限性:
ELU函数相对复杂,计算代价较高。

6.5 梯度消失和梯度爆炸问题

ELU函数在输入大于零时,导数恒为1,不会出现梯度消失问题;在输入小于等于零时,导数的值也较大,有利于避免梯度消失问题。

6.6 示例和应用

隐藏层的激活函数,特别是在需要加速训练和提高稳定性的情况下。
适用于需要对负值部分输出进行更灵活处理的任务。

6.7 建议的使用场景

当需要解决ReLU函数的“神经元死亡”问题时,可以考虑使用ELU函数代替。
当需要更灵活地调节负值部分输出的情况下,可以使用ELU函数进行更细致的调节。

  1. Softmax函数

7.1 定义和函数形式

Softmax函数是一种常用的激活函数,用于将向量转化为概率分布,其数学形式为:

其中,Xi 是输入向量的第i个元素,n是向量的长度。Softmax函数将输入向量的每个元素转化为一个概率值,使得所有元素的概率之和为1。

7.2 手动实现并可视化

你可以使用Python代码手动实现Softmax函数,并通过绘图工具将其可视化,以便理解其形状和特点。

import numpy as np
import matplotlib.pyplot as plt

def softmax(x):
exp_x = np.exp(x)
return exp_x / np.sum(exp_x)

示例输入向量

x = np.array([2, 1, 0.5])
print(‘Input:\n’, x)

y = softmax(x)
print(‘Softmax Output:\n’, y)

输出

7.3 作用和用途

Softmax函数常用于神经网络的多分类问题的输出层,将神经网络的输出转化为类别概率分布,便于进行分类决策。

7.4 优点和局限性

优点:
将神经网络的输出转化为概率分布,直观且易于理解。
求解简单,可用于多分类问题。
局限性:
Softmax函数对输入的敏感度较高,可能在输入较大或较小时产生数值不稳定的情况。
Softmax函数的输出受到输入的所有元素的影响,可能导致类别之间的差异不够明显。

7.5 梯度消失和梯度爆炸问题

Softmax函数的梯度通常通过交叉熵损失函数进行反向传播计算,不会出现梯度消失或梯度爆炸的问题。

7.6 示例和应用

图像分类任务中的多分类问题。
自然语言处理中的词语分类问题。

7.7 建议的使用场景

多分类问题的输出层,特别是需要将神经网络的输出解释为类别概率分布时。
当任务需要处理多个类别的情况,且类别之间没有明显的顺序关系时。

  1. Swish函数
    8.1 定义和函数形式

Swish函数是由谷歌提出的激活函数,其数学形式为:

Swish函数结合了线性性质和非线性性质,可以被视为是ReLU函数的平滑版本,一定程度上提升了模型的性能。

8.2 手动实现并可视化

你可以使用Python代码手动实现Swish函数,并通过绘图工具将其可视化,以便理解其形状和特点。

import numpy as np
import matplotlib.pyplot as plt

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

def swish(x):
return x * sigmoid(x)

x = np.linspace(-10, 10, 100)
y = swish(x)

plt.plot(x, y)
plt.title(‘Swish 大侠’)
plt.xlabel(‘Input’)
plt.ylabel(‘Output’)
plt.grid(True)
plt.show()

8.3 作用和用途

Swish函数作为一种激活函数,在神经网络中用于隐藏层的激活函数。它结合了线性性质和非线性性质,在一定程度上提升了模型的性能。

8.4 优点和局限性

优点:
Swish函数结合了ReLU函数的非线性性质和sigmoid函数的平滑性质,具有更好的性能表现。
相较于ReLU函数,Swish函数在一些情况下能够提供更好的结果。
局限性:
Swish函数相对复杂,计算代价较高,可能增加模型的训练时间和资源消耗。

8.5 梯度消失和梯度爆炸问题

Swish函数的梯度通常不会出现梯度消失或梯度爆炸的问题,但在极端情况下可能存在数值不稳定的情况。

8.6 示例和应用

在图像分类、语音识别等领域中的深度学习任务中广泛应用。

  1. Maxout函数
    9.1 定义和函数形式

Maxout函数是一种激活函数,将输入的一组实数分成若干组,然后取每组的最大值作为输出,其数学形式为:

其中,x 是输入向量,Wi 和 bi 是参数,k 是每组的大小。

9.2 通过Python代码手动实现并可视化

由于Maxout函数的实现涉及参数 w 和 b,因此在这里我们只提供一个简单的示例来说明其原理。在实际应用中,参数通常是通过神经网络的训练学习得到的。

import numpy as np

def maxout(x):
# 示例:假设有3组,每组取最大值
max_values = np.maximum(x[:, 0], x[:, 1])
max_values = np.maximum(max_values, x[:, 2])
return max_values

示例输入向量

x = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])

y = maxout(x)
print(“Maxout函数输出:”, y)

Maxout函数输出:[3 6 9]

9.3 作用和用途

Maxout函数在神经网络中常用于隐藏层的激活函数,能够提供更强的拟合能力,增强模型的表达能力。

9.4 优点和局限性

优点:
Maxout函数具有更强的拟合能力,能够处理更复杂的非线性关系。
相对于其他激活函数,Maxout函数可以通过学习参数来自适应地决定最大值的组合。
局限性:
Maxout函数的参数较多,可能增加了模型的复杂度和训练时间。
对于小数据集或者低维数据,可能会出现过拟合的情况。

9.5 梯度消失和梯度爆炸问题

Maxout函数的梯度通常通过反向传播算法进行计算,不会出现梯度消失或梯度爆炸的问题。

9.6 建议的使用场景

当需要处理复杂的非线性关系时,可以考虑使用Maxout函数作为隐藏层的激活函数。
适用于大数据集和高维数据的深度学习任务。
图像分类、语音识别等领域中的深度学习任务。

  1. Softplus函数

10.1 定义和函数形式

Softplus函数是一种激活函数,其数学形式为:

Softplus函数是ReLU函数的平滑版本,避免了ReLU在零点处不可导的问题,同时保留了ReLU函数的非线性特性。

10.2 通过Python代码手动实现并可视化

你可以使用Python代码手动实现Softplus函数,并通过绘图工具将其可视化,以便理解其形状和特点。

import numpy as np
import matplotlib.pyplot as plt

def softplus(x):
return np.log(1 + np.exp(x))

x = np.linspace(-10, 10, 100)
y = softplus(x)

plt.plot(x, y)
plt.title(‘Softplus Function’)
plt.xlabel(‘Input’)
plt.ylabel(‘Output’)
plt.grid(True)
plt.show()

10.3 作用和用途

Softplus函数常用于神经网络的隐藏层的激活函数,特别是在较深的神经网络中。它是ReLU函数的平滑版本,可以缓解梯度消失问题,同时保留了非线性特性。

10.4 优点和局限性

优点:
Softplus函数是ReLU函数的平滑版本,避免了ReLU在零点处不可导的问题。
具有较好的非线性特性,在一些深度神经网络中表现良好。
局限性:
Softplus函数的计算较复杂,可能会增加模型的训练时间。
当输入较大时,Softplus函数的输出接近线性关系,可能导致信息损失。

10.5 梯度消失和梯度爆炸问题

Softplus函数的梯度通常通过反向传播算法进行计算,相比于ReLU函数,Softplus函数的梯度在输入较小或较大时更稳定,可以缓解梯度消失和梯度爆炸问题。

10.6 建议的使用场景

当需要缓解ReLU函数在零点处不可导的问题,同时保留非线性特性时,可以考虑使用Softplus函数作为隐藏层的激活函数。
适用于较深的神经网络中,特别是在需要缓解梯度消失问题的情况下。

  1. Mish函数
    11.1 定义和函数形式

Mish函数是一种激活函数,其数学形式为:

Mish函数由印度的研究人员提出,相比ReLU函数,Mish函数在一些任务上表现更好。

11.2 通过Python代码手动实现并可视化

你可以使用Python代码手动实现Mish函数,并通过绘图工具将其可视化,以便理解其形状和特点。

import numpy as np
import matplotlib.pyplot as plt

def mish(x):
return x * np.tanh(softplus(x))

def softplus(x):
return np.log(1 + np.exp(x))

x = np.linspace(-10, 10, 100)
y = mish(x)

plt.plot(x, y)
plt.title(‘Mish Function’)
plt.xlabel(‘Input’)
plt.ylabel(‘Output’)
plt.grid(True)
plt.show()

11.3 作用和用途

Mish函数常用作神经网络的激活函数,相比ReLU函数,在一些任务上表现更好。它结合了ReLU函数、tanh函数和softplus函数的优点。

11.4 优点和局限性

优点:
Mish函数在一些任务上表现更好,相比ReLU函数具有更强的拟合能力。
结合了ReLU函数、tanh函数和softplus函数的优点,具有较好的非线性特性。
局限性:
Mish函数相对较复杂,计算代价较高,可能增加模型的训练时间。
当输入较大时,Mish函数的输出可能接近线性关系,可能导致信息损失。

11.5 梯度消失和梯度爆炸问题

Mish函数的梯度通常通过反向传播算法进行计算,相比于ReLU函数,Mish函数的梯度在输入较小或较大时更稳定,可以缓解梯度消失和梯度爆炸问题。

11.6 建议的使用场景

当需要更好的拟合能力,以及结合ReLU、tanh和softplus函数的优点时,可以考虑使用Mish函数作为隐藏层的激活函数。
适用于深度神经网络的隐藏层激活函数。
在一些任务上表现更好,例如图像分类、语音识别等领域的深度学习任务。

  1. GELU函数

12.1 定义和函数形式

GELU函数(Gaussian Error Linear Units)是一种激活函数,其数学形式为:

GELU函数由OpenAI提出,被证明在一些NLP(自然语言处理)任务上效果良好。

12.2 通过Python代码手动实现并可视化

你可以使用Python代码手动实现GELU函数,并通过绘图工具将其可视化,以便理解其形状和特点。

import numpy as np
import matplotlib.pyplot as plt

def gelu(x):
return 0.5 * x * (1 + np.tanh(np.sqrt(2 / np.pi) * (x + 0.044715 * x**3)))

x = np.linspace(-10, 10, 100)
y = gelu(x)

plt.plot(x, y)
plt.title(‘GELU Function’)
plt.xlabel(‘Input’)
plt.ylabel(‘Output’)
plt.grid(True)
plt.show()

12.3 作用和用途

GELU函数常用于深度神经网络的激活函数,特别是在一些NLP任务中表现良好。它结合了高斯分布和非线性激活函数的优点。

12.4 优点和局限性

优点:
GELU函数在一些NLP任务中表现良好,具有较好的非线性特性。
结合了高斯分布和非线性激活函数的优点,能够提升模型的性能。
局限性:
GELU函数相对复杂,计算代价较高,可能增加模型的训练时间。

12.5 梯度消失和梯度爆炸问题

GELU函数的梯度通常通过反向传播算法进行计算,相比于ReLU函数,GELU函数的梯度在输入较小或较大时更稳定,可以缓解梯度消失和梯度爆炸问题。

12.6 示例和应用

在一些NLP任务中广泛应用,例如情感分析、文本分类等。

12.7 建议的使用场景

当需要在NLP任务中获得更好的性能时,可以考虑使用GELU函数作为隐藏层的激活函数。
适用于需要较好的非线性特性的深度学习任务中。

[ 抱个拳,总个结 ]

写的内容太长
已经手抖腿软
无力总个结了
舞一段来助兴

打完收工[抱拳礼],在下全网同名[算法金]

0 基础转AI成功上岸,多个算法赛Top

[日更万日,让更多人享受智能乐趣]

  • 6
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值