Transformer-XL:上下文如何跨过片段边界
早期 Transformer 处理长文本时,会把语料切成彼此独立的固定片段。片段长度既限制依赖距离,也制造 context fragmentation:每到边界,模型都像翻到一本缺少前页的书。
Transformer-XL 把“边界”从清空点改成状态接口。历史隐藏状态被缓存;处理下一片段时,query 来自当前内容,key 和 value 读取历史与当前状态。它保留的不是一枚压缩向量,而是一段可被 attention 检索的历史表示。
缓存分支使用 stop-gradient,反向传播仍停留在当前片段;前向状态却能跨片段、逐层传递,最大依赖长度随“层数 × 片段长度”增长。模型能利用多远的历史,不必与反向传播展开多远绑定。
状态复用也迫使位置编码改变。若每个片段都从位置 1 编号,历史与当前的同一槽位会产生歧义。论文把相对距离 i-j 写入 attention score,以“彼此相隔多远”维持时间一致性。相对位置不是附属组件,而是 recurrence 的另一半。
消融印证了两者缺一不可。在 WikiText-103 的 128M 设置中,完整方案为 26.77 PPL、有效 attention length 500;去掉 recurrence 后是 29.02 和 260;vanilla Transformer 则是 31.16 和 120。句子被打乱时 recurrence 仍有收益,说明它也修复了边界碎片化。
1874 倍加速也来自状态复用。当时的滑窗评估每预测一个 token,都把长度 L 的窗口跑过所有层,只保留最后一个位置;窗口右移一步后,尽管重合 L−1 个位置,历史状态仍全部重算。Transformer-XL 把状态变成 memory,每一步主要增量处理新位置。
attention length 从 800 增至 3800 时,加速由 363 倍升至 1874 倍:窗口越长,旧方法丢弃的重复计算越多。改变状态的生命周期,足以消除几个数量级的算法浪费。
Transformer-XL 留下的核心很清楚:长上下文不仅要扩大可见范围,还要复用历史表示,并用一致的位置关系把它们接起来。后来缓存成为生成系统的基础设施,延续的正是这条思路。
大模型 Transformer





