PyTorch 详解
随着深度学习技术的快速发展,PyTorch 已经成为了最受欢迎的深度学习框架之一。本书《PyTorch 详解》旨在为读者提供一本系统且实用的 PyTorch 教程,从基础的张量操作到深度神经网络的构建与训练,逐步引导读者深入理解 PyTorch 的核心功能和高效实践。
本书不仅注重理论知识的讲解,更加重视工程实践。通过结合大量实际的案例,特别是如何训练、优化和部署模型,读者将能够掌握如何使用 PyTorch 完成各种深度学习任务。在每一章节中,我们都会从实际问题出发,讲解如何用 PyTorch 高效地实现各种深度学习模型,帮助读者快速掌握深度学习的核心技术。
无论你是深度学习的新手,还是有一定基础的开发者,本书都将为你提供一条清晰的学习路径。通过本书,你不仅能够深入理解 PyTorch 的内核原理,还能够灵活应用 PyTorch 解决实际工程中的问题,提升自己的技术能力和项目经验。
01 张量和梯度基础
主要介绍了深度学习中的核心概念——张量与梯度,并为后续的学习奠定了基础。通过这一章,读者将理解如何进行深度学习程序的安装、如何使用张量进行数据表示与计算,以及如何应用梯度优化神经网络的参数。
1. 程序安装:介绍了如何安装 CUDA 和 PyTorch,确保可以利用 GPU 加速计算,并验证这些库的正确安装。
2. 张量介绍:张量是深度学习中的基本数据结构,作为多维数组,不仅用于存储数据,还广泛用于数学运算,如矩阵乘法、卷积操作等。
3. 深度学习原理:通过对深度学习的简要介绍,帮助读者建立神经网络的初步概念。包括输入数据、输出结果、损失函数、优化器和反向传播等核心概念。
4. 梯度:在神经网络的训练中,梯度是调整模型参数的关键。通过计算损失函数对网络参数的导数,网络可以通过梯度下降等方法来逐步优化权重。
5. 手写神经网络:通过一个简单的三层神经网络实现,展示了如何从头开始搭建和训练神经网络,帮助读者更好地理解神经网络的工作原理。
6. 微梯度(micrograd):本节介绍了一个简单的自动梯度引擎——micrograd,帮助读者理解神经网络训练中的自动求导过程。
这一章为深度学习的学习者提供了必要的基础知识,帮助理解神经网络训练过程中的数据流和计算过程,并通过简单的示例和工具加深了对理论的实际应用理解。
1.1 程序安装
介绍如何安装 CUDA 和 PyTorch 深度学习库。
1. 下载 CUDA 包进行安装。
2. 使用 NVIDIA 官方提供的 nbody 程序验证安装。
3. 安装 torch 、torchaudio 、torchvision 库。
4. 确认 torch 安装正确,以及验证 GPU 能够被 torch 访问。
1.2 张量介绍
在深度学习中,张量是数据表示和计算的基本单位。它是一个多维数组,不仅用于存储数据,还用于执行数值计算,尤其是训练和推理过程中。
1. 数据存储:张量用于存储输入数据、模型的参数(如权重和偏置)、激活值等。
2. 数组访问:通过索引或切片操作获取张量中特定元素或子张量。
3. 数组计算:张量是深度学习中的数学运算基础。例如乘法、卷积操作、归一化等都在张量上进行。
1.3 深度学习原理
对深度学习进行整体介绍,然后分别讲解每个子部分,建立神经网络的初步印象。本节的概念非常多,后续的学习会不断地强化该部分。
1. 输入数据 - 接受数据,如图片、文本、音频等。
2. 输出 - 生成最终的预测结果,例如分类标签或回归数值。
3. 损失函数 - 衡量模型预测结果与真实值的误差。
4. 优化器 - 调整模型参数,以最小化损失。
5. 反向传播 - 计算梯度并更新参数的核心算法。
1.4 梯度
翻译教程 Backpropagation, Intuitions
在神经网络中,梯度 (Gradient) 是指损失函数对网络参数(如权重和偏置)的一阶导数,表示损失函数相对于参数的变化率。
1. 复习导数基本概念,求解常规函数的导数。
2. 在神经网络中,梯度就是损失函数对网络参数(如权重和偏置)的导数。
3. 链式法则是导数计算中的一个重要法则,它用于计算复合函数的导数。
4. 反向传播通过链式法则计算每一层的梯度,并根据这些梯度更新参数。
1.5 手写神经网络
翻译文章 Implementing a Neural Network from Scratch in Python
从头开始(仅使用 NumPy)实现一个简单的三层神经网络,不会推导所有需要的数学知识,但会尝试直观地解释正在做的事情。
1. 数据集生成:创建用于分类的合成数据集。
2. 逻辑回归:展示了一个简单的分类器及其在非线性数据上的局限性。
3. 神经网络架构:实现了一个包含输入、隐藏和输出层的三层神经网络。
4. 优化:修改隐藏层的大小,查看输出情况。
1.6 micrograd
参考 micrograd: The Autograd Engine
一个自动梯度引擎。它是构建神经网络训练的核心,使我们能够更新神经网络的参数。
1. 自动梯度引擎 (micrograd) 。
2. 在此基础上构建具有一个隐藏层的神经网络。
3. 训练循环:损失函数、反向传播、参数更新。
02 全连接网络
2.1 MNIST 数据集
翻译文章 THE MNIST DATABASE of handwritten digits
MNIST(Modified National Institute of Standards and Technology)数据集是一个广泛用于训练图像处理系统的标准数据集。它包含了手写数字的图像,广泛用于测试机器学习算法、尤其是图像识别和分类任务。
1. 理解图片预处理,包括训练集、测试集的制作过程。
2. 使用 Python 对图片进行解码,加载到 NumPy 数组中。
3. 使用 Matplotlib 对图片进行批量绘制。
2.2 手写数字分类
手写数字分类 (MNIST) 是一个经典的深度学习入门任务,目标是识别图像中的手写数字,使用数字 (0–9) 进行标记。
1. 数据加载与预处理。
2. 构建神经网络。
3. 使用
torch.autograd进行自动微分。4. 优化模型参数。
5. 加载和保存模型。
2.3 激活函数
激活函数是神经网络中的“非线性引擎”,让网络可以逼近各种复杂函数。如果没有激活函数,整个网络只相当于一个线性变换器,做不了复杂任务。
1. ReLU
2. Sigmoid
3. Tanh
4. Softmax
讲述一些常用的激活函数,并求解它们的梯度。
2.4 损失函数
损失函数(Loss Function)是机器学习和深度学习中用来衡量模型预测值与真实值之间差距的函数。它的主要作用是量化预测的误差,模型通过最小化损失函数来不断调整参数,从而提高预测准确度。
1. 均方误差 (MSE)
2. 交叉熵损失
讲解一些常用的损失函数,并求解它们的梯度。
2.5 优化器
参考教程 Optimizers,有非常多的优化器,选择其中常见的几种进行讲解。
优化器是深度学习中至关重要的一部分,它决定了如何更新模型的权重以最小化损失函数。常见的优化器包括传统的梯度下降法和其改进版本,像随机梯度下降(SGD)、动量法(Momentum)、Adam 等。
1. Adam 是最常用的优化器,适合大多数任务,尤其是当数据量较大或模型较复杂时。
2. SGD 可以在有较强先验知识的情况下使用,尤其是在小数据集上,但可能需要精细调整学习率。
3. RMSProp 在处理非平稳目标函数时非常有效。
4. AdaGrad 适合稀疏数据,但可能会过早衰减学习率。
5. Nadam 适用于需要加速收敛且需要前瞻性动量的场景。
优化器的选择不仅依赖于模型的类型,还与训练数据的特性、任务的难度以及需要解决的具体问题相关。
2.6 检测糖尿病
翻译文章 Develop Your First Neural Network with PyTorch, Step by Step
1. 如何记载 CSV 数据集并使用 PyTorch 进行预处理。
2. 如何在 PyToch 中定义多层感知器模型。
3. 如何在验证数据集上训练和评估 PyToch 模型。
03 卷积网络
3.1 基础介绍
翻译文章 CNNs, Part 1: An Introduction to Convolutional Neural Networks
CNNs, Part 2: Training a Convolutional Neural Network1. 卷积神经网络概述,包括卷积层、池化层和全连接层。
2. 网络结构设计。
3. 模型训练。
4. 模型评估与优化。
3.2 AlexNet
来自论文 ImageNet Classification with Deep Convolutional Neural Networks
AlexNet 是一种深度卷积神经网络(CNN)架构,由 Alex Krizhevsky、Ilya Sutskever 和 Geoffrey Hinton 设计,并且在 2012 年的 ImageNet 大规模视觉识别挑战赛(ILSVRC) 中获胜,极大推动了深度学习在计算机视觉领域的应用和发展。架构如下:
1. 输入层:输入为 224x224 像素的 RGB 彩色图像。
2. 卷积层:AlexNet 包含 5 个卷积层,每个卷积层后都有 ReLU 激活函数。
3. 最大池化层:在某些卷积层后使用最大池化层来减少特征图的空间维度。
4. 全连接层:卷积层后接 3 个全连接层,用于进行分类预测。最后的输出层有 1000 个神经元,对应 ImageNet 数据集中的 1000 类。
5. 归一化层:AlexNet 使用了 局部响应归一化(LRN),尽管现代网络架构通常使用批量归一化(Batch Normalization)来代替。
3.3 ResNet
来自论文 Deep Residual Learning for Image Recognition
ResNet(残差网络) 是由 Kaiming He 等人在 2015 年提出的一种深度卷积神经网络(CNN)架构,最初用于解决 ImageNet 的图像分类任务,并且在 ILSVRC 2015 大赛中取得了显著的成绩。
ResNet 的核心创新是引入了 残差连接 (Residual Connections),有效地解决了深层网络训练中的梯度消失和梯度爆炸问题,使得网络能够更深、更高效地进行训练。
3.4 U-net
来自论文 U-Net: Convolutional Networks for Biomedical Image Segmentation
提出了一种网络和训练策略,它依赖于大量使用数据增强来更有效地使用可用的带注释样本。该架构由一条用于捕获上下文的收缩路径和一条用于实现精确定位的对称扩展路径组成。
3.5 花卉分类
04 循环网络
循环神经网络 (RNN) 是一种用于处理序列数据的神经网络。它通过将上一时刻的输出作为当前时刻的输入,能够记住前面时间步的信息,适用于文本、语音等具有时间依赖关系的数据。
1. 简单实现:介绍如何用 PyTorch 实现简单的文本分类和生成任务,帮助理解 RNN 在实际中的应用。
2. 长短期记忆 (LSTM):LSTM 是一种改进的 RNN,能够解决传统 RNN 在处理长期依赖时的问题。通过遗忘门、输入门和输出门,LSTM 可以有效地记住重要信息并丢弃不相关的部分,广泛应用于文本和语音处理。
3. GRU:GRU 是 LSTM 的简化版本,计算效率更高,但在效果上与 LSTM 类似,适用于机器翻译等任务。
4. Seq2Seq:Seq2Seq 是一种基于 RNN 的模型,它通过编码器将输入序列转为一个固定向量,再通过解码器生成输出序列,常用于机器翻译等任务。
5. word2vec:word2vec 是一种用于学习单词向量的技术,能够将词语转换为向量,捕捉词语之间的语义关系,常用于文本数据处理。
总结来说,这一章讲解了 RNN 及其改进版本(如 LSTM 和 GRU)的基础,重点介绍了它们如何处理序列数据,特别是在自然语言处理中的应用。
4.1 简单实现
在教程《深度学习综合指南》中,我们使用 RNN 手动实现过文本分类和文本生成,感兴趣的读者可以前往阅读。本教程在介绍完基本的原理之后,将使用 PyTorch 实现简单地两个类似的功能。
4.2 长短期记忆
LSTM 是一种改进的循环神经网络,能有效解决长期依赖问题。它通过遗忘门、输入门和输出门控制信息流动,保留有用记忆、忘记无关内容,从而在处理序列数据如文本、语音时表现优异,广泛应用于自然语言处理等任务。
4.3 GRU
来自论文 Learning Phrase Representations using RNN Encoder-Decoder for Statistical Machine Translation
4.4 Seq2Seq
来自论文 Sequence to Sequence Learning with Neural Networks
提出了一种通用的端到端序列学习方法,该方法对序列结构做出最少的假设。使用多层长短期记忆 (LSTM) 将输入序列映射到固定维数的向量,然后使用另一个深度 LSTM 从向量解码目标序列。
4.5 word2vec
来自论文 Efficient Estimation of Word Representations in Vector Space
Distributed Representations of Words and Phrases and their Compositionality
论文提出两种新颖的模型架构,用于从非常大的数据集中计算连续向量表示。这些表示的质量在单词相似性任务中测量,并将结果与以前基于不同类型神经网络的最佳表现进行比较,观察到准确率大幅提高,计算成本却低很多。
翻译教程 word2vec
05 Transformer
深入讨论了基于注意力机制的几种重要模型,尤其是 Transformer 架构以及其在自然语言处理 (NLP) 和计算机视觉方面的应用。
1. 注意力:从宏观角度介绍了注意力的基本概念,并总结了各种类型的注意力,如自注意力、全局注意力和局部注意力等,这些概念为理解Transformer架构的核心思想奠定了基础。
2. 经典的编码器-解码器架构:使用 PyTorch 重新实现论文 Attention is All You Need 中德语-英语翻译。
3. nanoGPT:使用 Transformer 的解码器部分,完成文字生成任务。
4. BERT 分类实现: 使用 Transformer 的编码器部分,进行预训练。
5. ViT:Transformer 在视觉方面的应用,对于图像分类方面也可以表现的非常好。
总的来说,Transformer 架构不仅在自然语言处理领域取得了突破性的进展,而且其强大的灵活性和适应性使其在计算机视觉和其他领域也取得了显著的成功。
5.1 注意力概述
在阅读这篇教程前,如果不知道 得分函数 (Score Function) ,最好提前阅读文章 注意力机制 ,它是从更基础的角度解释注意力是什么。
5.2 nn.Transformer
来自论文 Attention Is All You Need
论文提出了一种新的简单网络架构 Transformer ,它完全基于注意力机制,完全省去了循环和卷积。在两个机器翻译任务上的实验表明,这些模型质量更优越,同时并行化更好,并且需要的训练时间明显减少。
使用 PyTorch 实现论文中德语-英语的翻译,核心是使用 nn.Transformer 接口。
5.3 Transformer 注释
翻译文章 The Annotated Transformer
1. Transformer 模型架构,包括编码器和解码器。
2. 模型训练,定义每个训练步骤。
3. 真实的例子,英语到德语的翻译。
5.4 nanoGPT
参考 nanoGPT,最简单、最快速训练/微调中等规模大小的 GPT 库。
1. 快速预览,用莎士比亚的作品训练一个字符级的 GPT。
5.5 BERT 分类实现
来自论文 BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding
引入一种叫做 BERT 的语言表示模型,英文为 Bidirectional Encoder Representations from Transformers 。与最近的语言表示模型不同,BERT 旨在通过联合调节所有层的左上下文和右上下文来预训练来自未标记文本的深度双向表示。因此,只需一个额外的输出层即可对预训练的 BERT 模型进行微调,以创建用于各种任务(例如问答和语言推理)的最先进的模型,而无需对特定于任务的架构进行大量修改。
5.6 ViT
来自论文 An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale
直接应用于图像块序列的纯 Transformer 可以在图像分类任务中表现得非常好。当对大量数据进行预训练并转移到多个中型或小型图像识别基准(ImageNet、CIFAR-100、VTAB 等)时,与最先进的卷积网络相比,Vision Transformer (ViT) 取得了出色的结果,同时需要更少的计算资源来训练。
06 扩散模型
主要翻译系列文章:
在《扩散模型的数学基础》中,我们将讲述 扩散生成模型 (Diffusion Generative Models) 的数学基础,会对以下内容有扎实的理解:
1. 得分函数 (Score Function) 作为数据分布的梯度。
2. 得分函数使前向扩散过程得以逆转 (Reversal of Forward Diffusion Process)。
3. 通过去噪分数匹配(及其与显式分数匹配的等价性)来学习得分函数。
4. 用神经网络近似得分函数。
5. 从扩散模型中进行抽样。
在《从“零开始”理解稳定扩散》中,我们将讲解稳定扩散的所有基本组成部分,包括:
1. 扩散模型原理。
2. UNet 模型的得分函数。
3. 通过语境词嵌入理解提示。
4. 通过交叉注意力让文本影响图像。
5. 通过添加自动编码器提高效率。
6. 大规模训练。
6.1 数学基础
翻译教程 Diffusion generative models, Day 1 (Theory)
6.2 得分函数
翻译教程 Diffusion, Reverse Diffusion and Score function
6.3 训练
翻译教程 Denoising Score Matching, and Train Neural Network to Approximate Score
6.4 从头构建
翻译教程 Build your own Stable Diffusion UNet model from scratch in a notebook
6.5 文本提示
翻译教程 Build a Diffusion model (with UNet + cross attention) and train it based on the "text prompt"
6.6 稳定扩散
07 文本
7.1 字符生成
自回归语言模型,参考 makemore 项目进行名字生成。
1. 二元词组(通过计数查找表,用一个字符预测下一个字符)。
2. MLP
3. CNN
4. RNN
5. LSTM
6. GRU
7. Transformer
7.2 字符识别
参考 EasyOCR: Ready-to-use OCR with 80+ supported languages
7.3 翻译任务
08 语音
8.1 语音特征提取
介绍 Mel 频谱、MFCC 特征等音频数据处理方式。
1. 详细介绍梅尔频谱(Mel Spectrogram)、MFCC 等语音特征的提取方法。
2. 讲解如何使用 Librosa 等库提取语音特征。
3. 介绍语音数据增强的方法。
4. 介绍语音编码。
5. 介绍波形数据处理。
8.2 ASR(自动语音识别)
讲解 Wav2Vec2.0、DeepSpeech 语音识别模型。
1. 讲解语音识别的基本原理和实现方法。
2. 介绍如何构建基于循环神经网络和Transformer的语音识别模型。
3. 讲解CTC(Connectionist Temporal Classification)算法。
4. 介绍如何评估语音识别模型的性能。
8.3 TTS(文本转语音)
参考文章 Text-to-Speech with Tacotron2
介绍 Tacotron、WaveNet、FastSpeech。
1. 讲解语音合成的基本原理和实现方法。
2. 介绍Tacotron、WaveNet等语音合成模型的原理和实现。
3. 介绍如何评估语音合成模型的性能。
8.4 语音增强与分离
介绍降噪、语音分离、回声消除等技术。
1. 降低背景噪声,提高语音信号的清晰度。
2. 从混合语音信号中分离出单个说话人的语音。
3. 消除扬声器播放的声音通过麦克风采集产生的回声。
8.5 语音合成与风格迁移
讲解语音克隆、声音转换等应用。
1. 利用少量目标说话人的语音数据,复制其独特的音色和说话方式。
2. 将一个人的语音特征转换为另一个人的语音特征,实现声音的“风格迁移”。
3. 使用一种语言的文本,合成另一种语言的语音,同时保留说话人的音色。
4. 合成带有特定情感色彩的语音,如喜悦、悲伤、愤怒等。
8.6 音轨分离
09 图像与视频
9.1 物体检测
翻译教程 TorchVision Object Detection Finetuning Tutorial
9.2 迁移学习
翻译教程 Transfer Learning for Computer Vision Tutorial
9.3 对抗示例
翻译教程 Adversarial Example Generation
9.4 DCGAN
9.4 styleGAN
9.6 空间 Transformer
9.7 DeepFaceLab
参考 DeepFaceLab is the leading software for creating deepfakes.
9.8 DeepFaceLive
参考 Real-time face swap for PC streaming or video calls
9.9 抠图
参考 segment-anything: provides code for running inference with the SegmentAnything Model (SAM)
10 强化学习
10.1 DQN
翻译教程 Reinforcement Learning (DQN) Tutorial
10.2 PPO
11 PyTorch 拓展
11.1 自定义算子
12 模型部署
12.1 ONNX
Open Neural Network Exchange (ONNX) 为 AI 模型(包括深度学习和传统机器学习)提供了一种开源格式。ONNX Runtime 是一个跨平台推理和训练机器学习加速器。
1. 模型训练完成后导出 ONNX 格式。
2. 在终端加载 ONNX 格式进行推理。
12.2 TorchScript
12.3 ExecuTorch
13 模型优化
13.1 Lora 微调
LoRA: Low-Rank Adaptation of Large Language Models
13.2 修剪
翻译教程 Pruning Tutorial
13.3 量化
13.4 蒸馏
14 分布式训练
14.1 数据并行
15 图神经网络
15.1 基础
1. 什么是图(Graph):节点、边、邻接矩阵。
2. 图的种类:有向图、无向图、加权图、多重图、异构图。
3. 图学习任务:节点分类、边缘预测、图分类。
15.2 核心思想
1. 信息传播(Message Passing)框架。
2. 局部聚合 vs 全局图建模
15.3 主流模型
1. GCN(Graph Convolutional Network)
2. GAT(Graph Attention Network)
3. GraphSAGE
4. GIN(Graph Isomorphism Network)
15.4 Geometric
1. 安装与基本结构
2. 数据结构(Data, Dataset, DataLoader)
15.5 节点分类
1. 使用 Cora/Citeseer 数据集
2. 用 GCN 进行节点分类
3. 可视化训练过程
4. 模型评估与调参技巧
15.6 进阶
1. 图注意力机制(GAT 原理与实现)
2. 图池化(Graph Pooling)
3. 图生成(GraphVAE、GraphGAN)
4. 图自监督学习