常用的激活函数

文章目录

  • 1.激活函数的定义和作用
  • 2.激活函数的分类
    • 2.1饱和函数:
      • 2.1.1优点
      • 2.1.2缺点
    • 2.2不饱和函数:
      • 2.2.1优点
      • 2.2.2缺点
  • 3.Sigmoid函数
    • 3.1 公式
    • 3.2 Sigmoid函数在深度学习中可以在以下情况下使用
    • 3.3 对应pytorch的代码
  • 4.Tanh函数
    • 4.1 公式
    • 4.2 Tanh函数在深度学习中可以在以下情况下使用
    • 4.3 对应pytorch的代码
  • 5.ReLU函数
    • 5.1 公式
    • 5.2ReLU函数在深度学习中可以在以下情况下使用
    • 5.3 对应pytorch代码
  • 6.Softmax函数
    • 6.1 公式
    • 6.2 Softmax函数在深度学习中可以在以下情况下使用
    • 6.3对应pytorch的代码
  • 7.小结

1.激活函数的定义和作用

激活函数(Activation Function)是一种添加到人工神经网络中的函数。其主要作用是对所有的隐藏层和输出层添加一个非线性的操作,使得神经网络的输出更为复杂、表达能力更强。如果没有激活函数,那么再多层的神经网络也只能处理线性可分问题。

2.激活函数的分类

激活函数能分成两类——饱和激活函数和非饱和激活函数
饱和函数定义:当输入接近无穷大或无穷小时,函数值趋于一个固定的值,同时导数趋于0的函数。典型的饱和函数包括Sigmoid函数Tanh函数。而ReLU函数以及它的变体函数,还有Softmax函数都属于不饱和函数。

2.1饱和函数:

2.1.1优点

1.平滑性:饱和函数通常具有平滑的特性,这使得它们在神经网络的训练过程中更容易优化。
2.可解释性:饱和函数通常具有较简单的数学形式,因此对于解释模型行为和结果有一定帮助。
3.归一化输出:饱和函数通常将输入映射到一个有限的范围内,比如Sigmoid函数将输入映射到(0,1)之间,Tanh函数将输入映射到(-1,1)之间,这有助于输出的归一化。

2.1.2缺点

1.梯度消失:在深层神经网络中,当使用饱和函数作为激活函数时,可能会出现梯度消失的问题,导致训练过程变得困难。
2.非零中心化:一些饱和函数(如Sigmoid和Tanh)在输入接近零时并不是零中心化的,这可能导致网络权重更新不稳定。
3.输出限制:饱和函数的输出范围是有限的,这可能导致某些情况下无法适应输入的变化范围,限制了模型的表达能力。

2.2不饱和函数:

2.2.1优点

1.解决梯度消失问题:相比于一些饱和函数,不饱和函数具有更大的梯度,这有助于减轻梯度消失问题,使得在深层神经网络中更容易进行训练。原因有:
非饱和性质:在深度神经网络中,激活函数是非饱和的意味着它们在输入的某个范围内能够保持较大的梯度。相比之下,一些饱和函数(如Sigmoid、Tanh)在极端值附近会变得很平坦,导致梯度接近于零,从而造成梯度消失。而非饱和函数(如ReLU)在正区间具有恒定的梯度,可以避免梯度消失问题。
2.稀疏激活性:ReLU激活函数在负数输入时输出为零,这意味着它可以实现稀疏激活性,使得网络中的部分神经元保持静止状态,也就是处于非激活状态,从而减少减少了网络的冗余性,有助于提高模型的泛化能力和过拟合的风险。
3.计算效率高:ReLU函数计算非常简单,只需判断输入是否大于零,因此在实际应用中具有较高的计算效率。

2.2.2缺点

1.Dead ReLU问题:当ReLU函数的输入为负时,输出恒为零,这可能导致部分神经元永远不会被激活,称为“死亡ReLU”,影响模型的表达能力。
2.非线性但不平滑:ReLU是非线性函数,但在零点处不可导,因此在反向传播过程中可能出现梯度不稳定的情况。
3.不适用于所有情况:对于一些问题,如回归任务或存在负数输入的情况,ReLU可能不太适用,因为它将所有负数输入都映射为零,信息丢失较多。
下面介绍几种常用的激活函数:

