什么是 PyTorch?
PyTorch 是一个基于软件的开源深度学习框架,用于构建神经网络,将 Torch 的机器学习 (ML) 库与基于 Python 的高级 API 相结合。它的灵活性和易用性以及其他优点使其成为学术和研究界领先的机器学习框架。
PyTorch 支持 多种神经网络架构,从简单的线性回归算法到复杂的卷积神经网络和用于计算机视觉和自然语言处理 (NLP) 等任务的生成式转换器模型。PyTorch 基于广为人知的 Python 编程语言构建,并提供广泛的预配置(甚至预训练)模型库,使数据科学家能够构建和运行复杂的深度学习网络,同时最大限度地减少在代码和数学结构上花费的时间和精力。
PyTorch 还允许数据科学家实时运行和测试部分代码,而不是等待整个代码实现 – 对于大型深度学习模型来说,这可能需要很长时间。这使得 PyTorch 成为快速原型设计的绝佳平台,并且还大大加快了调试流程。
PyTorch 最初由 Facebook AI Research(现为 Meta)开发,于 2017 年配置为开源语言,自 2022 年起由 PyTorch Foundation(隶属于大型 Linux Foundation)管理。该基金会为深度学习社区提供一个中立空间,以合作并进一步开发 PyTorch 生态系统。
2023 年,IBM 成为 PyTorch Foundation 的主要成员,他们已合作开展两个重大项目:支持更高效地训练具有数十亿参数的灵活 AI 基础模型,以及大大提高 AI 训练检查点操作的成本效益。IBM 的 watsonx 平台利用 PyTorch 为人工智能基础模型提供企业级软件堆栈,从端到端训练到模型微调。
PyTorch 的工作原理是什么?
PyTorch 的数学和编程结构可以简化机器学习工作流程,而不会限制深度神经网络的复杂性或性能。
Python
Python 是一种广泛用于数据科学的通用高级编程语言,使其成为数据科学家将工作扩展到深度学习网络主动建模的直观选择。Python 的简单语法易于阅读,学习时间相对较少,并且可以在任何操作系统上运行,如 Windows、macOS、Linux 或 Unix。三年多来,Python 一直是 GitHub 上第二大最常用的编程语言,并于 2019 年超过 Java。它的受欢迎程度持续增长,2022 年提升了 22.5%。
这种灵活性和简洁性帮助培育了一个强大的 Python 开发人员在线社区,他们在各种 Python 库和 API 上进行协作,例如用于数学运算的 Numerical Python (NumPy)、用于数据操作的 Pandas 或用于数据可视化的 matplotlib 以及教育资源。该社区还制作了大量 PyTorch 库,旨在减少机器学习编码的单调性和猜测,使开发人员和数据科学家能够专注于创新,而不是机械式任务编写。
张量
对于任何机器学习算法,即使是用于表面上非数字信息(如声音或图像)的算法,数据也必须以数字形式表征。PyTorch 则通过张量实现数据表征,张量是该平台计算的数据的基本单位。 针对机器学习,张量是一个多维数字数组,其功能类似于数学簿记设备。在语言上,“张量”是个通用术语,包含一些更熟悉的数学实体:
- 标量是一种零维张量,包含一个数字。
- 向量是一种一维张量,包含多个相同类型的标量。元组是一种一维张量,包含不同数据类型。
- 矩阵是一种二维张量,包含多个相同类型的向量。
- 具有三个或更多维度的张量(如计算机视觉算法中用于表示 RGB 图像的三维张量)统称为 N 维张量。 PyTorch 张量的功能与 NumPy 中使用的 ndarray 类似,但与只能在中央处理单元 (CPU) 上运行的 ndarray 不同,张量也可以在图形处理单元 (GPU) 上运行。GPU 的计算速度比 CPU 快得多,考虑到深度学习常见的海量数据和并行处理,这是一个主要优势。 除了对模型的输入和输出进行编码之外,PyTorch 张量还对模型参数进行编码:在机器学习中“学习”的权重、偏差和梯度。张量的这一属性可以实现自动微分,这是 PyTorch 最重要的功能之一。
模块
PyTorch 使用模块作为深度学习模型的构建块,可以快速、直接地构建神经网络,而无需手动编码每个算法的繁琐工作。 模块可以(而且经常)包含其他嵌套模块。除了可以创建更复杂的多层神经网络外,还可以轻松地将这些复杂的深度学习模型保存为单个命名模块,并在不同的机器、CPU 或 GPU 之间传输。PyTorch 模型甚至可以在非 Python 环境(如 C++)中使用 Torchscript运行,有助于弥合研究原型和生产部署之间的差距。 从广义上讲,PyTorch 中用于构建和优化深度学习模型的模块主要分为三类:
- nn 模块部署为神经网络的层。torch.nn 软件包包含一个大型模块库,可以执行卷积、池化和回归等常见操作。例如,torch.nn.Linear(n,m) 调用具有 n 个输入和 m 个输出的线性回归算法(其初始输入和参数随后在后续代码行中建立)。
- autograd 模块提供一种自动计算梯度的简单方法,用于通过梯度下降优化模型参数,适用于神经网络中运行的任何函数。通过附加任何 require_grad=True 的张量,可以向 autograd 发出指示:该张量上的每个操作都应该进行跟踪,从而实现自动微分。
- Optim 模块将优化算法应用于这些梯度。Torch.optim 提供适用于各种优化方法的模块,例如随机梯度下降 (SGD) 或均方根传播 (RMSprop),以满足特定的优化需求。
动态计算图
动态计算图 (DCG) 是深度学习模型在 PyTorch 中的表示方式。抽象地说,计算图映射数学系统中不同操作之间的数据流:在深度学习中,计算图实质上是将神经网络的代码转化为流程图,指示每个节点执行的操作以及网络中不同层之间的依赖关系 – 将输入数据转化为输出数据的步骤和序列安排。
动态计算图(如 PyTorch 中使用的计算图)与静态计算图(如 TensorFlow 中使用的计算图)的区别在于前者将计算的准确规范以及它们之间的关系推迟到运行时。换言之,静态计算图需要完全确定并编译整个神经网络的架构才能运行,而动态计算图可以在运行中进行迭代和修改。
因此动态计算图对于调试和原型设计特别有用,因为可以单独更改或运行模型代码的特定部分,而无需重置整个模型。对于面向复杂计算机视觉和 NLP 任务的超大型深度学习模型来说,重置模型可能会浪费时间和计算资源。这种灵活性可扩展到模型训练,因为在反向传播过程中可以轻松地反向生成动态计算图。
虽然它们的固定结构可以提高计算效率,但静态计算图的灵活性有限:例如,构建一个根据输入数据使用不同层数的模型(例如可以处理不同图像尺寸的卷积神经网络 (CNN))对于使用静态图来说是极其困难的。
自动微分
反向传播是一种广泛使用的神经网络训练方法,尤其是在监督学习中。首先,在前向传递中,模型获得输入 (x) 并预测输出 (y);从该输出向后推算,使用损失函数测量模型在不同 x 值下的预测误差。梯度下降法通过对损失函数微分求导,可一次一层地调整神经网络中的权重。
PyTorch 的 autograd 模块使用称为链式法则的微积分公式为其自动微分技术提供支持,通过将复杂导数拆分为简单导数,稍后组合简单导数,从而计算复杂导数。Autograd 自动计算并记录计算图中执行的所有操作的梯度,大大减少反向传播工作。
当运行已训练模型时,autograd 就没有必要使用计算资源。附加任何 require_grad=False 的张量操作将指示 PyTorch 停止跟踪梯度。
数据集和数据加载器
使用训练深度学习模型所需的大型数据集可能非常复杂且计算要求较高。PyTorch 提供两种数据原语:数据集和数据加载器,以方便数据加载并使代码更易于阅读。
- torch.utils.data.Dataset 存储数据样本及对应标签
- torch.utils.data.Dataloader 在数据集周围包装了一个可迭代对象(可以对其进行操作的对象),以便轻松访问样本
安装和运行 PyTorch
PyTorch 可以在本地系统和云平台上以不同的配置安装和运行。
在本地运行 PyTorch 需要使用 Anaconda 软件包管理器、Homebrew 或 Python 网站来安装 Python。 可以通过 Anaconda使用命令 conda install pytorch torchvision -c pytorch,或者通过 pip 使用命令 pip3 install torch torchvision,在本地安装 PyTorch。建议使用 Anaconda,因为它在一个沙盒安装中提供了所有 PyTorch 依赖项(包括 Python)。
PyTorch 还可在云平台上运行,包括 Amazon Web Services、Google Cloud 和 Microsoft Azure。 建议(但不是必需)使用 NVIDIA GPU,以便利用 PyTorch 对 CUDA(统一计算设备架构)的支持,该架构提供的训练和性能远超 CPU。