激活函数介绍

介绍

神经网络当中的激活函数用来提升网络的非线性,以增强网络的表征能力。它有这样几个特点:有界,必须为非常数,单调递增且连续可求导。我们常用的有sigmoid或者tanh,但我们都知道这两个都存在一定的缺点,有的甚至是无脑用Relu。所以今天就来学习并实现一些其他的激活函数。

下面激活函数使用的图像都是可以通过这个脚本就行修改:

import torch
import matplotlib.pyplot as plt
import torch.nn.functional as F
x = torch.linspace(-10, 10, 60)
y = F.silu(x)

plt.plot(x.numpy(), y.numpy())
plt.title('Silu Activation Function')
plt.xlabel('x')
plt.ylabel('silu(x)')
plt.grid()
plt.tight_layout()
plt.show()

SiLU

import torch
import torch.nn as nn
import torch.nn.functional as F

class SiLU(nn.Module):
    @staticmethod
    def forward(x):
        return x * torch.sigmoid(x)

if __name__=="__main__":
    m = nn.SiLU()
    input = torch.randn(2)
    output = m(input)
    print("官方实现:",output)
    n = SiLU()
    output = n(input)
    print("自定义:",output)

官方实现: tensor([ 0.2838, -0.2578])
自定义: tensor([ 0.2838, -0.2578])

Mish

import torch
import torch.nn as nn
import torch.nn.functional as F

class Mish(nn.Module):
    @staticmethod
    def forward(x):
        return x * F.softplus(x).tanh()

if __name__=="__main__":
    m = nn.Mish()
    input = torch.randn(2)
    output = m(input)
    print("官方实现:",output)
    n = Mish()
    output = n(input)
    print("自定义:",output)

官方实现: tensor([2.8559, 0.2204])
自定义: tensor([2.8559, 0.2204])

Hard-SiLU

import torch
import torch.nn as nn
import torch.nn.functional as F

class Hardswish(nn.Module):
    # Hard-SiLU activation https://arxiv.org/abs/1905.02244
    @staticmethod
    def forward(x):
        return x * F.hardtanh(x + 3, 0.0, 6.0) / 6.0

if __name__=="__main__":
    m = nn.Hardswish()
    input = torch.randn(2)
    output = m(input)
    print("官方实现:",output)
    n = Hardswish()
    output = n(input)
    print("自定义:",output)

