
PyTorch 基础:构建与训练模型
最流行的深度学习框架——动手入门
即时执行与研究速度
PyTorch 默认采用即时执行(eager execution):张量在 Python 运算之间流动,你可以像处理普通数据一样打印、切片和调试。这在金融领域很重要,因为这份工作有一半是在重塑杂乱的特征面板,并验证你喂给模型的张量里没有偷偷混入未来信息(look-ahead)。
把它和旧的「先构建静态计算图,再运行一个 session」工作流对比一下。研究者仍会导出模型用于部署,但日常工作受益于即时性:改一层、重跑一个单元格、检查激活值。
张量、设备与 Autograd
张量(tensor)是一个多维数组;requires_grad=True 标记出你想求导的叶子节点。Autograd 会记录运算以构建一张反向计算图,从而让 loss.backward() 把梯度填充到参数的 .grad 上。
import torch
x = torch.randn(32, 10, requires_grad=True)
w = torch.randn(10, 1, requires_grad=True)
y = (x @ w).mean()
y.backward()
print(w.grad.shape)
在可用时把张量放到 cuda 或 mps 上;保持设备放置一致,这样你就不会在每一步中不小心把小张量来回搬动。
把 nn.Module 当作组合来用
继承 nn.Module,在 __init__ 中定义各层,并在 forward 中把它们连接起来。注册机制确保参数会出现在 model.parameters() 中,供优化器使用。
import torch.nn as nn
class MLP(nn.Module):
def __init__(self, n):
super().__init__()
self.net = nn.Sequential(
nn.Linear(n, 64), nn.ReLU(), nn.Linear(64, 1)
)
def forward(self, x):
return self.net(x)
对于序列模型,nn.LSTM 和 nn.TransformerEncoder 层很常见;对于表格型 alpha,MLP 和梯度提升(gradient boosting)依然各有胜负——靠验证纪律来选,而不是靠跟风。
四行循环(外加一些卫生习惯)
训练之所以重复,是刻意为之:前向、损失、清零梯度、反向、更新。那些额外的细节同样重要:model.train() 与 model.eval() 会切换 dropout 和 batch norm 的行为;torch.no_grad() 包裹验证过程以节省内存。
Dataset、DataLoader 与信息泄漏
继承 Dataset 来实现特征和标签的物化;再用 DataLoader 包装以进行分批。对于按时间顺序排列的数据,验证集通常保持 shuffle=False;如果你切的是连续窗口,训练集也常常如此——否则你会把信息跨时间抹开。
如果你用来自 GaiaEx 或类似数据源的 tick 数据来训练,请把所有 K 线对齐到同一个时钟,明确处理缺失的成交记录,并把你的特征代码和模型检查点(checkpoint)一起做版本管理。
TorchScript 与服务边界
为了低延迟推理,团队往往会对模型做 trace 或 script,然后在 C++ 运行时或一个 sidecar 服务里运行它。把训练环境(库的版本)固定为你导出时所用的那一套。
PyTorch Lightning 之类的框架能减少多 GPU 训练和日志记录的样板代码;但它们替代不了精心的特征设计。交易中的优势通常来自数据卫生和对市场状态(regime)的感知,而不是来自一个稍微花哨一点的优化器。