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进入饱和区、梯度消失。对交易数据而言,这一点尤其重要:价格、成交量、技术指标的量纲差异大,若不缩放,注意力会过度集中在少数极端值上。

自注意力把序列建模从“逐步传递”变为“全局直接关联”,使模型能一步捕捉跨数十根K线的长程依赖,例如“早盘放量→午后回落→尾盘拉升”这类复合形态。

二、多头注意力:并行捕捉多种市场关系

单头注意力只能学到一种相似度度量。市场中的关系却是多重的:趋势延续、均值回归、波动聚集、量价背离。多头注意力把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编码器单层核心数据流 输入序列 价格/量/指标 位置编码 sin/cos + 时间特征 多头自注意力 Q·Kᵀ/√d_k → Softmax 8 heads × 16 dim Concat + W_O 残差 + 层归一化 x + Sublayer(x) LayerNorm Pre-LN 更稳定 前馈网络 FFN Linear → GELU → Linear 输出到下一层 信号预测表示 残差旁路(信息高速公路)

五、案例:用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
用未来信息 验证集虚高,实盘失效 严格因果掩码,禁止未来位置参与
复盘时建议可视化注意力权重矩阵:横轴为查询时间步,纵轴为被关注的历史时间步。若权重呈现明显的对角带,说明模型主要依赖近期信息;若出现跨长距离的亮斑,则可能捕捉到了周期性或事件驱动模式。
在交易信号预测中,任何位置编码、归一化或残差设计都必须服从“因果性”约束。编码器可以双向,但解码器或预测头必须使用因果掩码,否则回测结果将严重高估。