深度学习 - 激活函数

激活函数(Activation Function)是神经网络中的关键组件,用于引入非线性,使得网络能够学习和表示复杂的模式和关系。以下是几种常见的激活函数及其详细解释:

1. Sigmoid(S型激活函数)

作用过程
Sigmoid 函数将输入映射到 (0, 1) 之间。公式为:
σ ( x ) = 1 1 + e − x \sigma(x) = \frac{1}{1 + e^{-x}} σ(x)=1+ex1
Sigmoid 将大负数映射到接近 0,大正数映射到接近 1,中间值映射到 0.5 附近。

优点

  • 输出在 (0, 1) 之间,有明确的边界,适合处理概率问题。
  • 平滑且连续,易于计算导数。

缺点

  • 梯度消失问题:当输入非常大或非常小时,梯度接近零,导致参数更新缓慢。
  • 输出非零均值:输出范围是正数,导致后续层的输入非零均值,这可能导致训练不稳定。

适用场景

  • 输出需要概率的场景,如二分类问题的输出层。

实际案例
在二分类问题中,例如垃圾邮件分类,Sigmoid 函数常用于输出层,将神经网络的输出映射为概率值。

代码实现

import torch
import torch.nn as nn
import matplotlib.pyplot as plt

x = torch.linspace(-10, 10, 100)
sigmoid = nn.Sigmoid()
y = sigmoid(x)

plt.plot(x.numpy(), y.detach().numpy())
plt.title("Sigmoid Activation Function")
plt.xlabel("Input")
plt.ylabel("Output")
plt.grid(True)
plt.show()
2. ReLU(Rectified Linear Unit)

作用过程
ReLU 函数将输入中小于零的部分置为零,其余部分保持不变。公式为:
ReLU ( x ) = max ⁡ ( 0 , x ) \text{ReLU}(x) = \max(0, x) ReLU(x)=max(0,x)

优点

  • 计算简单且高效,只需比较和赋值。
  • 缓解梯度消失问题:只要输入为正,梯度恒为 1,确保反向传播时梯度不会消失。

缺点

  • Dying ReLU 问题:如果输入始终为负,神经元将永远不激活,导致部分神经元永远不起作用。

适用场景

  • 隐藏层的首选激活函数,广泛应用于各类神经网络。

实际案例
在图像分类任务中,ReLU 常用于卷积神经网络(CNN)的隐藏层,因其高效的计算特性。

代码实现

relu = nn.ReLU()
y = relu(x)

plt.plot(x.numpy(), y.detach().numpy())
plt.title("ReLU Activation Function")
plt.xlabel("Input")
plt.ylabel("Output")
plt.grid(True)
plt.show()
3. Leaky ReLU

作用过程
Leaky ReLU 在 ReLU 的基础上引入了一个小的斜率,使得负输入也有一个小的输出,公式为:
Leaky ReLU ( x ) = max ⁡ ( 0.01 x , x ) \text{Leaky ReLU}(x) = \max(0.01x, x) Leaky ReLU(x)=max(0.01x,x)

优点

  • 解决 Dying ReLU 问题:负输入仍有非零输出,确保神经元不完全死亡。

缺点

  • 引入了额外的参数,计算复杂度稍高于 ReLU。

适用场景

  • 需要避免 Dying ReLU 的场景,尤其是在深度神经网络中。

实际案例
在深度卷积神经网络(如 ResNet)中,Leaky ReLU 可以用于各层之间,以防止神经元失活。

代码实现

leaky_relu = nn.LeakyReLU(0.01)
y = leaky_relu(x)

plt.plot(x.numpy(), y.detach().numpy())
plt.title("Leaky ReLU Activation Function")
plt.xlabel("Input")
plt.ylabel("Output")
plt.grid(True)
plt.show()
4. Tanh(双曲正切函数)

作用过程
Tanh 函数将输入映射到 (-1, 1) 之间,公式为:
tanh ⁡ ( x ) = e x − e − x e x + e − x \tanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}} tanh(x)=ex+exexex

优点

  • 输出零均值:输出在 (-1, 1) 之间,有助于收敛速度的提升。

缺点

  • 梯度消失问题:与 Sigmoid 类似,当输入非常大或非常小时,梯度接近零。

适用场景

  • 希望输出有负值的情况,例如 RNN 的隐藏层。

实际案例
在自然语言处理任务中,Tanh 常用于 RNN 的隐藏层,因为其输出具有零均值特性,有助于序列数据的建模。

代码实现

tanh = nn.Tanh()
y = tanh(x)

plt.plot(x.numpy(), y.detach().numpy())
plt.title("Tanh Activation Function")
plt.xlabel("Input")
plt.ylabel("Output")
plt.grid(True)
plt.show()
5. Softmax

作用过程
Softmax 函数将输入转换为概率分布,总和为 1,适用于多分类问题,公式为:
Softmax ( x i ) = e x i ∑ j e x j \text{Softmax}(x_i) = \frac{e^{x_i}}{\sum_{j} e^{x_j}} Softmax(xi)=jexjexi

优点

  • 输出为概率分布,适合多分类任务。
  • 保证输出和为 1,便于概率解释。

缺点

  • 数值不稳定:对于大数值输入,可能导致溢出。

