激活函数(1)笔记

ReLU函数

最受欢迎的激活函数是修正线性单元(Rectified linear unit,ReLU),因为它实现简单,同时在各种预测任务中表现良好。ReLU提供了一种非常简单的非线性变换。
在这里插入图片描述
在这里插入图片描述

# 导入PyTorch库  
import torch

# 从d2l库中导入与PyTorch相关的模块(这里假设d2l是一个外部库或教程中定义的库)  
from d2l import torch as d2l

# 创建一个一维的tensor x,包含从-5到4.9(步长为0.1)的浮点数,并设置requires_grad=True以支持自动求导  
# 这意味着我们稍后可以对这个tensor进行反向传播以计算梯度  
x = torch.arange(-5, 5, 0.1, requires_grad=True)

# 使用PyTorch的relu函数计算x的ReLU激活值,结果存储在y中  
# ReLU函数是一个非线性函数,其定义为f(x) = max(0, x)  
y = torch.relu(x)

# 使用d2l库中的plot函数绘制x和y的图像。这里x和y都被detach()以避免梯度跟踪  
# 因为我们只是想绘制图像,而不需要计算关于这些值的梯度  
# 'x'和'relu(x)'分别是x轴和y轴的标签  
# figsize参数设置了图像的大小为宽5英寸,高4英寸  
d2l.plot(x.detach(), y.detach(), 'x', 'relu(x)', figsize=(5, 4))

# 显示图像。这里假设d2l库有一个plt模块,它可能是对matplotlib.pyplot的封装或别名  
# 如果d2l库没有plt模块,你可能需要直接使用matplotlib.pyplot.show()  
d2l.plt.show()

# 这里,我们对y进行反向传播,以计算x的梯度  
# 因为y是ReLU函数的结果,而x是ReLU函数的输入  
# 我们用torch.ones_like(x)来创建一个与x形状相同且所有元素都为1的张量作为反向传播的梯度输入  
# 这样做是为了确保所有有效的x值(即x>0)的梯度都为1  
# retain_graph=True表示在反向传播后保留计算图,以便我们可以再次进行反向传播(虽然这里我们并没有再次使用)  
y.backward(torch.ones_like(x), retain_graph=True)

# 使用d2l库中的plot函数绘制x和x.grad的图像。这里x.grad是x关于y的梯度  
# 因为ReLU函数在x>0时导数为1,在x<=0时导数为0,所以这里绘制的其实是ReLU函数的导数的图像  
# 'x'和'grad(relu)'分别是x轴和y轴的标签  
# figsize参数设置了图像的大小为宽5英寸,高4英寸  
d2l.plot(x.detach(), x.grad, 'x', 'grad(relu)', figsize=(5, 4))

# 显示图像  
d2l.plt.show()

在这里插入图片描述
在这里插入图片描述
优点:

  • 计算简单且高效:ReLU函数是一个分段线性函数,当输入大于0时,其输出就是输入本身;当输入小于或等于0时,输出为0。这使得ReLU函数的计算非常快速且高效。
  • 缓解梯度消失问题:在sigmoid和tanh等饱和激活函数中,当输入值很大或很小时,梯度接近于0,这会导致在反向传播过程中,梯度逐渐减小,直至消失。而ReLU函数在输入大于0的区域内,梯度始终为1,这有助于缓解梯度消失问题,使模型更容易训练。
  • 稀疏性:ReLU函数在输入小于或等于0时输出为0,这有助于产生稀疏的激活值,即网络中只有一部分神经元处于激活状态。稀疏性有助于减少计算量,并提高模型的泛化能力。
  • 符合生物神经元的特性:生物神经元在接受刺激后,只有当刺激达到一定强度时才会被激活。ReLU函数在输入大于0时才产生激活值,这与生物神经元的特性相似。

不足之处:

  • 死亡ReLU问题:由于ReLU函数在输入小于或等于0时输出为0,且梯度也为0,这会导致这些神经元在训练过程中无法再被激活,即“死亡”。死亡ReLU问题可能导致模型无法充分利用所有神经元,从而影响模型的性能。
  • 非零中心化:ReLU函数的输出始终为正数或0,这导致输出分布不是零中心的。非零中心化的输出分布可能会使下一层神经元的输入分布发生偏移,从而影响模型的训练速度和稳定性。
  • 对参数初始化敏感:ReLU函数对参数的初始化比较敏感。如果参数初始化不当,可能会导致大量神经元在训练初期就处于“死亡”状态,从而影响模型的性能。
  • 为了缓解ReLU函数的不足之处,研究者们提出了多种改进版本,如Leaky ReLU、Parametric
    ReLU(PReLU)、Exponential Linear
    Unit(ELU)等。这些改进版本在保持ReLU函数优点的同时,也尝试解决其不足之处。

