激活函数小结:ReLU、ELU、Swish、GELU等

您所在的位置:网站首页 leakyrelu函数作画 激活函数小结:ReLU、ELU、Swish、GELU等

激活函数小结:ReLU、ELU、Swish、GELU等

2023-12-19 12:06| 来源: 网络整理| 查看: 265

文章目录 SigmoidTanhReLULeaky ReLUPReLUELUSoftPlus MaxoutMishSwishGELUSwiGLUGEGLU资源 激活函数是神经网络中的非线性函数,为了增强网络的表示能力和学习能力,激活函数有以下几点性质:

连续且可导(允许少数点上不可导)的非线性函数。可导的激活函数可以直接利用数值优化的方法来学习网络参数。激活函数及其导函数要尽可能的简单,有利于提高网络计算效率。激活函数的导函数的值域要在一个合适的区间内(不能太大也不能太小),否则会影响训练的效率和稳定性。 Sigmoid

Sigmoid函数(也被称为Logistic函数)的表达式如下: σ ( x ) = exp ⁡ ( x ) exp ⁡ ( x ) + exp ⁡ ( 0 ) = 1 1 + e x p ( − x ) \sigma(x)=\frac{\exp (x)}{\exp (x)+\exp (0)} = \frac {1}{1+exp(-x)} σ(x)=exp(x)+exp(0)exp(x)​=1+exp(−x)1​

其导数为 d d x σ ( x ) = σ ( x ) ( 1 − σ ( x ) ) \frac{d}{d x} \sigma(x)=\sigma(x)(1-\sigma(x)) dxd​σ(x)=σ(x)(1−σ(x))

其图像如下图,是一个S型曲线,所以Sigmoid函数可以看做一个“挤压”函数,把一个实数域的输入“挤压”到(0,1)。当输入值在0附近时,Sigmoid函数近似为线性函数;当输入值靠近两端时,对输入进行抑制;输入越小,越接近于0;输入越大,越接近于1。

在这里插入图片描述

from matplotlib import pyplot as plt import numpy as np import torch from torch import nn x = np.linspace(-6, 6, 600) m0 = nn.Sigmoid() output0 = m0(torch.Tensor(x)) plt.plot(x, output0, label='Sigmod') plt.title("Sigmoid Activation Function") plt.xlabel("x") plt.ylabel("Activation") plt.grid() plt.legend() plt.show()

Sigmoid激活函数的缺点:

倾向于梯度消失函数输出不是以0为中心,会使其后一层的神经元的输入发生偏置偏移(Bias Shift),进而使得梯度下降的收敛速度变慢,也就是会降低权重更新的效率公式中包括指数运算,计算机运行较慢 Tanh

Tanh 函数也是一种S型函数,其定义为 t a n h ( x ) = exp ⁡ ( x ) − exp ⁡ ( − x ) exp ⁡ ( x ) + exp ⁡ ( − x ) tanh(x)=\frac{\exp (x) - \exp (-x)}{\exp (x)+\exp (-x)} tanh(x)=exp(x)+exp(−x)exp(x)−exp(−x)​

Tanh函数可以看做放大并平移的Sigmoid函数,其值域为(-1,1),并且Tanh与Sigmoid函数关系如下式: t a n h ( x ) = 2 σ ( 2 x ) − 1 tanh(x) = 2 \sigma(2x) -1 tanh(x)=2σ(2x)−1 Tanh函数如下图所示,它的输入是零中心化的了。 在这里插入图片描述

x = np.linspace(-6, 6, 600) m0 = nn.Sigmoid() output0 = m0(torch.Tensor(x)) plt.plot(x, output0, label='Sigmod') m0_1 = nn.Tanh() output0_1 = m0_1(torch.Tensor(x)) plt.plot(x, output0_1, label='Tanh') plt.title("Sigmoid and Tanh Activation Functions") plt.xlabel("x") plt.ylabel("Activation") plt.grid() plt.legend() plt.show() ReLU