3.Sigmoid函数

3.1 公式

sigmoid函数将输入变换为(0,1)上的输出。它将范围(-inf,inf)中的任意输入压缩到区间(0,1)中的某个值:
Sigmoid函数公式、原图、导数图像

3.2 Sigmoid函数在深度学习中可以在以下情况下使用

二分类问题:Sigmoid函数的输出范围在 0 到 1 之间,可以被解释为概率值,因此适合用于解决二分类问题。在输出层使用Sigmoid函数,可以将神经网络的输出解释为样本属于某一类的概率。

输出需要映射到特定范围:当神经网络的输出需要映射到一个特定的范围时,可以考虑使用Sigmoid函数。例如,某些回归问题中需要将输出限制在 0 到 1 之间,这时可以使用Sigmoid函数对输出进行映射。

输入数据归一化:在某些情况下,Sigmoid函数可以用于对输入数据进行标准化或归一化,将输入数据映射到 0 到 1 之间,有助于神经网络的训练和收敛。

虽然Sigmoid函数在上述情况下有其适用性,但随着深度学习的发展,ReLU等激活函数在实际应用中更为普遍,因为它们能够更好地解决梯度消失问题,并且具有更快的计算速度。因此,在实际应用中,除非特定场景需要,否则在隐藏层通常会优先选择ReLU或其变种作为激活函数。

3.3 对应pytorch的代码

import torch

# 定义输入张量
input = torch.randn(2)

# 使用 PyTorch 提供的 Sigmoid 函数
output = torch.sigmoid(input)

print("原始值:")
print(input)
print("经过Sigmoid函数处理后的结果:")
print(output)

输出的结果:
在这里插入图片描述

4.Tanh函数

4.1 公式

与sigmoid函数类似,tanh函数也能将其输入压缩转换到区间(-1,1)上,tanh函数的公式如下:
在这里插入图片描述

4.2 Tanh函数在深度学习中可以在以下情况下使用

隐藏层激活函数:Tanh 函数常被用作神经网络隐藏层的激活函数,它能将输入值映射到范围 [-1, 1] 内,相比于 Sigmoid 函数,Tanh 函数的输出均值为 0,能够更快地收敛。

输出层激活函数:在某些情况下,Tanh 函数也可以用作神经网络输出层的激活函数,特别是对于回归任务中的输出层,因为 Tanh 函数的输出范围是有界的。

长短期记忆(LSTM)中的门控单元:在循环神经网络(RNN)的变种 LSTM 中,Tanh 函数通常被用于门控单元的激活函数,帮助网络学会长期依赖性。

特征缩放:Tanh 函数也可以用于对特征进行缩放和归一化,将特征值映射到 [-1, 1] 范围内。

总的来说,Tanh 函数在深度学习中被广泛使用,尤其是在神经网络的隐藏层中,它可以帮助网络学习非线性特征,并且在一定程度上缓解了梯度消失问题。

4.3 对应pytorch的代码

import torch

# 创建一个张量
x = torch.randn(3)
print("原始张量:")
print(x)

# 使用tanh函数
y = torch.tanh(x)
print("\n应用Tanh函数后的张量:")
print(y)

# 输出tanh函数的反函数得到原始值
recover_x = torch.atanh(y)
print("\n使用反Tanh函数还原的原始张量:")
print(recover_x)

输出的结果:

在这里插入图片描述

5.ReLU函数

5.1 公式

ReLU(x)=max(x,0)
在这里插入图片描述

5.2ReLU函数在深度学习中可以在以下情况下使用

隐藏层的激活函数:ReLU函数通常被用作隐藏层的激活函数,因为它能够有效地解决梯度消失问题,加速网络的训练过程并提高模型的泛化能力。

加速收敛:由于ReLU函数在正数输入时梯度恒为1,可以加速梯度的传播和参数的更新,从而加快神经网络的收敛速度。

稀疏激活性:ReLU函数在负数输入时输出为零,可以使网络中的部分神经元处于非激活状态,有助于减少网络参数、降低过拟合风险,并提高模型的泛化能力。

