
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)的感知,而不是來自一個稍微花哨一點的最佳化器。