跳转至

PyTorch 初学者完全指南

本文档基于 DeepQuantum 项目的实际应用场景,为机器学习初学者介绍 PyTorch 库的核心概念和使用方法。


目录

  1. PyTorch 是什么?
  2. 核心概念一:张量(Tensor)
  3. 核心概念二:自动微分(Autograd)
  4. 核心概念三:神经网络模块(nn.Module)
  5. 核心概念四:优化器(Optimizer)
  6. DeepQuantum 项目中的 PyTorch 应用
  7. 学习路线建议

PyTorch 是什么?

PyTorch 是一个开源的机器学习框架,由 Facebook(现 Meta)开发。它的核心特点是:

  • 张量计算:类似 NumPy 的多维数组,但支持 GPU 加速
  • 自动微分:自动计算梯度,无需手动推导
  • 神经网络支持:提供丰富的神经网络层和损失函数
  • 动态计算图:可以像写普通 Python 代码一样构建模型

为什么选择 PyTorch?

  • 简单易学:Python 风格的 API,学习曲线平缓
  • 调试友好:可以像调试普通代码一样调试神经网络
  • 社区活跃:大量教程、文档和开源项目
  • 工业界广泛使用:Tesla、Uber、OpenAI 等公司都在使用

核心概念一:张量(Tensor)

什么是张量?

张量(Tensor)**是 PyTorch 中最基本的数据结构,可以理解为: - **标量:0 维张量(一个数字) - 向量:1 维张量(一列数字) - 矩阵:2 维张量(数字的表格) - 高维数组:3 维及以上(如彩色图像是 3 维张量)

创建张量的方法

方法 1:从已有数据创建

import torch

# 从 Python 列表创建
x = torch.tensor([[1., -1.], [1., -1.]])
print(x)
# tensor([[ 1., -1.],
#         [ 1., -1.]])

# 从 NumPy 数组创建
import numpy as np
arr = np.array([[1, 2, 3], [4, 5, 6]])
y = torch.tensor(arr)

方法 2:创建特定形状的张量

# 创建随机张量(正态分布)
x = torch.randn(3, 4)  # 形状 (3, 4)

# 创建全零张量
y = torch.zeros(3, 4)

# 创建全一张量
z = torch.ones(3, 4)

# 创建单位矩阵
identity = torch.eye(3)  # 3x3 单位矩阵

方法 3:创建序列

# 创建等差数列 [0, 2, 4, 6, 8]
a = torch.arange(0, 10, 2)

# 创建线性间隔 [0.0, 0.25, 0.5, 0.75, 1.0]
b = torch.linspace(0, 1, 5)

张量的基本操作

数学运算

x = torch.tensor([[1., 2.], [3., 4.]])
y = torch.tensor([[5., 6.], [7., 8.]])

# 逐元素加法
result = x + y
# tensor([[ 6.,  8.],
#         [10., 12.]])

# 矩阵乘法
matmul_result = torch.matmul(x, y)
# tensor([[19., 22.],
#         [43., 50.]])

# 广播机制(自动扩展维度)
x = torch.randn(3, 4)
broadcasted = x * torch.tensor([1, 2, 3, 4])

形状操作

x = torch.randn(2, 3, 4)

# 转置
transposed = x.t()  # 2D 转置

# 改变形状
reshaped = x.view(4, 6)  # 重塑为 (4, 6)
flattened = x.flatten()  # 展平为 1D

# 索引和切片
first_row = x[0, :]  # 第一行
subset = x[1:3, 2:]  # 行 1-2,列 2-结束

设备切换(CPU/GPU)

x = torch.randn(3, 4)

# 检查 GPU 是否可用
if torch.cuda.is_available():
    # 移动到 GPU
    x_gpu = x.cuda()
    # 或者
    x_gpu = x.to('cuda:0')

    # GPU 上运算
    y_gpu = x_gpu * 2

    # 移回 CPU
    result_cpu = y_gpu.cpu()

DeepQuantum 中的张量应用

在 DeepQuantum 项目中,张量主要用于:

# 1. 表示量子态(复数张量)
state = torch.zeros(2**n, dtype=torch.cfloat)  # 复数浮点类型

# 2. 表示量子门(矩阵)
gate_matrix = torch.eye(2, dtype=torch.cdouble)  # 双精度复数

# 3. 批量处理(第一个维度是 batch)
batch_states = torch.randn(batch_size, 2**n, 1)

核心概念二:自动微分(Autograd)

什么是自动微分?

**自动微分**是 PyTorch 最强大的功能之一。它能够: - 自动计算函数的导数(梯度) - 无需手动推导数学公式 - 支持复杂的计算图

为什么需要自动微分?

