激活函数知识点整理

本文详细介绍了激活函数的概念、作用及各类激活函数的特点与应用场景,包括sigmoid、tanh、ReLU及其变种等,并给出了选择建议。

激活函数

什么是激活函数

  • 激活函数是人工神经网络的一个极其重要的特征;
  • 激活函数决定一个神经元是否应该被激活,激活代表神经元接收的信息与给定的信息有关;
  • 激活函数对输入信息进行非线性变换,然后将变换后的输出信息作为输入信息传给下一层神经元。

激活函数的作用

如果不用激活函数,每一层输出都是上层输入的线性函数,无论神经网络有多少层,最终的输出都是输入的线性组合。 激活函数给神经元引入了非线性因素,使得神经网络可以任意逼近任何非线性函数。

激活函数的种类

identity
函数定义:

f(x) = x

导数:

f’(x) = 1

函数图形如 图1 所示:
在这里插入图片描述
图1 identity
优点:适合于潜在行为是线性(与线性回归相似)的任务。

缺点:无法提供非线性映射,当多层网络使用identity激活函数时,整个网络就相当于一个单层模型。
step
函数定义:
在这里插入图片描述
函数图形如 图2 所示:
在这里插入图片描述
图2 step
优点:激活函数 Step 更倾向于理论而不是实际,它模仿了生物神经元要么全有要么全无的属性。

缺点:它无法应用于神经网络因为其导数是 0(除了零点导数无定义以外),这意味着基于梯度的优化方法并不可行。
sigmod
在这里插入图片描述
函数图形如 图3 所示:
在这里插入图片描述
图3 sigmoid
优点:

  1. sigmoid 函数的输出映射在 (0,1) 之间,单调连续,输出范围有限,优化稳定,可以用作输出层;
  2. 求导容易;

缺点:

  1. 由于其软饱和性,一旦落入饱和区梯度就会接近于0,根据反向传播的链式法则,容易产生梯度消失,导致训练出现问题;
  2. Sigmoid函数的输出恒大于0。非零中心化的输出会使得其后一层的神经元的输入发生偏置偏移(Bias Shift),并进一步使得梯度下降的收敛速度变慢;
  3. 计算时,由于具有幂运算,计算复杂度较高,运算速度较慢。

tanh
函数定义:
在这里插入图片描述
函数图形如 图4 所示:
在这里插入图片描述
图4 tanh
优点:

  1. tanh 比 sigmoid 函数收敛速度更快;
  2. 相比 sigmoid 函数,tanh 是以 0 为中心的;

缺点:

  1. 与 sigmoid 函数相同,由于饱和性容易产生的梯度消失;
  2. 与 sigmoid 函数相同,由于具有幂运算,计算复杂度较高,运算速度较慢。

ReLU
函数定义:
在这里插入图片描述
函数图如 图5 所示:
在这里插入图片描述
图5 ReLU
优点:

  1. 收敛速度快;
  2. 相较于 sigmoid 和 tanh 中涉及了幂运算,导致计算复杂度高, ReLU​可以更加简单的实现;
  3. 当输入 x>=0 时,ReLU​ 的导数为常数,这样可有效缓解梯度消失问题;
  4. 当 x<0 时,ReLU​ 的梯度总是 0,提供了神经网络的稀疏表达能力;

缺点:

  1. ReLU​ 的输出不是以 0 为中心的;
  2. 神经元坏死现象,某些神经元可能永远不会被激活,导致相应参数永远不会被更新;
  3. 不能避免梯度爆炸问题;(梯度爆炸和梯度消失详解)
    LReLU
    函数定义:
    在这里插入图片描述
    其中,α 常设置为0.01。函数图如 图6 所示:
    在这里插入图片描述
    图6 LReLU

优点:

  1. 避免梯度消失;
  2. 由于导数总是不为零,因此可减少死神经元的出现;

