PyTorch——激活函数

参考链接

  1. https://mp.weixin.qq.com/s/irha7DB2l0GfdAJdsPXlMA
  2. https://pytorch.org/docs/stable/nn.html#non-linear-activations-weighted-sum-nonlinearity
  3. https://pytorch.org/docs/stable/nn.html#non-linear-activations-other
  4. https://zhuanlan.zhihu.com/p/88429934?from_voters_page=true

sigmoid

函数表达式

s i g m o i d ( x ) = σ ( x ) = 1 1 + e − x sigmoid\left ( x\right )=\sigma \left ( x\right )=\frac{1}{1+e^{-x}} sigmoid(x)=σ(x)=1+ex1

图像

PyTorch——激活函数_第1张图片

优点

(1)便于求导的平滑函数

(2)能压缩数据,保证数据幅度不会有问题

(3)用于将预测概率作为输出的模型。由于概率的取值范围是 0 到 1,因此 Sigmoid 函数非常合适

缺点

(1)容易出现梯度消失(gradient vanishing)的现象:当激活函数接近饱和区时,变化太缓慢,导数接近0,根据后向传递的数学依据是微积分求导的链式法则,当前导数需要之前各层导数的乘积,几个比较小的数相乘,导数结果很接近0,从而无法完成深层网络的训练。

(2)Sigmoid的输出不是0均值的:这会导致后层的神经元的输入是非0均值的信号,这会降低权重更新的效率。

(3)幂运算相对耗时

代码示例

m = nn.Sigmoid()
input = torch.randn(2)
output = m(input)

tanh

函数表达式

T a n h ( x ) = t a n h ( x ) = 2 1 + e − 2 x − 1 Tanh\left ( x\right )=tanh\left ( x\right )=\frac{2}{1+e^{-2x}}-1 Tanh(x)=tanh(x)=1+e2x21

图像

PyTorch——激活函数_第2张图片

优点

tanh函数将输出值映射到了-1到1之间,因此它是0均值的

缺点

(1)容易出现梯度消失(gradient vanishing)的现象
(2)幂运算相对耗时

注:在一般的二元分类问题中,tanh 函数用于隐藏层,而 sigmoid 函数用于输出层,但这并不是固定的,需要根据特定问题进行调整。

代码示例

m = nn.Tanh()
input = torch.randn(2)
output = m(input)

relu

函数表达式

R e L U ( x ) = ( x ) + = m a x ( 0 , x ) ReLU\left ( x\right )=\left ( x\right )^{+}=max\left ( 0,x\right ) ReLU(x)=(x)+=max(0,x)

图像

PyTorch——激活函数_第3张图片

优点

(1)收敛速度比sigmoid和tanh快(梯度不会饱和,解决了梯度消失问题)

(2)计算复杂度低,不需要进行指数运算

缺点

(1)ReLU 函数不是以 0 为中心的函数

(2)Dead ReLU Problem(神经元坏死现象):某些神经元可能永远不会被激活,导致相应参数不会被更新(在负数部分,梯度为0)。产生这种现象的两个原因:参数初始化问题;learning rate太高导致在训练过程中参数更新太大。解决办法:采用Xavier初始化方法;以及避免将learning rate设置太大或使用adagrad等自动调节learning rate的算法。

(3)ReLu不会对数据做幅度压缩,所以数据的幅度会随着模型层数的增加不断扩张。

代码示例

m = nn.ReLU()
input = torch.randn(2)
utput = m(input)

LeakyReLU

函数表达式

L e a k y R e L U ( x ) = m a x ( 0 , x ) + n e g a t i v e _ s l o p e × m i n ( 0 , x ) LeakyReLU\left ( x\right )=max\left ( 0,x\right )+negative\_slope\times min\left ( 0,x\right ) LeakyReLU(x)=max(0,x)+negative_slope×min(0,x)

图像

PyTorch——激活函数_第4张图片

优点

(1)LeakyReLU通过把x的非常小的线性分量给予负输入来调整负值的零梯度(zero gradients)问题

(2)leak有助于扩大ReLU函数的范围,通常 n e g a t i v e _ s l o p e negative\_slope negative_slope的值为0.01左右

(3)Leaky ReLU 的函数范围是负无穷到正无穷

代码示例

m = nn.LeakyReLU(0.1)
input = torch.randn(2)
output = m(input)

ELU

函数表达式

E L U ( X ) = { x if  x > 0 α ∗ ( e x − 1 ) if  x ⩽ 0 ELU\left ( X\right )=\begin{cases} x & \text{if}\ x> 0 \\ \alpha \ast \left ( e^{x}-1\right ) & \text{if}\ x\leqslant 0 \end{cases} ELU(X)={xα(ex1)if x>0if x0

图像

PyTorch——激活函数_第5张图片

优点

(1)没有Dead ReLU问题,输出的平均值接近0,以0为中心;

(2)ELU通过减少偏置偏移的影响,使正常梯度更接近于单位自然梯度,从而使均值向零加速学习;

(3)ELU在较小的输入下会饱和至负值,从而减少前向传播的变异和信息。

缺点

它的计算强度更高。与Leaky ReLU类似,尽管理论上比ReLU要好,但目前在实践中没有充分的证据表明ELU总是比ReLU好。

代码示例

m = nn.ELU()
input = torch.randn(2)
output = m(input)

PReLU

函数表达式

P R e L U ( x ) = m a x ( 0 , x ) + a ∗ m i n ( 0 , x ) PReLU\left ( x\right )=max\left ( 0,x\right )+a\ast min\left ( 0,x\right ) PReLU(x)=max(0,x)+amin(0,x)

图像

PyTorch——激活函数_第6张图片

优点

(1)在负值域,PReLU的斜率较小,这也可以避免Dead ReLU问题。

(2)与ELU相比,PReLU 在负值域是线性运算。尽管斜率很小,但不会趋于0。

代码示例

m = nn.PReLU()
input = torch.randn(2)
output = m(input)

softmax

函数表达式

S o f t m a x ( x i ) = e x p ( x i ) ∑ j e x p ( x j ) Softmax\left ( x_{i}\right )=\frac{exp\left ( x_{i}\right )}{\sum_{j}^{}exp\left ( x_{j}\right )} Softmax(xi)=jexp(xj)exp(xi)

优点

(1)Softmax是用于多类分类问题的激活函数,在多类分类问题中。对于长度为K的任意实向量,Softmax可以将其压缩为长度为K,值在(0,1)范围内,并且向量中元素的总和为1的实向量。

(2)Softmax与正常的max函数不同:max函数仅输出最大值,但Softmax确保较小的值具有较小的概率,并且不会直接丢弃。

(3)Softmax函数的分母结合了原始输出值的所有因子,这意味着Softmax函数获得的各种概率彼此相关。

代码示例

m = nn.Softmax(dim=1)
input = torch.randn(2, 3)
output = m(input)

softplus

函数表达式

S o f t p l u s ( x ) = 1 β ∗ l o g ( 1 + e x p ( β ∗ x ) ) Softplus\left ( x\right )=\frac{1}{\beta }\ast log\left ( 1+exp\left ( \beta \ast x\right )\right ) Softplus(x)=β1log(1+exp(βx))

图像

PyTorch——激活函数_第7张图片

特点

Softplus函数类似于ReLU函数,但是相对较平滑,像ReLU一样是单侧抑制。

代码示例

m = nn.Softplus()
input = torch.randn(2)
output = m(input)

你可能感兴趣的:(PyTorch,深度学习,神经网络,pytorch,激活函数,activation)