适用场景

  • 多分类问题的输出层,例如图像分类任务中的类别概率预测。

实际案例
在 ImageNet 图像分类任务中,Softmax 常用于最后一层,将网络输出转换为各类别的概率。

代码实现

softmax = nn.Softmax(dim=0)
y = softmax(x)

plt.plot(x.numpy(), y.detach().numpy())
plt.title("Softmax Activation Function")
plt.xlabel("Input")
plt.ylabel("Output")
plt.grid(True)
plt.show()

常见问题及解决方案

  1. 梯度消失

    • 问题:当激活函数的梯度趋近于零时,神经网络的训练速度变得极慢。
    • 解决方案:使用 ReLU 或其变体(如 Leaky ReLU)来缓解梯度消失问题。
  2. Dying ReLU

    • 问题:ReLU 中的一些神经元可能会永久性地输出零。
    • 解决方案:使用 Leaky ReLU 或 Parametric ReLU 来避免神经元死亡。
  3. 数值不稳定

    • 问题:在计算 Softmax 或其他激活函数时,可能会出现数值溢出或下溢。
    • 解决方案:在计算 Softmax 时使用数值稳定技巧,例如减去输入中的最大值。
  4. 训练不稳定

    • 问题:某些激活函数可能导致训练过程中的不稳定性。
    • 解决方案:对输入数据进行标准化,或在网络中使用 Batch Normalization。
  5. 慢收敛

    • 问题:激活函数的选择可能导致训练过程收敛缓慢。
    • 解决方案:尝试不同的激活函数,并调整学习率和优化器参数。

激活函数汇总

激活函数汇总表格
激活函数公式优点缺点适用场景
Sigmoid σ ( x ) = 1 1 + e − x \sigma(x) = \frac{1}{1 + e^{-x}} σ(x)=1+ex1输出在 (0, 1) 之间,适合处理概率问题,平滑且连续,易于计算导数梯度消失问题,输出非零均值,导致训练不稳定输出需要概率的场景,如二分类问题的输出层
ReLU ReLU ( x ) = max ⁡ ( 0 , x ) \text{ReLU}(x) = \max(0, x) ReLU(x)=max(0,x)计算简单且高效,缓解梯度消失问题Dying ReLU 问题,如果输入始终为负,神经元将永远不激活隐藏层的首选激活函数,广泛应用于各类神经网络
Leaky ReLU Leaky ReLU ( x ) = max ⁡ ( 0.01 x , x ) \text{Leaky ReLU}(x) = \max(0.01x, x) Leaky ReLU(x)=max(0.01x,x)解决 Dying ReLU 问题,负输入仍有非零输出引入了额外的参数,计算复杂度稍高于 ReLU需要避免 Dying ReLU 的场景,尤其是在深度神经网络中
Tanh tanh ⁡ ( x ) = e x − e − x e x + e − x \tanh(x) = \frac{e^x - e^{-x}}{e^x + e^{-x}} tanh(x)=ex+exexex输出零均值,有助于收敛速度的提升梯度消失问题,与 Sigmoid 类似,当输入非常大或非常小时,梯度接近零希望输出有负值的情况,例如 RNN 的隐藏层
Softmax Softmax ( x i ) = e x i ∑ j e x j \text{Softmax}(x_i) = \frac{e^{x_i}}{\sum_{j} e^{x_j}} Softmax(xi)=jexjexi输出为概率分布,适合多分类任务,保证输出和为 1,便于概率解释数值不稳定,对于大数值输入,可能导致溢出多分类问题的输出层,例如图像分类任务中的类别概率预测
具体效果及常见问题总结
激活函数具体效果常见问题及解决方案
Sigmoid训练速度较慢,梯度消失问题显著,适用于输出层概率预测。梯度消失:使用 ReLU 或其他激活函数。训练不稳定:标准化输入数据。慢收敛:调整学习率。
ReLU通常能提供较好的训练效果和模型性能,但可能会遇到 Dying ReLU 问题。Dying ReLU:使用 Leaky ReLU 或 Parametric ReLU。输出不平衡:使用 Batch Normalization。过拟合:应用正则化技术。
Leaky ReLU有效解决 Dying ReLU 问题,训练更稳定,适用于深层网络。斜率选择:通过实验选择合适的负斜率。过拟合:应用正则化。不稳定梯度:使用 Batch Normalization。
Tanh比 Sigmoid 更常用,输出零均值有助于收敛,但深层网络中仍可能遇到梯度消失问题。梯度消失:使用 ReLU 或其他激活函数。训练不稳定:标准化输入数据。慢收敛:调整学习率。
Softmax多分类任务中非常有效,将输出转换为概率分布,但需要注意数值稳定性问题。数值不稳定:使用数值稳定技巧如减去最大值。梯度消失:减少层数或使用其他激活函数。过拟合:应用正则化技术。
激活函数全称
激活函数英文全称中文翻译
SigmoidSigmoid Activation FunctionS型激活函数
ReLURectified Linear Unit修正线性单元
Leaky ReLULeaky Rectified Linear Unit带泄露的修正线性单元
TanhHyperbolic Tangent Function双曲正切函数
SoftmaxSoftmax Activation FunctionSoftmax激活函数

更多问题咨询

CosAI

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部