缺点:

  1. LReLU​ 表现并不一定比 ReLU​ 好;
  2. 无法避免梯度爆炸问题;

PReLU
函数定义:
在这里插入图片描述
函数图如 图7 所示:
在这里插入图片描述
图7 PReLU

优点:

  1. PReLU​ 是 LReLU 的改进,可以自适应地从数据中学习参数;
  2. 收敛速度快、错误率低;
  3. PReLU 可以用于反向传播的训练,可以与其他层同时优化;
    ELU
    函数定义:
    在这里插入图片描述
    函数图形如 图9 所示:
    在这里插入图片描述
    图9 ELU

优点:

  1. 导数收敛为零,从而提高学习效率;
  2. 能得到负值输出,这能帮助网络向正确的方向推动权重和偏置变化;
  3. 防止死神经元出现。

缺点:

  1. 计算量大,其表现并不一定比 ReLU 好;
  2. 无法避免梯度爆炸问题;
    SELU
    函数定义:
    在这里插入图片描述
    函数图形 如图10 所示:
    在这里插入图片描述
    图10 SELU

优点:

  1. SELU 是 ELU 的一个变种。其中 λ 和 α 是固定数值(分别为 1.0507 和 1.6726);
  2. 经过该激活函数后使得样本分布自动归一化到 0 均值和单位方差;
  3. 不会出现梯度消失或爆炸问题;

softmax
softmax 函数一般用于多分类问题中,它是对逻辑斯蒂(logistic)回归的一种推广,也被称为多项逻辑斯蒂回归模型(multi-nominal logistic mode)。假设要实现 k 个类别的分类任务,Softmax 函数将输入数据 xi 映射到第 i 个类别的概率 yi 如下计算:
在这里插入图片描述
显然,0<yi<1。图13 给出了三类分类问题的 softmax 输出示意图。在图中,对于取值为 4、1和-4 的 x1、x2 和 x3,通过 softmax 变换后,将其映射到 (0,1) 之间的概率值。
在这里插入图片描述
图13 三类分类问题的softmax输出示意图

由于 softmax 输出结果的值累加起来为 1,因此可将输出概率最大的作为分类目标(图 1 中被分类为第一类)。

也可以从如下另外一个角度来理解图 1 中的内容:给定某个输入数据,可得到其分类为三个类别的初始结果,分别用 x1、x2 和 x3 来表示。这三个初始分类结果分别是 4、1和-4。通过 Softmax 函数,得到了三个类别分类任务中以概率表示的更好的分类结果,即分别以 95.25%、4.71%和0.04% 归属于类别1、类别2 和类别3。显然,基于这样的概率值,可判断输入数据属于第一类。可见,通过使用 Softmax 函数,可求取输入数据在所有类别上的概率分布。

激活函数的选择

  1. 浅层网络在分类器时,sigmoid 函数及其组合通常效果更好。
  2. 由于梯度消失问题,有时要避免使用 sigmoid 和 tanh 函数。
  3. relu 函数是一个通用的激活函数,目前在大多数情况下使用。
  4. 如果神经网络中出现死神经元,那么 prelu 函数就是最好的选择。
  5. relu 函数只能在隐藏层中使用。
  6. 通常,可以从 relu 函数开始,如果 relu 函数没有提供最优结果,再尝试其他激活函数。

激活函数相关问题

为什么 relu 不是全程可微/可导也能用于基于梯度的学习?

从数学的角度看 relu 在 0 点不可导,因为它的左导数和右导数不相等;但在实现时通常会返回左导数或右导数的其中一个,而不是报告一个导数不存在的错误,从而避免了这个问题。

为什么 tanh 的收敛速度比 sigmoid 快?

在这里插入图片描述
由上面两个公式可知 tanh 引起的梯度消失问题没有 sigmoid 严重,所以 tanh 收敛速度比 sigmoid 快。

