【PyTorch】PyTorch中torch.nn模块的激活函数
PyTorch深度学习总结
第十章 PyTorch中torch.nn模块的激活函数
文章目录
- PyTorch深度学习总结
- 前言
- 一、激活函数的定义
- 二、常见的激活函数
- 1. Sigmoid函数
- 2. Tanh函数
- 3. ReLU函数
- 4. Leaky ReLU函数
- 4. Softmax函数
- 三、激活函数的选择原则
- 1.输出层激活函数选择
- 2.隐藏层激活函数选择
- 四、函数总结
前言
上文介绍torch.nn
模块中的循环层
,本文将进一步介绍torch.nn
模块中的激活函数
。
一、激活函数的定义
激活函数
是一种添加到人工神经网络中的函数,它将神经元的输入转换为输出。
在神经网络中,神经元接收到来自其他神经元的输入信号,这些信号通过加权求和后,再经过激活函数进行非线性变换,从而产生输出。
激活函数的主要作用是引入非线性因素。
如果没有激活函数,无论神经网络有多少层,其整体都是一个线性模型,只能处理线性可分的问题。
引入激活函数后,神经网络可以学习和表示更加复杂的非线性关系,从而提高模型的表达能力和泛化能力。
二、常见的激活函数
1. Sigmoid函数
公式:f(x)=11+e−xf(x)=\frac{1}{1 + e^{-x}}f(x)=1+e−x1
特点:输出范围在(0, 1)
之间,可以将输入值映射到这个区间,常用于二分类问题中作为输出层的激活函数,表示概率。
例如,在判断一张图片是否是猫的二分类任务中,输出值越接近1表示是猫的概率越大,越接近0表示不是猫的概率越大。
缺点:存在梯度消失问题,当输入值非常大或非常小时,函数的导数趋近于0,这会导致在反向传播过程中梯度变得非常小,使得网络参数更新缓慢甚至停止更新。
2. Tanh函数
公式:f(x)=ex−e−xex+e−xf(x)=\frac{e^{x}-e^{-x}}{e^{x}+e^{-x}}f(x)=ex+e−xex−e−x
特点:输出范围在(-1, 1)
之间,它是零中心化
的,这使得它在某些情况下比Sigmoid函数更具优势。
例如,在一些需要输出值有正负之分的任务中,Tanh函数可以更好地满足需求。
缺点:同样存在梯度消失问题。
3. ReLU函数
公式:f(x)=max(0,x)f(x)=\max(0, x)f(x)=max(0,x)
特点:计算简单,收敛速度快,能够有效缓解梯度消失问题。当输入大于0时,导数为1
,使得在反向传播过程中梯度能够正常传播。
例如,在深度卷积神经网络中,ReLU函数被广泛应用,大大提高了网络的训练效率。
缺点 :存在“死亡ReLU”问题,当输入值小于0时,导数为0,神经元可能会永远不会被激活,导致网络中部分神经元失效。
4. Leaky ReLU函数
公式:f(x)={x,x≥0αx,x<0f(x)=\begin{cases}x, & x\geq0\\\alpha x, & x < 0\end{cases}f(x)={x,αx,x≥0x<0
其中(α\alphaα)是一个较小的正数,如0.01。
特点:它是对ReLU函数的改进,在输入值小于0时,也有一个非零的导数
,避免了“死亡ReLU”问题。
4. Softmax函数
公式:对于一个包含 K 个元素的输入向量 z=(z1,z2,⋯,zKz_1,z_2,⋯,z_Kz1,z2,⋯,zK),Softmax 函数的输出向量σ(z)σ(z)σ(z)=(σ(z1),σ(z2),⋯,σ(zK)σ(z_1),σ(z_2),⋯,σ(z_K)σ(z1),σ(z2),⋯,σ(zK)) 中每个元素的计算公式为:
σ(zj)=ezj∑k=1Kezk\sigma(z_j)=\frac{e^{z_j}}{\sum_{k = 1}^{K}e^{z_k}}σ(zj)=∑k=1Kezkezj,其中 j=1,2,⋯,Kj = 1,2,\cdots,Kj=1,2,⋯,K
特点:它的输出可以直接解释为概率,非常适合用于多分类问题的输出层。Softmax
函数是单调递增的,即输入向量中的某个元素增大时,其对应的输出概率也会增大。Softmax
函数是可微的,这使得它可以在神经网络的训练过程中使用反向传播算法来计算梯度,从而更新模型的参数。
缺点 :Softmax
函数的计算涉及到指数运算和求和运算,当输入向量的维度 K 较大时,计算量会显著增加。由于使用了指数运算,输入向量中的异常大的值会使得对应的输出概率变得非常大,而其他值对应的概率会变得非常小。
三、激活函数的选择原则
1.输出层激活函数选择
- 如果是
二分类问题
,Sigmoid
函数通常是一个不错的选择,因为它可以将输出映射到(0, 1)之间表示概率。- 对于
多分类问题
,Softmax
函数是常用的输出层激活函数,它可以将输出转换为概率分布,所有输出值之和为1。
2.隐藏层激活函数选择
ReLU
函数及其变种(如Leaky ReLU
)由于其计算简单和缓解梯度消失的优点,在大多数情况下是隐藏层的首选激活函数。
但在一些特殊的网络结构或任务中,也可能会选择其他激活函数,如Tanh
函数在一些递归神经网络中也有应用。
四、函数总结
以下是在PyTorch中常见激活函数的总结表格:
函数名称 | 公式 | 特点 | PyTorch实现类 | 适用场景 |
---|---|---|---|---|
ReLU(Rectified Linear Unit) | f(x)=Max(0,x)f(x) = Max(0, x)f(x)=Max(0,x) | 将小于零的输入映射为0,大于等于零的输入保持不变;求导简单方便,但反向传播权值更新小于0时,会进入失活状态 | torch.nn.ReLU | 广泛用于卷积神经网络(如AlexNet)和多层感知机的隐藏层 |
Sigmoid | f(x)=11+e−xf(x)=\frac{1}{1 + e^{-x}}f(x)=1+e−x1 | 将输入值映射到(0, 1)区间,输出可看作概率;存在梯度消失问题 | torch.nn.Sigmoid | 二分类问题的输出层 |
Softmax | σ(zj)=ezj∑k=1Kezk\sigma(z_j)=\frac{e^{z_j}}{\sum_{k = 1}^{K}e^{z_k}}σ(zj)=∑k=1Kezkezj,其中 j=1,2,⋯,Kj = 1,2,\cdots,Kj=1,2,⋯,K | 将输入向量转换为概率分布,输出向量各元素和为1 | torch.nn.Softmax (可通过dim 参数指定计算维度) | 多分类问题的输出层 |
Tanh | f(x)=ex−e−xex+e−xf(x)=\frac{e^{x}-e^{-x}}{e^{x}+e^{-x}}f(x)=ex+e−xex−e−x | 将输入值映射到(-1, 1)区间,输出关于原点对称 | torch.nn.Tanh | 适用于需要输出值有正负性的场景 |