PyTorch基础介绍
PyTorch基础是张量,包含torch.autograd、torch.nn、torch.optim等子模块;包含多种损失函数,包括 MSE(均方误差 = L2 范数)、交叉熵损失和负熵似然损失(对分类器有用)等。
张量(Tensor):
支持在 CPU 和 GPU 之间进行切换。
提供了类似 NumPy 的接口,支持元素级运算。
支持自动求导,可以方便地进行梯度计算。
自动求导(Autograd):
PyTorch 内置的自动求导引擎,能够自动追踪所有张量的操作,并在反向传播时计算梯度。
通过 requires_grad 属性,可以指定张量需要计算梯度。
支持高效的反向传播,适用于神经网络的训练。
模型定义与训练
PyTorch 提供了 torch.nn 模块,允许用户通过继承 nn.Module 类来定义神经网络模型。使用 forward 函数指定前向传播,自动反向传播(通过 autograd)和梯度计算也由 PyTorch 内部处理。
神经网络模块(torch.nn):
- 提供了常用的层(如线性层、卷积层、池化层等)。
- 支持定义复杂的神经网络架构(包括多输入、多输出的网络)。
- 兼容与优化器(如
torch.optim)一起使用。 - torchvision:用于计算机视觉任务的数据集和模型。
- torchtext:用于自然语言处理任务的数据集和预处理工具。
- torchaudio:用于音频处理的工具包。
- PyTorch Lightning:一种简化 PyTorch 代码的高层库,专注于研究和实验的快速迭代。
PyTorch torch.nn
nn.Module 类:
nn.Module 是所有自定义神经网络模型的基类。用户通常会从这个类派生自己的模型类,并在其中定义网络层结构以及前向传播函数(forward pass)。
预定义层(Modules):
包括各种类型的层组件,例如卷积层(nn.Conv1d, nn.Conv2d, nn.Conv3d)、全连接层(nn.Linear)、激活函数(nn.ReLU, nn.Sigmoid, nn.Tanh)等。
容器类:
nn.Sequential:允许将多个层按顺序组合起来,形成简单的线性堆叠网络。
nn.ModuleList 和 nn.ModuleDict:可以动态地存储和访问子模块,支持可变长度或命名的模块集合。
损失函数(Loss Functions):
torch.nn 包含了一系列用于衡量模型预测与真实标签之间差异的损失函数,例如均方误差损失(nn.MSELoss)、交叉熵损失(nn.CrossEntropyLoss)等。
实用函数接口(Functional Interface):
nn.functional(通常简写为 F),包含了许多可以直接作用于张量上的函数,它们实现了与层对象相同的功能,但不具有参数保存和更新的能力。例如,可以使用 F.relu() 直接进行 ReLU 操作,或者 F.conv2d() 进行卷积操作。
初始化方法:
torch.nn.init 提供了一些常用的权重初始化策略,比如 Xavier 初始化 (nn.init.xavier_uniform_()) 和 Kaiming 初始化 (nn.init.kaiming_uniform_()),这些对于成功训练神经网络至关重要。
Transformer 层:
PyTorch 提供了完整的 Transformer 架构组件,包括 nn.Transformer, nn.TransformerEncoder, nn.TransformerDecoder 以及注意力机制 nn.MultiheadAttention 等。
归一化层:
包括批归一化(BatchNorm)、层归一化(LayerNorm)、组归一化(GroupNorm)、实例归一化(InstanceNorm)和 RMSNorm 等。
PyTorch torch.nn
神经网络容器、全局钩子(Global Hooks)、线性层、卷积层、池化层、填充层(Padding Layers)、激活函数(非线性激活 - 加权求和类)、激活函数(非线性激活 - 其他)、归一化层、循环神经网络层、Transformer 层、注意力机制(Attention)、嵌入层(稀疏层)、Dropout 层、视觉层(Vision Layers)、损失函数、距离函数、并行层(DataParallel)、实用函数(nn.functional)、工具函数(nn.utils)、参数初始化(nn.init)、RNN 工具函数、剪枝函数(Pruning)、Flatten 层
全局钩子:
- PyTorch 全局钩子注册一次,作用于模型中全部 Module 网络层,无需遍历每一层逐个注册钩子PyTorch。
- 在所有层前向传播、反向传播过程中自动触发回调,可以读取、甚至修改每层输入输出张量与梯度。
- 用于模型调试、监控所有层激活与梯度,定位梯度爆炸 / 消失、NaN 异常。
- 用于网络性能分析、统计各层耗时、显存占用。
- 适合第三方预训练模型,无需了解内部层结构,实现全局监控;调试结束可以一键移除钩子。
- 主要用于调试分析,不建议正式训练业务大量使用。
线性层:
nn.Linear为线性全连接层,执行运算 \(y=xW^T+b\),完成特征维度映射。- 将输入特征从
in_features维映射到out_features维,实现特征加权融合。 - 常用于网络输出头,完成分类、回归任务输出;也用于网络内部特征变换。
- 本身是线性变换,无非线性表达能力,需要配合激活函数才能拟合复杂数据分布。
- 包含可学习参数权重 W 与偏置 b,参与反向传播更新。
卷积层 CNN:
CNN(卷积神经网络),擅长网格空间数据 (图像),核心:滑动卷积核提取局部空间特征 ,没有记忆状态,全部时间步可以并行计算。
- 卷积层通过卷积核滑动,提取图像局部特征,如边缘、纹理、轮廓。
- 完成通道维度变换,将输入通道映射为指定数量的输出特征通道。
- 通过卷积核、步长、填充参数调整特征图空间分辨率,步长大于 1 可实现下采样。
- 使用局部连接与权值共享,相比全连接层显著减少参数量,减轻过拟合。
- 属于线性变换,需要搭配激活函数引入非线性;多层堆叠可以增大感受野。
池化层:
- 池化层实现特征图空间维度下采样,缩小特征图高和宽,通道数保持不变。
- 降低特征规模,减少后续网络计算量与显存消耗。
- 聚合局部特征:最大池化保留显著特征;平均池化平滑特征。
- 带来一定平移不变性,提升模型对目标微小位置偏移的鲁棒性。
- 增大感受野;池化层无学习参数,不参与权重更新。
填充层:
填充层 = 给张量 "加边框",目的是控制尺寸 + 保护边界信息,两种写法(卷积参数 / 独立 Pad 层)按场景二选一即可。
激活函数:
给神经网络引入非线性。激活函数是深度学习的 "开关" 和 "闸门"------ 决定信息是否流动、梯度能否回传、输出落在哪个范围,缺了它,网络再深也只是一次线性变换。
归一化层:
把每层的输入分布拉回到均值为 0、方差为 1 的标准分布,解决训练中的 "分布漂移" 问题,让网络更稳定、收敛更快。
循环神经网络层 (RNN / LSTM / GRU):
循环神经网络专门处理序列数据 (文本、时间序列、语音),核心特点:带记忆,一步步按顺序处理输入,保存上一步的状态,把历史信息带到下一步。
Transformer 层:
Transformer 核心是自注意力机制 Self‑Attention ,出自《Attention Is All You Need》,既可以处理序列(文本、时间序列),不需要像 RNN 那样逐时间步串行计算,可以全部并行 ,擅长捕捉长距离依赖关系。
- CNN:看局部窗口;
- RNN:顺着顺序一步步读,记忆慢慢往后传;
- Transformer:一眼看完整个序列,任意两个位置直接建立联系。
注意力机制(Attention):
人的注意力:看东西时,不会同等看待所有信息,重点关注关键部分,弱化无关部分。
神经网络里的Attention :让模型在处理某一个位置时,给序列中各个元素分配不同权重,权重高 = 重点关注,权重低 = 忽略。
传统 RNN 问题:
- 只靠最后一个隐藏状态承载全部信息,长序列前面信息容易丢失;
- 每一步只能依赖上一步输出,无法直接跳转到很远的位置。
注意力解决:不需要一步步传递,可以直接计算序列任意位置之间的关联程度。