sigmoid 和 softmax 有什么区别?
  1. 二分类问题时 sigmoid 和 softmax 是一样的,都是求 cross entropy loss ,而 softmax
    可以用于多分类问题。
  2. softmax 是 sigmoid 的扩展,因为,当类别数 k=2 时,softmax 回归退化为 logistic 回归。
  3. softmax 建模使用的分布是多项式分布,而 logistic 则基于伯努利分布。
  4. 多个 logistic 回归通过叠加也同样可以实现多分类的效果,但是 softmax回归进行的多分类,类与类之间是互斥的,即一个输入只能被归为一类;多 logistic回归进行多分类,输出的类别并不是互斥的,即”苹果”这个词语既属于”水果”类也属于”3C”类别。
<think>嗯,用户让我整理一下PyTorch的主要知识点。首先,我需要回想PyTorch的核心部分。PyTorch是一个深度学习框架,所以基础概念肯定包括张量、自动求导这些。用户可能刚入门,需要系统的知识点梳理。 接下来,得考虑结构怎么安排。可能分几个大块,比如基础知识、核心模块、模型构建、数据处理、训练技巧、部署相关等。这样用户看起来会比较清晰。 基础部分的话,张量操作是必须的,创建、运算、设备切换。然后自动求导机制,autograd模块,计算图这些。动态图是PyTorch的特点,得强调一下和TensorFlow的区别。 然后是核心模块,nn模块里的层、激活函数、损失函数。优化器部分,SGD、Adam这些。数据加载工具Dataset和DataLoader,分布式训练可能用户暂时用不上,但可以提一下。 模型构建方面,如何用nn.Module定义模型,顺序容器如Sequential,模型保存和加载的方法。hook函数可能对高级用户有用,但基础整理可能不需要太深入。 数据处理部分,用户可能需要了解自定义数据集的方法,数据预处理流程,比如用torchvision做图像处理。数据增强技巧也很重要,比如随机裁剪、翻转。 训练技巧部分,学习率调整,早停法,模型检查点,混合精度训练加速。这部分用户可能在实际训练中遇到问题,需要这些技巧来优化。 部署相关,模型导出为ONNX,使用TorchScript做序列化,还有移动端部署。这部分可能对想要部署模型的人比较有用,但如果是初学者可能暂时用不到,不过还是应该包括进来。 高级特性方面,分布式训练、自定义自动求导、内存优化、Profiler工具。这些可能属于进阶内容,但整理主要知识点时简要提及可以帮助用户知道有这些功能。 最后,学习资源部分,官方教程、书籍推荐、社区资源,这对用户自学有帮助。常见问题解答,比如设备管理、维度问题、过拟合处理,这些是实际应用中常遇到的,能帮用户快速解决问题。 需要检查是否有遗漏的重要点,比如张量的广播机制、in-place操作的问题、模型并行数据并行的区别。另外,注意使用中文,LaTeX公式的正确使用,比如张量运算的数学表达式要用$...$包裹。 可能用户需要的是结构化的知识点列表,方便复习或查漏补缺。要确保每个部分简明扼要,重点突出,避免过于冗长。同时,按照系统指令,正确使用数学格式,比如损失函数的公式要用$$包围。 最后通读一遍,确保逻辑清晰,覆盖主要知识点,没有错误。这样用户就能得到一个全面的PyTorch知识点整理,帮助他们的学习和应用。</think>以下为PyTorch主要知识点整理,按学习路径和重要程度分层组织: --- ### 一、基础核心概念 1. **张量(Tensor)** - 创建方式:`torch.tensor()`, `torch.zeros()`, `torch.randn()` - 运算:逐元素运算(`+`, `*`)、矩阵乘法(`@`或`torch.matmul()`)、广播机制 - 设备切换:`.to('cuda')` 或 `torch.set_default_tensor_type()` - 形状操作:`view()`, `reshape()`, `permute()`, `squeeze()` 2. **自动求导(Autograd)** - 核心类:`torch.Tensor` 的 `requires_grad` 属性和 `.backward()` 方法 - 计算图:动态图机制(Define-by-Run) - 梯度控制:`with torch.no_grad():`, `detach()` --- ### 二、核心模块 #### 1. `torch.nn` 模块 - **层类型**: `Linear`, `Conv2d`, `LSTM`, `BatchNorm2d`, `Dropout` - **激活函数**: `ReLU`, `Sigmoid`, `Softmax`(注意dim参数) - **损失函数**: `MSELoss`, `CrossEntropyLoss`, `BCELoss` #### 2. 优化器 (`torch.optim`) - 常见优化器:`SGD`, `Adam`, `RMSprop` - 使用模式: ```python optimizer = torch.optim.Adam(model.parameters(), lr=0.001) optimizer.zero_grad() # 清空梯度 loss.backward() # 反向传播 optimizer.step() # 参数更新 ``` #### 3. 数据加载 (`torch.utils.data`) - **Dataset**:自定义数据集需实现 `__len__` 和 `__getitem__` - **DataLoader**:关键参数 `batch_size`, `shuffle`, `num_workers` --- ### 三、模型构建 1. **定义模型结构** ```python class Net(nn.Module): def __init__(self): super().__init__() self.fc = nn.Linear(784, 10) def forward(self, x): return self.fc(x) ``` 2. **模型容器** - `nn.Sequential`:顺序容器 - `nn.ModuleList` / `nn.ModuleDict`:动态模块管理 3. **模型保存与加载** - 保存整个模型:`torch.save(model, 'model.pth')` - 保存参数:`torch.save(model.state_dict(), 'params.pth')` --- ### 四、数据处理与增强 1. **数据预处理** - `torchvision.transforms`:`Compose([Resize(), ToTensor()])` - 图像增强:`RandomCrop`, `RandomHorizontalFlip` 2. **自定义数据集示例** ```python class CustomDataset(Dataset): def __init__(self, data, labels): self.data = torch.FloatTensor(data) self.labels = torch.LongTensor(labels) def __getitem__(self, index): return self.data[index], self.labels[index] def __len__(self): return len(self.data) ``` --- ### 五、训练技巧 1. **学习率调整** - 使用 `torch.optim.lr_scheduler` 中的 `StepLR`, `CosineAnnealingLR` 2. **防止过拟合** - 早停法(Early Stopping) - 模型正则化:L2正则(权重衰减)、Dropout 3. **混合精度训练** ```python scaler = torch.cuda.amp.GradScaler() with torch.cuda.amp.autocast(): outputs = model(inputs) loss = criterion(outputs, labels) scaler.scale(loss).backward() scaler.step(optimizer) scaler.update() ``` --- ### 六、部署与性能优化 1. **模型导出** - ONNX格式导出:`torch.onnx.export(model, dummy_input, "model.onnx")` 2. **TorchScript** - 通过 `torch.jit.script` 或 `torch.jit.trace` 序列化模型 --- ### 七、高级特性 1. **分布式训练** - `torch.nn.parallel.DistributedDataParallel` - 多GPU训练启动命令:`torchrun --nproc_per_node=4 train.py` 2. **自定义C++扩展** - 使用 `torch.utils.cpp_extension` 编写CUDA内核 --- ### 八、学习资源 - 官方文档:[pytorch.org/docs](https://pytorch.org/docs/stable/index.html) - 经典教程:《Deep Learning with PyTorch》 - 社区:PyTorch论坛、GitHub开源项目 --- ### 常见问题解答 1. **GPU内存不足**:减小`batch_size`,使用`torch.cuda.empty_cache()` 2. **维度错误**:善用`print(tensor.shape)`调试 3. **梯度爆炸**:梯度裁剪 `torch.nn.utils.clip_grad_norm_` 通过掌握以上知识点,可系统性地构建PyTorch知识体系,建议配合实战项目深化理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值