PyTorch 初学者完全指南¶
本文档基于 DeepQuantum 项目的实际应用场景,为机器学习初学者介绍 PyTorch 库的核心概念和使用方法。
目录¶
- PyTorch 是什么?
- 核心概念一:张量(Tensor)
- 核心概念二:自动微分(Autograd)
- 核心概念三:神经网络模块(nn.Module)
- 核心概念四:优化器(Optimizer)
- DeepQuantum 项目中的 PyTorch 应用
- 学习路线建议
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:清空梯度¶
完整的训练循环示例¶
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)
技术优势¶
- GPU 加速:利用 GPU 加速大规模量子模拟
- 自动微分:自动计算量子电路参数的梯度
- 批处理:同时模拟多个量子态
- 模块化:易于组合量子门和电路
- 生态系统兼容:与 PyTorch 生态无缝集成
学习路线建议¶
第一阶段:基础概念(1-2 周)¶
- 张量操作
- 创建和初始化张量
- 张量运算(加减乘除、矩阵乘法)
- 形状操作(reshape、transpose)
-
索引和切片
-
自动微分
- 理解计算图
- 使用
requires_grad - 反向传播
backward() - 梯度访问和清空
第二阶段:神经网络(2-3 周)¶
- 构建模型
- 继承
nn.Module - 定义
__init__和forward -
使用预定义层
-
训练模型
- 定义损失函数
- 选择优化器
- 编写训练循环
- 保存和加载模型
第三阶段:实战项目(3-4 周)¶
- 经典机器学习
- 线性回归
- 逻辑回归
-
简单神经网络
-
深度学习
- 卷积神经网络(CNN)
- 循环神经网络(RNN)
-
Transformer
-
量子机器学习
- 量子神经网络
- 变分量子算法
- 量子经典混合模型
推荐学习资源¶
官方文档¶
在线课程¶
书籍推荐¶
- 《深度学习框架 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(): 推荐使用,安全地从计算图中分离张量
Q4: 如何调试 PyTorch 代码?¶
A:
1. 使用 print() 或 tensor.shape 检查张量形状
2. 使用 tensor.requires_grad 确认梯度是否启用
3. 使用 torch.autograd.set_detect_anomaly(True) 检测梯度异常
4. 使用 Python 调试器(pdb)设置断点
Q5: 训练时梯度消失或爆炸怎么办?¶
A: - 梯度消失:使用 ReLU 激活函数、残差连接、批归一化 - 梯度爆炸:使用梯度裁剪
总结¶
PyTorch 是一个强大而易学的机器学习框架,它的核心概念包括:
- 张量:多维数组,支持 GPU 加速
- 自动微分:自动计算梯度,简化优化过程
- nn.Module:模块化构建神经网络
- 优化器:高效的参数更新算法
在 DeepQuantum 项目中,PyTorch 被用于: - 量子态和量子门的表示 - 变分量子算法的参数优化 - 批量量子模拟 - 自动微分计算
下一步行动¶
- 安装 PyTorch:
pip install torch - 运行第一个 PyTorch 程序
- 完成一个简单的机器学习项目
- 探索 DeepQuantum 项目中的量子计算应用
记住:学习编程最好的方式就是动手实践!
文档版本:v1.0 最后更新:2026-01-14 作者:基于 DeepQuantum 项目实战经验总结