Sigmoid函数

Sigmoid函数(也称为逻辑函数或S型函数)是一个在生物学中常见的S型曲线,但在机器学习和深度学习中,它常被用作激活函数,特别是在二分类问题的输出层。其数学表达式为:
在这里插入图片描述
在这里插入图片描述

import torch
from d2l import torch as d2l

x=torch.arange(-5,5,0.1,requires_grad=True)
y=torch.sigmoid(x)
d2l.plot(x.detach(),y.detach(),'x','sigmoid(x)',figsize=(5,4))
d2l.plt.show()
y.backward(torch.ones_like(x),retain_graph=True)
d2l.plot(x.detach(),x.grad,'x','grad(sigmoid)',figsize=(5,4))
d2l.plt.show()

在这里插入图片描述

在这里插入图片描述

Sigmoid函数的优点

  • 易于理解:Sigmoid函数的输出值域在 0 到 1 之间,这使其易于解释为概率值。在二分类问题中,输出值可以解释为正类的概率。
  • 平滑性:Sigmoid函数是连续且可导的,这使得在反向传播算法中可以使用梯度下降法来优化模型参数。
  • 中心化:Sigmoid函数的输出值域关于点 (0, 0.5) 中心对称,这有助于保持数据的平衡性。

Sigmoid函数的不足之处

  • 梯度消失:当输入值 ( x )过大或过小时,Sigmoid函数的梯度(即导数)会趋近于0。这会导致在反向传播过程中,梯度逐渐减小,甚至消失,使得模型难以继续训练。
  • 非零中心化:Sigmoid函数的输出值域虽然关于点 (0, 0.5)中心对称,但整个输出是非零中心化的(即不关于原点对称)。这会导致在反向传播过程中,权重更新的方向总是朝一个方向移动,从而影响模型的收敛速度和稳定性。
  • 计算量大:相比于其他激活函数(如ReLU),Sigmoid函数需要计算指数运算,这会增加计算量,尤其是在处理大规模数据集时。
  • 不适用于多分类问题:Sigmoid函数通常用于二分类问题的输出层,对于多分类问题,需要使用softmax函数或其他策略。

tanh函数

tanh函数,即双曲正切函数,是一种在数学和统计学中常见的非线性函数。它在神经网络、信号处理、数据压缩等领域具有广泛的应用。tanh函数的定义如下:

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

tanh函数的优点

  • 非线性:tanh函数是一个非线性函数,能够对非线性的模式进行学习和表示。
  • 中心化:tanh函数的输出值在[-1,1]之间,且函数中心在坐标轴原点。这使得tanh函数更适合于通过简单的移位操作来更好地适应数据。
  • 梯度消失问题相对较小:与sigmoid函数相比,tanh函数的导数在输入值很大或很小的时候,其值相对较大,因此在反向传播过程中,它们更容易返回大的梯度值,这有助于避免梯度消失的问题。
  • 支持零中心化:tanh函数的输出值可以通过简单的减去均值来实现零中心化,这是训练神经网络时常用的技巧,可以提高模型的训练效率和准确性。
  • 适用于多类别分类:tanh函数可以应用于多类别分类任务,通过将输出值映射到不同的输出类别上来实现分类。

tanh函数的不足之处
计算复杂度较高:tanh函数的计算涉及到指数运算,相对于一些简单的激活函数(如ReLU),其计算复杂度较高,可能会影响模型的训练效率。
梯度消失问题:虽然tanh函数在梯度消失问题上的表现比sigmoid函数要好,但在深层神经网络中,当输入值很大或很小时,tanh函数的导数仍然可能接近于0,导致梯度消失的问题。
输出范围限制:tanh函数的输出范围限制在[-1,1]之间,这可能导致在某些应用中,tanh函数的输出值无法充分表示输入数据的动态范围。

  • 16
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值