01-深度学习基础
本节介绍深度学习的核心原理,包括神经网络、RNN、LSTM、Attention 等模型的数学直觉和在量化中的应用。
为什么量化需要深度学习?
传统量化方法的局限
传统量化建模流程:
原始数据 ─→ 手工特征工程 ─→ 线性模型/树模型 ─→ 预测
│
├── 移动平均
├── 动量指标
├── 波动率
├── 交叉特征
└── ...(数百个特征)
问题:
- 特征工程繁重:需要大量领域知识手动构建特征
- 时序依赖有限:树模型难以捕捉长期时间依赖
- 非线性表达不足:线性模型和简单树模型表达能力有限
- 跨品种泛化差:每个品种可能需要重新设计特征
深度学习的优势
深度学习建模流程:
原始数据 ─→ 自动特征学习 ─→ 非线性映射 ─→ 预测
│ │
│ └── 多层神经网络
│
└── CNN/RNN/Attention 自动提取模式
优势:
- 自动特征学习:从原始数据中自动学习有用的表示
- 强大的时序建模:LSTM/Transformer 擅长捕捉长期依赖
- 端到端训练:数据到预测的整个流程联合优化
- 跨品种迁移:预训练模型可以迁移到新品种
深度学习在量化中的典型应用
| 应用场景 | 传统方法 | 深度学习方法 |
|---|---|---|
| 价格预测 | ARIMA、GARCH | LSTM、Transformer |
| 高频交易 | 订单流特征 | CNN+LSTM 处理订单簿 |
| 因子挖掘 | 财务因子、技术指标 | 自动因子学习 |
| 风险预测 | 波动率模型 | VaR 预测网络 |
| 情感分析 | 词典匹配 | BERT 分析财经新闻 |
神经网络基础
神经元结构
x₁ ────────┐
│ w₁
▼
x₂ ──────[ Σ ]───→ f() ──→ y
▲
x₃ ────────┤ w₂
│ w₃
b ────────┘
其中:
• x₁, x₂, x₃ 是输入特征
• w₁, w₂, w₃ 是权重(weights)
• b 是偏置(bias)
• f() 是激活函数
• y 是输出
数学表达:
其中:
- 是权重向量
- 是输入向量
- 是偏置
- 是激活函数
激活函数
激活函数引入非线性,使神经网络能够拟合复杂的非线性关系。
| 激活函数 | 公式 | 导数 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|---|
| Sigmoid | 输出(0,1),适合概率 | 梯度消失,输出不零中心 | 二分类输出层 | ||
| Tanh | 零中心,输出(-1,1) | 仍有梯度消失 | RNN 隐藏层 | ||
| ReLU | 解决梯度消失,计算快 | 死神经元问题 | 大多数隐藏层 | ||
| Leaky ReLU | if , else | 解决死神经元 | 需要调 | 深 / 宽网络 | |
| GELU | 复杂 | 平滑,性能好 | 计算复杂 | Transformer/BERT |
可视化对比:
ReLU (最常用):
│
│ ╱
│ ╱
│ ╱
│ ╱
│ ╱
│╱
└─────── x
Leaky ReLU:
╲ │
╲│ ╱
│ ╱
│ ╱
│ ╱
│ ╱
│╱
└─────── x
GELU (平滑曲线):
│ ╭─
│ ╱
│ ╱
│─╱
│
└─────── x
前向传播和反向传播
前向传播(Forward Pass):从输入到输出的计算过程
反向传播(Backward Pass):根据损失计算梯度
根据链式法则逐层计算梯度。
损失函数
| 损失函数 | 公式 | 梯度 | 适用场景 |
|---|---|---|---|
| MSE | 回归任务 | ||
| MAE | $\mathcal{L} = \frac{1}{n}\sum_{i=1}^{n} | y_i - \hat{y}_i | $ |
| Huber | $\mathcal{L} = \begin{cases} \frac{1}{2}(y-\hat{y})^2 & | y-\hat{y} | \leq \delta \ \delta( |
| Cross-Entropy | 分类任务 |
梯度问题
梯度消失
深层网络中,梯度在反向传播过程中逐渐变小,导致浅层参数几乎不更新。
梯度在反向传播中的衰减:
输出层
│
▼ 梯度 = 1.0
│
第 L 层
│
▼ 梯度 = 0.5 (×0.5)
│
第 L-1 层
│
▼ 梯度 = 0.25 (×0.5)
│
...
│
▼ 梯度 ≈ 0 (几乎消失!)
第 1 层
原因:
- 链式法则中多个小于1的梯度相乘
- Sigmoid/Tanh 激活函数的导数最大值小于1
解决方法:
- 使用 ReLU 激活函数(导数为1)
- 使用残差连接(ResNet)
- 使用归一化层(BatchNorm/LayerNorm)
- 使用 LSTM/GRU(专门设计解决此问题)
梯度爆炸
与梯度消失相反,梯度在反向传播中变得极大,导致参数更新过大。
解决方法:
- 梯度裁剪(Gradient Clipping):限制梯度的范数
- 权重初始化(Xavier/He 初始化)
- 降低学习率
梯度裁剪代码示例(PyTorch):
import torch
# 计算梯度
loss.backward()
# 裁剪梯度:最大范数为1.0
torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm=1.0)
# 更新参数
optimizer.step()序列数据的特点
量化时序数据有以下几个关键特点:
| 特点 | 描述 | 对建模的影响 |
|---|---|---|
| 时间依赖 | 当前值依赖历史值 | 需要记忆机制 |
| 非平稳性 | 分布随时间变化 | 需要滚动训练 |
| 噪声大 | 金融数据信噪比低 | 需要强正则化 |
| 长距离依赖 | 早期信息可能仍有影响 | 需要长期记忆 |
| 多变量交互 | 多个特征相互影响 | 需要多变量建模 |
示例:日收益率序列
2% ┐ *───┐
│ *─┘ │
1% ┤ *───┘ │
│ *─┘ │
0% ┼────*───*──────────────*─────── 时间
│ │ │
-1% ┤ │ │
│ │ │
-2% ┘ │ │
└────────────────────┘
特点:波动聚集(GARCH效应)、均值回归、偶尔的极端值
RNN 原理
基本结构
RNN(Recurrent Neural Network)通过隐藏状态(Hidden State)传递历史信息:
展开时间步:
t=1: t=2: t=3: t=4:
x₁ ──→ [RNN] ──→ h₁ ──→ [RNN] ──→ h₂ ──→ [RNN] ──→ h₃ ──→ [RNN] ──→ h₄
│ │ │ │
└──────────────┴──────────────┴──────────────┘
隐藏状态在时间步间传递
数学公式
其中:
- :t时刻的输入
- :t时刻的隐藏状态
- :隐藏状态到隐藏状态的权重
- :输入到隐藏状态的权重
- :隐藏状态到输出的权重
RNN 的局限性
- 梯度消失:长序列中梯度在反向传播时消失
- 短期记忆:难以捕捉长期依赖(>10个时间步)
- 顺序计算:无法并行,训练慢
RNN 的记忆衰减:
信息强度
│
│█
│██
│███
│████
│█████
│██████
│███████
└─────────→ 时间
t=1 t=5 t=10 t=15 t=20
早期信息迅速衰减
LSTM 原理
LSTM(Long Short-Term Memory)通过门控机制和细胞状态解决长期依赖问题。
核心思想
LSTM 内部结构:
┌─────────────────────────────────────┐
│ 细胞状态 (Cell State) │
│ ─────────────────→ │
│ (信息高速公路,很少改变) │
└─────────────────────────────────────┘
│ ▲ │
│ │ │
遗忘门 │ │ │ 输出门
(Forget Gate) │ │ │ (Output Gate)
┌─────┐ │ │ │ ┌─────┐
│ σ │ ────×──────→│ ├─────×───→ │ σ │
└─────┘ │ │ ────×──────→ └─────┘
▲ ┌┴┐ ▲ ▲ ▲
│ ││tanh │ │ │
┌───┴────┐ ┌───┴┴─────┴───┐ ┌───┴────┐ │
│ hₜ₋₁ │ │ Cₜ₋₁ │ │ Cₜ │ │
└────────┘ └──────────────┘ └────────┘ │
▲ │ │
│ │ │
┌─┴────┐ ┌───┴────┴───┐
│ xₜ │ │ hₜ │
└──────┘ └───────────┘
输入门 (Input Gate)
细胞状态(Cell State)
细胞状态是 LSTM 的”记忆高速公路”,信息可以在上面流动,改变很小:
其中 是逐元素乘法。
遗忘门(Forget Gate)
决定从细胞状态中丢弃什么信息:
直觉:fₜ 接近1时保留信息,接近0时遗忘信息。
遗忘门作用示例:
Cₜ₋₁ = [0.8, 0.3, 0.9] (之前的细胞状态)
fₜ = [0.1, 0.9, 0.5] (遗忘门输出)
─────────────────────────────────
fₜ ⊙ Cₜ₋₁ = [0.08, 0.27, 0.45] (遗忘后)
含义:
• 第1维信息几乎被遗忘 (0.8→0.08)
• 第2维信息大部分保留 (0.3→0.27)
• 第3维信息部分保留 (0.9→0.45)
输入门(Input Gate)
决定向细胞状态中存储什么新信息:
直觉:
- :决定哪些位置需要更新
- :候选的新信息
输入门作用示例:
iₜ = [0, 1, 1] (更新哪些位置)
C̃ₜ = [0.5, 0.6, 0.2] (候选新值)
─────────────────────────────────
iₜ ⊙ C̃ₜ = [0, 0.6, 0.2] (要添加的信息)
含义:
• 第1维不更新
• 第2、3维添加新信息
输出门(Output Gate)
决定输出什么信息作为新的隐藏状态:
直觉:基于细胞状态和当前输入,决定输出什么给下一时刻。
LSTM 完整计算流程
LSTM 单个时间步的完整计算:
输入:hₜ₋₁ (上一时刻隐藏状态), xₜ (当前输入)
─────────────────────────────────────────────────────────
1. 遗忘门:决定遗忘什么
fₜ = σ(Wf[hₜ₋₁, xₜ] + bf)
2. 输入门:决定存储什么
iₜ = σ(Wi[hₜ₋₁, xₜ] + bi)
C̃ₜ = tanh(WC[hₜ₋₁, xₜ] + bC)
3. 更新细胞状态
Cₜ = fₜ ⊙ Cₜ₋₁ + iₜ ⊙ C̃ₜ
4. 输出门:决定输出什么
oₜ = σ(Wo[hₜ₋₁, xₜ] + bo)
5. 更新隐藏状态
hₜ = oₜ ⊙ tanh(Cₜ)
输出:hₜ (当前隐藏状态), Cₜ (当前细胞状态)
GRU(Gated Recurrent Unit)
GRU 是 LSTM 的简化版本,只有两个门:
| 特性 | LSTM | GRU |
|---|---|---|
| 门数量 | 3个(遗忘、输入、输出) | 2个(更新、重置) |
| 细胞状态 | 单独的 C 和 h | C 和 h 合并 |
| 参数量 | 更多 | 更少 |
| 计算速度 | 稍慢 | 更快 |
| 性能 | 通常稍好 | 通常接近 |
GRU 公式:
模型对比
| 模型 | 长期依赖 | 参数量 | 训练速度 | 并行能力 | 量化推荐度 |
|---|---|---|---|---|---|
| RNN | 差 | 少 | 快 | 差 | ⭐⭐ |
| LSTM | 好 | 中 | 中 | 差 | ⭐⭐⭐⭐⭐ |
| GRU | 好 | 少 | 快 | 差 | ⭐⭐⭐⭐ |
| Transformer | 很好 | 多 | 慢 | 好 | ⭐⭐⭐ |
Transformer 和 Attention 机制
自注意力机制(Self-Attention)
Attention 允许模型在处理序列时关注不同位置的信息:
其中:
- (Query):查询向量
- (Key):键向量
- (Value):值向量
直觉:就像查字典,Query 是你想找的,Key 是每个条目的标签,Value 是内容。
Attention 可视化:
时间步: t-3 t-2 t-1 t
Query: [?]
↓ ↓ ↓ ↓
Key: [K1] [K2] [K3] [K4]
│ │ │ │
Value: [V1] [V2] [V3] [V4]
│ │ │ │
权重: 0.1 0.2 0.5 0.2
└─重点关注 t-1
输出 = 0.1*V1 + 0.2*V2 + 0.5*V3 + 0.2*V4
多头注意力(Multi-Head Attention)
使用多组 Q、K、V 并行学习不同的注意力模式:
位置编码(Positional Encoding)
Transformer 本身没有位置概念,需要显式编码位置信息:
量化场景下的模型选择
时序预测模型选择决策树
数据量大(>2年)?
├─ 是 → 序列特征明显?
│ ├─ 是 → LSTM / LSTM+Attention
│ └─ 否 → Transformer (如果数据特别大)
└─ 否 → 树模型 (XGBoost/LightGBM)
因果性要求严格?
├─ 是 → 单向 LSTM / GRU
└─ 否 → 双向 LSTM (注意数据泄漏)
多步预测?
├─ 是 → Seq2Seq / Transformer
└─ 否 → 单层 LSTM
LSTM vs Transformer 在量化中的对比
| 维度 | LSTM | Transformer |
|---|---|---|
| 数据需求 | 较少(>1年) | 大(>3年) |
| 训练速度 | 中等 | 慢(但可并行) |
| 长距离依赖 | 好(几十步) | 很好(几百步) |
| 计算资源 | CPU/GPU | GPU必需 |
| 调参难度 | 中等 | 高 |
| 量化应用 | 主流 | 新兴 |
核心知识点总结
1. 神经网络基础
- 神经元:线性变换 + 非线性激活
- 激活函数:ReLU 是首选,GELU 用于 Transformer
- 前向传播:输入 → 层层变换 → 输出
- 反向传播:链式法则计算梯度
2. 梯度问题
- 梯度消失:深层网络梯度衰减 → 用 ReLU、残差、LSTM 解决
- 梯度爆炸:梯度过大 → 用梯度裁剪解决
3. RNN/LSTM/GRU
- RNN:基本序列建模,但有梯度消失问题
- LSTM:三个门控制信息流,解决长期依赖
- GRU:LSTM 简化版,参数更少
4. LSTM 门控机制
遗忘门 fₜ:决定从 Cₜ₋₁ 遗忘什么
输入门 iₜ:决定向 Cₜ 存储什么
输出门 oₜ:决定输出什么作为 hₜ
细胞状态 Cₜ:信息高速公路,长期记忆
隐藏状态 hₜ:当前时刻的输出
5. Attention/Transformer
- Attention:让模型关注序列中的重要部分
- Multi-Head:学习多种注意力模式
- Positional Encoding:提供位置信息
练习建议
- 手算 LSTM:给定输入,手动计算一个时间步的 LSTM
- 可视化梯度:观察不同激活函数的梯度流动
- 对比模型:用相同数据训练 RNN、LSTM、GRU,比较效果
下一节
在 02-PyTorch框架入门.md 中,我们将学习如何用 PyTorch 实现这些概念。