在机器学习中,我们需要通过**梯度下降法**来优化模型参数: 1. 定义损失函数(衡量模型好坏) 2. 计算损失对参数的梯度(导数) 3. 沿梯度反方向更新参数

手动计算梯度非常复杂,PyTorch 可以自动完成!

如何使用自动微分?

步骤 1:创建需要梯度的张量

# 使用 requires_grad=True 启用梯度跟踪
x = torch.tensor([2.0, 3.0], requires_grad=True)
y = torch.tensor([1.0, 4.0], requires_grad=True)

步骤 2:构建计算图(前向传播)

# PyTorch 会自动记录操作历史
z = x ** 2 + 3 * y
loss = z.sum()

print(loss)  # tensor(21., grad_fn=<SumBackward0>)

步骤 3:计算梯度(反向传播)

# 反向传播,自动计算梯度
loss.backward()

# 查看梯度
print(x.grad)  # tensor([4., 6.])  ∂loss/∂x = [2*2, 2*3]
print(y.grad)  # tensor([3., 3.])  ∂loss/∂y = [3, 3]

步骤 4:清空梯度

# 梯度会累积,需要清空
x.grad.zero_()
y.grad.zero_()

完整的训练循环示例

import torch
import torch.nn as nn
import torch.optim as optim

# 1. 定义模型(简单线性回归)
model = nn.Linear(10, 1)

# 2. 定义损失函数
criterion = nn.MSELoss()

# 3. 定义优化器
optimizer = optim.Adam(model.parameters(), lr=0.01)

# 4. 训练循环
for epoch in range(100):
    # 准备数据
    inputs = torch.randn(32, 10)
    targets = torch.randn(32, 1)

    # 清空梯度
    optimizer.zero_grad()

    # 前向传播
    outputs = model(inputs)
    loss = criterion(outputs, targets)

    # 反向传播
    loss.backward()

    # 更新参数
    optimizer.step()

    if (epoch + 1) % 10 == 0:
        print(f'Epoch {epoch+1}, Loss: {loss.item():.4f}')

DeepQuantum 中的自动微分应用

# 变分量子算法(VQE)中的参数优化
import torch.optim as optim

# 定义可训练参数
params = torch.tensor([0.1, 0.2, 0.3], requires_grad=True)

# 定义优化器
optimizer = optim.Adam([params], lr=0.01)

# 训练循环
for i in range(100):
    optimizer.zero_grad()          # 清空梯度

    energy = compute_energy(params)  # 前向传播
    energy.backward()                # 反向传播

    optimizer.step()                 # 更新参数

核心概念三:神经网络模块(nn.Module)

什么是 nn.Module?

nn.Module 是 PyTorch 中所有神经网络模块的基类。它提供了: - 参数管理 - 设备迁移(CPU/GPU) - 模型保存/加载 - 模块组合功能

如何定义自定义模块?

基本模板

import torch
import torch.nn as nn
import torch.nn.functional as F

