4. Transformer核心原理
在交易信号预测任务中,我们面对的是带有时间顺序、噪声显著、多因子耦合的序列数据。Transformer之所以能在这一场景中取代RNN与LSTM,核心在于它用一套可并行、可解释、可堆叠的机制,把“当前时刻该关注历史哪些位置”这件事交给模型自己学习。本节围绕五个关键部件展开:自注意力、多头注意力、位置编码、残差连接与层归一化。
一、自注意力机制:让每个时间步动态选择历史信息
自注意力的本质是一次“加权检索”。对输入序列的每个位置,模型生成三个向量:查询Q、键K、值V。Q代表“我现在想找什么”,K代表“我能提供什么特征”,V代表“我实际携带的信息”。注意力权重由Q与K的点积经缩放和Softmax得到,再对V加权求和。
Attention(Q, K, V) = softmax(Q·Kᵀ / √d_k) · V
# 在交易序列中的直观含义
# Q: 当前K线想参考的历史模式(如放量突破)
# K: 历史各时刻的可匹配特征(如缩量横盘、跳空高开)
# V: 历史各时刻的真实收益/波动信息
# 输出: 按相似度加权后的历史信息聚合
除以√d_k是为了防止维度增大时点积方差过大,导致Softmax进入饱和区、梯度消失。对交易数据而言,这一点尤其重要:价格、成交量、技术指标的量纲差异大,若不缩放,注意力会过度集中在少数极端值上。
二、多头注意力:并行捕捉多种市场关系
单头注意力只能学到一种相似度度量。市场中的关系却是多重的:趋势延续、均值回归、波动聚集、量价背离。多头注意力把Q、K、V投影到多个子空间,各自独立计算注意力,再拼接并线性变换。
MultiHead(Q, K, V) = Concat(head_1, ..., head_h) · W_O
head_i = Attention(Q·W_Qi, K·W_Ki, V·W_Vi)
# 典型配置(交易序列)
d_model = 128
num_heads = 8
d_k = d_v = d_model / num_heads = 16
每个头可以专注于不同模式:有的头关注相邻K线的短期反转,有的头关注日内周期性,有的头关注成交量突变。这种“分工”让模型在不显著增加参数量的前提下,获得更丰富的表示能力。
三、位置编码:为无序的注意力注入时间顺序
自注意力本身对位置不敏感——打乱输入顺序,输出只是相应置换。但交易序列中“先涨后跌”与“先跌后涨”含义完全不同。因此必须显式注入位置信息。Transformer使用正弦/余弦位置编码:
PE(pos, 2i) = sin(pos / 10000^(2i/d_model))
PE(pos, 2i+1) = cos(pos / 10000^(2i/d_model))
# pos: 时间步索引;i: 维度索引
# 不同频率的正余弦波使模型能通过线性关系推断相对位置
在交易场景中,位置编码还可以扩展为时间特征编码:把“星期几”“交易时段”“距开盘分钟数”等离散或周期变量编码后与价格特征相加,帮助模型区分早盘与尾盘的不同统计规律。
四、残差连接与层归一化:让深层网络稳定训练
Transformer通常堆叠多层。若没有残差连接,梯度在反向传播中会逐层衰减,深层网络难以训练。残差连接把输入直接加到子层输出上:
# Post-LN(原始Transformer)
x = LayerNorm(x + Sublayer(x))
# Pre-LN(训练更稳定,常用于金融时序)
x = x + Sublayer(LayerNorm(x))
层归一化对每个样本的特征维度做归一化,不依赖batch大小,因此非常适合交易数据中batch内样本分布差异大的情况。残差连接保证信息高速公路,层归一化稳定激活分布,两者结合使Transformer可以堆叠到数十层而不发散。
五、案例:用Transformer预测下一根K线方向
假设我们使用过去60根5分钟K线,输入特征包括开盘、最高、最低、收盘、成交量、RSI、MACD。模型配置如下:
d_model = 128
num_heads = 8
num_layers = 4
dropout = 0.1
position_encoding = sinusoidal + time_features
output = sigmoid(linear(d_model, 1)) # 涨/跌二分类
# 训练日志片段
Epoch 12 | train_loss 0.412 | val_loss 0.438 | val_auc 0.612
Epoch 13 | train_loss 0.398 | val_loss 0.431 | val_auc 0.621
Epoch 14 | train_loss 0.385 | val_loss 0.429 | val_auc 0.625
训练中若发现验证集AUC停滞而训练损失持续下降,通常说明模型记住了噪声。此时可提高dropout、减少层数、或对注意力权重加入稀疏正则,迫使模型关注更稳定的量价结构。
六、常见误区与复盘清单
| 误区 | 表现 | 修正建议 |
|---|---|---|
| 忽略位置编码 | 模型对时间顺序不敏感,预测随机化 | 加入正弦编码或可学习位置嵌入 |
| 头数过多 | 单头维度过小,注意力退化 | 保证d_k≥16,头数不超过d_model/16 |
| Post-LN直接用于深层 | 训练初期梯度爆炸或消失 | 改用Pre-LN或加warmup学习率 |
| 不做缩放 | Softmax饱和,注意力集中到极值 | 严格除以√d_k |
| 用未来信息 | 验证集虚高,实盘失效 | 严格因果掩码,禁止未来位置参与 |