ReLU(Rectified Linear unit)是最常见的激活函数,其公式为: R e L U ( x ) = { x    x ≥ 0 0    x < 0 = m a x ( 0 , x ) \begin {aligned} ReLU(x) &= \begin{cases} x \ \ \qquad x \ge 0 \\ 0 \ \ \qquad xx  x>0γx  x≤0​=max(0,x)+γmin(0,x)​ γ \gamma γ是一个很小的常数,如0.01。 当 γ < 1 \gamma 0 \\ \gamma_i x \ \ \qquad x \le 0 \end{cases} \\ &= max(0, x) + \gamma_i min(0,x) \end {aligned} PReLUi​(x)​={x  x>0γi​x  x≤0​=max(0,x)+γi​min(0,x)​ 其中 γ i \gamma_i γi​为 x ≤ 0 x \le 0 x≤0时函数的斜率,所以PReLU也是非饱和函数。

如果 γ i = 0 \gamma_i=0 γi​=0,PReLU就退化为ReLU。

如果 γ i \gamma_i γi​是一个很小的常数,则PReLU就可以看作LeakyReLU。

PReLU可以允许不同神经元具有不同的参数,也可以一组神经元共享一个参数。

ELU

ELU(Exponential Linear Unit)的定义如下: E R e L U ( x ) = { x    x > 0 γ ( e x p ( x ) − 1 )    x ≤ 0 = m a x ( 0 , x ) + m i n ( 0 , γ ( e x p ( x ) − 1 ) ) \begin {aligned} EReLU(x) &= \begin{cases} x \ \ \qquad x > 0 \\ \gamma (exp(x) - 1) \ \ \qquad x \le 0 \end{cases} \\ &= max(0, x) + min(0,\gamma (exp(x) - 1)) \end {aligned} EReLU(x)​={x  x>0γ(exp(x)−1)  x≤0​=max(0,x)+min(0,γ(exp(x)−1))​ 定义中的 γ ≥ 0 \gamma \ge 0 γ≥0是一个超参数,决定 x ≤ 0 x \le 0 x≤0时的饱和曲线,并调整输出均值在0附近,所以ELU是一个近似的零中心化的非线性函数。

SoftPlus

SoftPlus可以看作ReLU函数的平滑版本,其定义为: S o f t p l u s ( x ) = l o g ( 1 + e x p ( x ) ) Softplus(x) = log(1 + exp(x)) Softplus(x)=log(1+exp(x)) SoftPlus的导数是Sigmoid函数

SoftPlus函数也有与ReLU函数一样的单侧抑制、宽兴奋边界的特性,但没有稀疏激活性。

Maxout

Maxout的输入是上一层神经元的全部原始输出,是一个向量 x = [ x 1 ; x 2 ; ⋯   , ; x D ] \mathbf{x} = [x_1;x_2;\cdots,;x_D] x=[x1​;x2​;⋯,;xD​]

每个Maxout单元有K个权重向量 w k ∈ R D \mathbf{w}_k \in \mathbb{R}^D wk​∈RD ( w k = [ w k , 1 , ⋯   , w k , D ] T \mathbf{w}_k = [w_{k, 1}, \cdots, w_{k,D}]^T wk​=[wk,1​,⋯,wk,D​]T 为第k个权重向量) 和偏置 b k ( 1 ≤ k ≤ K ) b_k(1 \le k \le K) bk​(1≤k≤K), 对于输入 x \mathbf{x} x,可以得到K个净输入 z k z_k zk​, 1 ≤ k ≤ K 1 \le k \le K 1≤k≤K: z k = w k T x + b k z_k = \mathbf{w}_k^T x + b_k zk​=wkT​x+bk​ Maxout单元的非线性函数定义为 m a x o u t ( x ) = max ⁡ k ∈ [ 1 , K ] ( z k ) maxout(\mathbf{x}) = \max_{k\in[1,K]} (z_k) maxout(x)=k∈[1,K]max​(zk​) Maxout激活函数可以看做任意凸函数的分段线性近似,并且在有限的点上是不可微的。

Mish

Mish的表达如下式 M i s h ( x ) = x ∗ t a n h ( S o f t p l u s ( x ) ) = x ∗ t a n h ( l n ( 1 + e x ) ) \begin{aligned} Mish(x) &=x∗tanh(Softplus(x)) \\ &= x*tanh(ln(1+e^x)) \end {aligned} Mish(x)​=x∗tanh(Softplus(x))=x∗tanh(ln(1+ex))​ Mish的函数图像如下图

在这里插入图片描述

m1 = nn.Mish() output1 = m1(torch.Tensor(x)) plt.plot(x, output1, label='Mish') plt.title("Mish Activation Function") plt.xlabel("x") plt.ylabel("Activation") plt.grid() plt.legend() plt.show() Swish

Swish的定义如下: s w i s h ( x ) = x σ ( β x ) = x 1 1 + e x p ( − β x ) \begin {aligned} swish(x) &= x \sigma(\beta x) \\ &= x \frac{1}{1+exp(-\beta x)} \end {aligned} swish(x)​=xσ(βx)=x1+exp(−βx)1​​ σ \sigma σ是sigmoid函数, β \beta β是可学习的参数或者一个固定超参数。 σ ( . ) ∈ ( 0 , 1 ) \sigma(.) \in (0,1) σ(.)∈(0,1) 可以看作一种软性的门控机制,当 σ ( β x ) \sigma(\beta x) σ(βx) 接近于1时,门的状态为“开”状态,激活函数的输出近似于x本身;当 σ ( β x ) \sigma(\beta x) σ(βx) 接近于0时,门的状态为“关”,激活函数的输出近似于0.

Swish函数的示意图如下图

在这里插入图片描述

x = np.linspace(-6, 6, 600) m1 = nn.SiLU() output1 = m1(torch.Tensor(x)) plt.plot(x, output1, label='Swish') plt.title("Swish Activation Function") plt.xlabel("x") plt.ylabel("Activation") plt.grid() plt.legend() plt.show() 当 β = 0 \beta=0 β=0时, Swish函数变成线性函数x/2当 β = 1 \beta=1 β=1时, Swish函数在x>0时近似线性,在x


【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3