class CustomNet(nn.Module):
    """自定义神经网络"""

    def __init__(self, input_size, hidden_size, num_classes):
        super(CustomNet, self).__init__()

        # 在 __init__ 中定义层
        self.fc1 = nn.Linear(input_size, hidden_size)
        self.bn1 = nn.BatchNorm1d(hidden_size)
        self.dropout = nn.Dropout(p=0.5)
        self.fc2 = nn.Linear(hidden_size, hidden_size // 2)
        self.fc3 = nn.Linear(hidden_size // 2, num_classes)

    def forward(self, x):
        """定义前向传播"""
        # 层 1 + 激活函数
        x = self.fc1(x)
        x = self.bn1(x)
        x = F.relu(x)
        x = self.dropout(x)

        # 层 2 + 激活函数
        x = self.fc2(x)
        x = F.relu(x)

        # 输出层
        x = self.fc3(x)
        return x

使用模块

# 初始化模型
model = CustomNet(input_size=784, hidden_size=256, num_classes=10)

# 创建输入数据
x = torch.randn(32, 784)  # batch_size=32, features=784

# 前向传播
output = model(x)
print(f"Output shape: {output.shape}")  # [32, 10]

# 查看参数
total_params = sum(p.numel() for p in model.parameters())
print(f"Total parameters: {total_params:,}")

常用的神经网络层

import torch.nn as nn

# 全连接层
fc = nn.Linear(in_features=100, out_features=50)

# 卷积层
conv = nn.Conv2d(in_channels=3, out_channels=64, kernel_size=3)

# 批归一化
bn = nn.BatchNorm1d(num_features=50)

# Dropout
dropout = nn.Dropout(p=0.5)

# 激活函数
relu = nn.ReLU()
sigmoid = nn.Sigmoid()
tanh = nn.Tanh()

DeepQuantum 中的 nn.Module 应用

# 量子态类继承 nn.Module
class QubitState(nn.Module):
    def __init__(self, num_qubits):
        super().__init__()
        self.num_qubits = num_qubits

        # 注册状态张量(不需要梯度)
        self.register_buffer('state', torch.zeros(2**num_qubits, dtype=torch.cfloat))

    def forward(self, gates):
        """应用量子门"""
        for gate in gates:
            self.state = gate @ self.state
        return self.state

# QAOA 算法封装为神经网络
class QAOA(nn.Module):
    def __init__(self, num_qubits, depth):
        super().__init__()
        # 定义可训练参数
        self.gamma = nn.Parameter(torch.randn(depth))
        self.beta = nn.Parameter(torch.randn(depth))

    def forward(self, hamiltonian):
        """执行 QAOA 电路"""
        # 应用参数化量子门
        # ...
        return energy

核心概念四:优化器(Optimizer)

什么是优化器?

**优化器**负责根据梯度更新模型参数。PyTorch 提供了多种优化算法:

优化器 特点 适用场景
SGD 简单快速,适合大规模数据 基础模型
Adam 自适应学习率,收敛快 大多数场景
RMSprop 适合 RNN 循环神经网络
Adagrad 稀疏数据 NLP 任务

如何使用优化器?

基本用法

import torch.optim as optim

# 1. 定义模型
model = nn.Linear(10, 1)

# 2. 定义优化器
optimizer = optim.Adam(model.parameters(), lr=0.001)

# 3. 训练循环
for epoch in range(100):
    # 前向传播
    output = model(input)
    loss = criterion(output, target)

    # 反向传播
    optimizer.zero_grad()  # 清空梯度
    loss.backward()        # 计算梯度
    optimizer.step()       # 更新参数

优化器常用参数

optimizer = optim.Adam(
    model.parameters(),
    lr=0.001,              # 学习率
    betas=(0.9, 0.999),    # 动量参数
    eps=1e-08,             # 数值稳定性
    weight_decay=0.0       # L2 正则化
)

学习率调度

from torch.optim.lr_scheduler import StepLR

optimizer = optim.Adam(model.parameters(), lr=0.1)
scheduler = StepLR(optimizer, step_size=30, gamma=0.1)

for epoch in range(100):
    train(...)
    # 每 30 个 epoch 学习率乘以 0.1
    scheduler.step()

DeepQuantum 中的优化器应用

# 量子电路参数优化
class QuantumCircuit(nn.Module):
    def __init__(self):
        super().__init__()
        self.params = nn.Parameter(torch.randn(10))

    def forward(self):
        return simulate_circuit(self.params)

# 使用 Adam 优化器
model = QuantumCircuit()
optimizer = optim.Adam(model.parameters(), lr=0.01)

for i in range(100):
    optimizer.zero_grad()
    energy = model()
    energy.backward()
    optimizer.step()

DeepQuantum 项目中的 PyTorch 应用

项目概述

DeepQuantum 是一个量子计算框架,将 PyTorch 的强大功能应用于量子计算模拟。

主要应用场景

1. 量子态表示

# 使用复数张量表示量子态
import torch

# 创建 n 量子比特的初始态 |00...0⟩
n = 3
state = torch.zeros(2**n, dtype=torch.cfloat)
state[0] = 1.0  # 第一个基态振幅为 1

2. 量子门操作

# 定义量子门(使用单位矩阵)
import torch.nn as nn

class HadamardGate(nn.Module):
    def __init__(self):
        super().__init__()
        # 注册门矩阵(不需要梯度)
        H = torch.tensor([[1, 1], [1, -1]], dtype=torch.cfloat) / torch.sqrt(2)
        self.register_buffer('matrix', H)

    def forward(self, state):
        return self.matrix @ state

3. 变分量子算法(VQE)

class VQE(nn.Module):
    """变分量子本征求解器"""
    def __init__(self, num_qubits, depth):
        super().__init__()
        # 可训练的量子门参数
        self.params = nn.Parameter(torch.randn(depth * 2))

    def forward(self, hamiltonian):
        # 模拟量子电路
        state = self._simulate_circuit()
        # 计算能量期望值
        energy = self._compute_energy(state, hamiltonian)
        return energy

# 训练 VQE
model = VQE(num_qubits=4, depth=3)
optimizer = optim.Adam(model.parameters(), lr=0.01)

for epoch in range(100):
    optimizer.zero_grad()
    energy = model(hamiltonian)
    energy.backward()
    optimizer.step()

4. 批量处理

# 支持批量量子态计算
batch_size = 16
n_qubits = 3

# 批量初始化量子态
batch_states = torch.zeros(batch_size, 2**n_qubits, 1, dtype=torch.cfloat)
batch_states[:, 0, :] = 1.0

# 应用量子门到所有状态
for state in batch_states:
    state = gate_matrix @ state

5. 自动微分计算

from torch.autograd.functional import jacobian, hessian

# 计算 Jacobian 矩阵(一阶导数)
def circuit_function(params):
    return simulate_circuit(params)

params = torch.tensor([0.1, 0.2, 0.3])
J = jacobian(circuit_function, params)

# 计算 Hessian 矩阵(二阶导数)
H = hessian(circuit_function, params)

技术优势

  1. GPU 加速:利用 GPU 加速大规模量子模拟
  2. 自动微分:自动计算量子电路参数的梯度
  3. 批处理:同时模拟多个量子态
  4. 模块化:易于组合量子门和电路
  5. 生态系统兼容:与 PyTorch 生态无缝集成

学习路线建议

第一阶段:基础概念(1-2 周)

  1. 张量操作
  2. 创建和初始化张量
  3. 张量运算(加减乘除、矩阵乘法)
  4. 形状操作(reshape、transpose)
  5. 索引和切片

  6. 自动微分

  7. 理解计算图
  8. 使用 requires_grad
  9. 反向传播 backward()
  10. 梯度访问和清空

第二阶段:神经网络(2-3 周)

  1. 构建模型
  2. 继承 nn.Module
  3. 定义 __init__forward
  4. 使用预定义层

  5. 训练模型

  6. 定义损失函数
  7. 选择优化器
  8. 编写训练循环
  9. 保存和加载模型

第三阶段:实战项目(3-4 周)

  1. 经典机器学习
  2. 线性回归
  3. 逻辑回归
  4. 简单神经网络

  5. 深度学习

  6. 卷积神经网络(CNN)
  7. 循环神经网络(RNN)
  8. Transformer

  9. 量子机器学习

  10. 量子神经网络
  11. 变分量子算法
  12. 量子经典混合模型

推荐学习资源

官方文档

在线课程

书籍推荐

  • 《深度学习框架 PyTorch:入门与实践》
  • 《动手学深度学习》(PyTorch 版)

常见问题解答

Q1: PyTorch 和 NumPy 有什么区别?

A: - PyTorch 支持 GPU 加速,NumPy 只能在 CPU 上运行 - PyTorch 提供自动微分,NumPy 不支持 - PyTorch 张量和 NumPy 数组可以轻松转换:

import torch
import numpy as np

# NumPy → PyTorch
arr = np.array([1, 2, 3])
tensor = torch.from_numpy(arr)

# PyTorch → NumPy
tensor = torch.tensor([1, 2, 3])
arr = tensor.numpy()

Q2: 什么时候使用 view(),什么时候使用 reshape()

A: - view(): 要求张量在内存中连续,否则会报错 - reshape(): 更安全,会自动处理非连续张量 - 性能要求高时优先使用 view()

Q3: .data.detach() 有什么区别?

A: - .data: 已弃用,不安全(可能导致梯度计算错误) - .detach(): 推荐使用,安全地从计算图中分离张量

# 正确做法
x_detached = x.detach()

# 错误做法(不推荐)
x_data = x.data

Q4: 如何调试 PyTorch 代码?

A: 1. 使用 print()tensor.shape 检查张量形状 2. 使用 tensor.requires_grad 确认梯度是否启用 3. 使用 torch.autograd.set_detect_anomaly(True) 检测梯度异常 4. 使用 Python 调试器(pdb)设置断点

Q5: 训练时梯度消失或爆炸怎么办?

A: - 梯度消失:使用 ReLU 激活函数、残差连接、批归一化 - 梯度爆炸:使用梯度裁剪

# 梯度裁剪
torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)

总结

PyTorch 是一个强大而易学的机器学习框架,它的核心概念包括:

  1. 张量:多维数组,支持 GPU 加速
  2. 自动微分:自动计算梯度,简化优化过程
  3. nn.Module:模块化构建神经网络
  4. 优化器:高效的参数更新算法

在 DeepQuantum 项目中,PyTorch 被用于: - 量子态和量子门的表示 - 变分量子算法的参数优化 - 批量量子模拟 - 自动微分计算

下一步行动

  1. 安装 PyTorch:pip install torch
  2. 运行第一个 PyTorch 程序
  3. 完成一个简单的机器学习项目
  4. 探索 DeepQuantum 项目中的量子计算应用

记住:学习编程最好的方式就是动手实践!


文档版本:v1.0 最后更新:2026-01-14 作者:基于 DeepQuantum 项目实战经验总结