前向传播的速度:由于ReLU函数的计算简单,只需要比较输入是否大于零即可,因此在前向传播过程中具有较快的速度,适合处理大规模数据和深层网络。

总的来说,ReLU函数在深度学习中是一种性能优秀且常用的激活函数,特别适用于解决梯度消失问题加速网络训练提高泛化能力等情况下的隐藏层激活函数选择。在实际应用中,ReLU函数通常是第一选择,但也需要根据具体问题的特点和实验结果进行调参和选择最优的激活函数。

5.3 对应pytorch代码

import torch
import torch.nn as nn

# 创建一个输入张量
input_tensor = torch.randn(1, 10)  # 假设输入张量的大小为(1, 10)

# 创建ReLU激活函数模块
relu = nn.ReLU()

# 对输入张量应用ReLU激活函数
output = relu(input_tensor)

print("原始值:", input_tensor)
print("经过ReLU激活函数处理后的值:", output)

输出的结果:
在这里插入图片描述

6.Softmax函数

6.1 公式

在深度学习中,Softmax函数是一个常用的激活函数,通常用于多分类问题中。Softmax函数可以将一个K维的实数向量(K个类别的得分)映射为一个概率分布,使得每个类别的概率值在0到1之间,并且所有类别的概率之和为1。在多分类网络中,常用 Softmax 作为最后一层进行分类。

在这里插入图片描述
在这里插入图片描述

6.2 Softmax函数在深度学习中可以在以下情况下使用

多分类问题:Softmax函数通常用于多分类问题中,可以将神经网络输出的原始得分转化为各个类别的概率分布,从而进行分类预测。

神经网络的输出层:在神经网络的输出层中,Softmax函数常用于将原始的网络输出转换为各类别的概率值,以便进行分类任务的决策。

交叉熵损失函数:与Softmax函数结合使用的常见损失函数是交叉熵损失函数(Cross Entropy Loss),这种组合在训练分类模型时非常常见。

多标签分类问题:对于多标签分类问题,可以使用Sigmoid函数,但也可以通过Softmax函数处理每个类别的得分,然后应用阈值来决定每个类别的输出。

总的来说,Softmax函数在深度学习中主要用于多分类问题,特别是在神经网络的输出层中,以及与交叉熵损失函数配合使用进行模型训练。

6.3对应pytorch的代码

import torch
import torch.nn.functional as F

# 创建一个输入张量
input_tensor = torch.randn(1, 10)  # 假设输入张量的大小为(1, 10)

# 使用PyTorch中的softmax函数计算Softmax值
output = F.softmax(input_tensor, dim=1)

print("原始值:", input_tensor)
print("经过Softmax函数处理后的概率分布:", output)

输出的结果:
在这里插入图片描述

7.小结

在搭建神经网络时,选择合适的激活函数是非常重要的:

ReLU (Rectified Linear Unit):ReLU是最常用的激活函数之一。ReLU函数解决了梯度消失问题,同时计算简单高效,在大多数情况下都能取得良好的效果。但是,有时候会出现神经元"死亡"的问题,即某些神经元永远不会被激活。适用于回归任务,卷积神经网络隐藏层。

Leaky ReLU:Leaky ReLU是对ReLU的改进,克服了ReLU函数中负数部分导致的神经元失活问题。适用于回归任务,卷积神经网络隐藏层。

Sigmoid函数:Sigmoid函数将输入映射到(0, 1)之间,常用于输出层的二分类问题,也可以用于隐藏层。然而,Sigmoid函数容易出现梯度消失的问题,并且不是零中心的。适用于二分类任务输出层,模型隐藏层。

Tanh函数:Tanh函数将输入映射到(-1, 1)之间,类似于Sigmoid函数但输出范围更广。Tanh函数在某些情况下表现比Sigmoid函数更好,但也会出现梯度消失的问题。适用于二分类任务输出层,模型隐藏层。

Softmax函数:Softmax函数通常用于多分类问题的输出层,将原始得分转化为概率分布。适用于多分类任务输出层。

  • 23
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值