官方实现: tensor([-0.1857, -0.0061])
自定义: tensor([-0.1857, -0.0061])

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
激活函数是神经网络中非常重要的组成部分。它的作用是将输入信号转换成输出信号,从而为网络的下一层提供输入。激活函数的选择可以影响网络的性能和训练速度。本文将详细介绍激活函数的种类、特性和应用。 1. Sigmoid函数 Sigmoid函数是最早被使用的激活函数之一,它将输入压缩到0-1之间的范围。Sigmoid函数的表达式为: $f(x)=\frac{1}{1+e^{-x}}$ Sigmoid函数具有以下特点: (1)输出值的范围在0-1之间,可以用于二分类问题的输出。 (2)当输入值很大或很小时,Sigmoid函数的梯度接近于0,这容易导致梯度消失问题。 (3)Sigmoid函数的输出不是以0为中心的,这会导致网络输出不稳定,难以收敛。 2. Tanh函数 Tanh函数是Sigmoid函数的变形,它将输入压缩到-1到1之间的范围。Tanh函数的表达式为: $f(x)=\frac{e^{x}-e^{-x}}{e^{x}+e^{-x}}$ Tanh函数具有以下特点: (1)输出值的范围在-1到1之间,可以用于多分类问题的输出。 (2)当输入值很大或很小时,Tanh函数的梯度会接近于0,这容易导致梯度消失问题。 (3)与Sigmoid函数相同,Tanh函数的输出也不是以0为中心的。 3. ReLU函数 ReLU函数是目前最常用的激活函数之一,它将负数输入输出为0,正数输入输出为输入值本身。ReLU函数的表达式为: $f(x)=max(0,x)$ ReLU函数具有以下特点: (1)ReLU函数的计算速度很快,因为它只需要判断输入是否大于0即可。 (2)ReLU函数不存在梯度消失问题,因为当输入值为正数时,梯度恒为1。 (3)ReLU函数的输出以0为中心,有助于网络的收敛。 (4)ReLU函数存在一个缺点,就是当输入为负数时,梯度为0,这被称为“死亡ReLU”问题。 4. Leaky ReLU函数 Leaky ReLU函数是对ReLU函数的改进,它在输入为负数时,输出为输入的一小部分。Leaky ReLU函数的表达式为: $f(x)=max(0.01x,x)$ Leaky ReLU函数具有以下特点: (1)Leaky ReLU函数避免了“死亡ReLU”问题。 (2)Leaky ReLU函数的输出以0为中心,有助于网络的收敛。 5. ELU函数 ELU函数是一种带指数衰减的ReLU函数,它在输入为负数时,输出为一个接近0的值。ELU函数的表达式为: $f(x)=\begin{cases}x & x>0\\ \alpha(e^{x}-1)& x\leq 0\end{cases}$ 其中,$\alpha$是一个可调的参数。 ELU函数具有以下特点: (1)ELU函数避免了“死亡ReLU”问题。 (2)ELU函数的输出以0为中心,有助于网络的收敛。 (3)ELU函数在一些数据集上比ReLU函数表现更好。 6. Softplus函数 Softplus函数是Sigmoid函数的变形,它将输入压缩到0到正无穷之间的范围。Softplus函数的表达式为: $f(x)=ln(1+e^{x})$ Softplus函数具有以下特点: (1)Softplus函数的输出值在0到正无穷之间,可以用于回归问题的输出。 (2)Softplus函数的输出以0为中心,有助于网络的收敛。 (3)与Sigmoid函数相同,Softplus函数存在梯度消失问题。 7. Swish函数 Swish函数是一种新的激活函数,它将输入进行sigmoid变换,然后与输入相乘。Swish函数的表达式为: $f(x)=x\sigma(\beta x)$ 其中,$\sigma$是Sigmoid函数,$\beta$是一个可调的参数。 Swish函数具有以下特点: (1)Swish函数在一些数据集上比ReLU函数表现更好。 (2)Swish函数的输出以0为中心,有助于网络的收敛。 (3)Swish函数可以通过调整$\beta$参数来控制激活函数的形状。 8. Hard Tanh函数 Hard Tanh函数是Tanh函数的变形,它将输入压缩到-1到1之间的范围,并将输出限制在该范围内。Hard Tanh函数的表达式为: $f(x)=\begin{cases}1 & x>1\\ -1 & x<-1\\ x & -1\leq x\leq 1\end{cases}$ Hard Tanh函数具有以下特点: (1)Hard Tanh函数的输出范围在-1到1之间,可以用于多分类问题的输出。 (2)Hard Tanh函数不存在梯度消失问题。 (3)Hard Tanh函数的输出以0为中心,有助于网络的收敛。 9. Softmax函数 Softmax函数是一种用于多分类问题的激活函数,它将输入转换成概率分布。Softmax函数的表达式为: $f(x_{i})=\frac{e^{x_{i}}}{\sum_{j=1}^{K}e^{x_{j}}}$ 其中,$K$是类别数。 Softmax函数具有以下特点: (1)Softmax函数将输出转换成概率分布,可以用于多分类问题的输出。 (2)Softmax函数的输出归一化,总和为1。 (3)Softmax函数的输出与其他类别的输出相互影响,需要注意。 总结 激活函数是神经网络中非常重要的组成部分,它可以将输入信号转换成输出信号,并为网络的下一层提供输入。不同的激活函数具有不同的特点和适用范围,选择合适的激活函数可以提高网络的性能和训练速度。在实际应用中,需要根据具体问题的特点和数据集的情况选择合适的激活函数

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏天是冰红茶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值