Transformer-XL
Transformer-XL 会缓存前一个文本片段的隐藏状态并使用相对位置,使语言模型能够跨片段保留上下文。
Transformer-XL 是一种Transformer语言模型,它会缓存前一文本片段的隐藏状态,并让下一个片段对这些状态进行注意,从而在固定长度的文本片段之间传递上下文。卡内基梅隆大学和 Google Brain 的 Zihang Dai、Zhilin Yang 及其同事在 ACL 2019 上发表的论文《Transformer-XL:超越固定长度上下文的注意力语言模型》中介绍了该模型。使用固定片段训练的普通 Transformer 将每个片段视为独立的上下文窗口,因此无法看到当前片段开头之前的内容;作者将这个问题称为上下文碎片化。Transformer-XL 学到的依赖关系比循环神经网络(RNN)长 80%,比普通 Transformer 长 450%。
片段级循环#
模型处理一个片段时,每一层都会将缓存的前一片段隐藏状态与当前片段的隐藏状态拼接起来。查询只来自当前片段,而键和值则涵盖两个片段;梯度会在缓存处停止传播,因此每个片段的训练成本保持不变。下面通过 PyTorch 中的单个注意力层展示这种模式:
import torch
from torch import nn
torch.manual_seed(0)
seg_len, dim = 4, 16
attn = nn.MultiheadAttention(dim, num_heads=2, batch_first=True)
hidden = torch.randn(1, 3 * seg_len, dim) # hidden states for three consecutive segments
memory = torch.empty(1, 0, dim) # nothing is cached before the first segment
for i, segment in enumerate(hidden.split(seg_len, dim=1), start=1):
# Queries come from the current segment; keys and values also cover the cached one
context = torch.cat([memory, segment], dim=1)
out, weights = attn(segment, context, context)
print(f"Segment {i}: {weights.shape[1]} queries attend over {weights.shape[2]} positions")
# Cache this segment for the next one; detach() stops gradients as in Transformer-XL
memory = segment.detach()第一个片段中的 4 个查询只能看到该片段的 4 个 token,之后每个片段中的查询都能看到 8 个 token:当前片段的 4 个,加上缓存的 4 个。由于某个片段第 n 层读取的是前一个片段第 n − 1 层的缓存状态,每增加一层,感受范围就会多延伸一个片段;当片段长度为 N 且层数为 L 时,范围约为 N × L 个 token:
缓存还能加快评估速度。普通 Transformer 逐个预测 token 时,每生成一个新 token 都必须重新计算整个窗口;Transformer-XL 则会复用缓存状态,因此评估速度最高可提升 1,800 多倍。当脚本逐帧向 model.track() 传递视频时,Ultralytics YOLO26 跟踪也会遇到相同的碎片化问题:persist=True 会在调用之间保留跟踪器状态,因此每个物体在相邻帧中都能保持相同的 ID。
相对位置编码#
复用缓存状态会破坏绝对位置编码:缓存片段的第一个 token 和当前片段的第一个 token 会带有相同的位置嵌入。Transformer-XL 改为根据查询和键的内容,以及两者距离的正弦编码来计算每个注意力分数,并使用两个跨位置共享的可学习偏置向量,分别表示内容和位置。由于分数仅取决于距离,模型在评估时可以关注比训练时更长的缓存。旋转位置嵌入(RoPE)也会让注意力分数取决于相对位置,大多数当前的大型语言模型(LLM)都在使用这种方法。
成果与影响#
Transformer-XL 在五项基准测试中取得了新的最先进结果:在 enwik8 上达到每字符 0.99 bit,在 text8 上达到 1.08 bit;在 WikiText-103、One Billion Word 和 Penn Treebank 上的困惑度分别为 18.3、21.8 和 54.5,且无需微调。该模型仅在 WikiText-103 上训练,就能生成数千个 token 长、连贯性尚可的新文章。多位相同作者提出的 XLNet 基于 Transformer-XL 架构进行自然语言理解预训练;DeepMind 的压缩 Transformer 则通过压缩旧记忆而不是丢弃旧记忆来扩展缓存。
Transformer-XL 与相关模型的比较#
- 长短期记忆网络(LSTM):逐个 token 更新一个隐藏状态,因此较早的信息必须经过中间的每一步才能传递到当前。
- Longformer:通过窗口注意力和全局注意力,一次读取整篇包含 4,096 个 token 的文档,无需循环处理。
- KV 缓存:在生成过程中存储较早 token 的键和值,避免重复计算。Transformer-XL 的记忆也用于训练,并在片段边界处停止梯度传播。
- 状态空间模型(SSM):将完整历史信息压缩到固定大小的状态中。










