2024年,Mamba用状态空间模型向Transformer发起挑战,但代价是一套复杂的CUDA定制核函数,普通开发者根本改不动。Caracal: Causal Architecture via Spectral Mixing
现在,另一条更"轻"的路线出现了:华为诺亚方舟实验室团队直接把快速傅里叶变换(FFT)塞进解码器,替代了全局自注意力。结果惊人——在8192 token长度下,训练速度比标准Transformer快近3倍,不需要任何位置编码,还能做自回归生成。更关键的是,它只用PyTorch标准库就能跑,不需要写一行CUDA代码。
2026论文复现及模型创新组合、上千顶会论文精粹、审稿人方法论、即插即用源码模块
👇🏻扫码即可无偿领取!👇🏻

Transformer的两大死穴:O(L²)复杂度和位置编码的枷锁
Transformer统治了序列建模七年,但骨子里有两个结构性硬伤。
第一个是计算复杂度的二次方诅咒。自注意力机制需要计算序列中每对token之间的关系,运算量随输入长度L呈平方增长,也就是O(L²)。当上下文从512涨到4096再到8192,训练时间和显存消耗不是线性涨,而是指数级爆炸。长文档理解、长视频分析、长对话记忆,这些场景在理论上都可行,但在工程上被二次方成本卡住了脖子。
第二个是置换等变性带来的位置盲区。注意力本身对token顺序不敏感,你把句子倒过来,注意力矩阵算出来的值一模一样。为了让它知道"第一个词"和"第十个词"的区别,研究者不得不外挂各种位置编码——从最早的绝对位置编码,到后来的RoPE、ALiBi、YaRN,技术越来越精巧,但也越来越像在给一个先天缺觉的模型打兴奋剂。
这些修补方案有效吗?
确实有效。稀疏注意力(Longformer、BigBird)通过固定连接模式降低计算量;Reformer用局部敏感哈希做自适应稀疏;RoPE和YaRN用相对距离编码显著改善了长度外推。
但论文里指出一个扎心的事实:这些日益复杂的技术,本质上都是在为一个缺乏内置序列概念的机制做补偿。就像给一辆没有方向盘的车装 increasingly sophisticated 的自动驾驶补丁,补丁再好用,也掩盖不了底层设计的缺失。
更激进的替代路线是状态空间模型(SSM)。Mamba和Mamba-2用选择性状态更新实现了线性复杂度O(L),性能追平甚至超越Transformer。
但代价也很明显:Mamba的峰值效率严重依赖硬件特定的定制CUDA核函数,选择性扫描和SSD算子需要深入底层优化才能跑快。这对研究者来说意味着高概念门槛,对工程师来说意味着部署和修改都很困难,对普通开发者来说意味着"黑盒感"极强——想调个内部逻辑,可能整个架构就崩了。
有没有一种方案,既能摆脱二次方复杂度,又不需要写CUDA,还能保留全局建模能力?
Caracal的破局思路:用FFT做全局混合,复杂度直接降到O(L log L)
华为团队给出的答案叫Caracal,核心动作只有两个:把全局自注意力换成Multi-Head Fourier (MHF)模块,然后把位置编码删掉。
FFT在信号处理领域用了几十年,它的超能力是把时域卷积变成频域乘法,把O(L²)的运算压缩到O(L log L)。Caracal把这个数学工具直接搬进了语言模型的核心层。输入序列先经过一个轻量级的因果1D卷积捕捉局部模式,然后被投影成两个分支:content stream和gate stream。两个分支分别做FFT,在频域里做逐元素相乘,再逆FFT回到时域,最后截断到原始长度并线性投影输出。
这个设计最巧妙的地方在于,FFT的基函数本身就是正弦和余弦,它们天然携带了频率和相位信息,而这些信息对token的绝对位置和相对距离是敏感的。换句话说,Caracal不需要像Transformer那样额外贴一个"位置标签",模型通过频域运算自己就能感知到"这个词在第几位"。论文里明确说:MHF模块inherently captures global positional information,显式位置编码变得多余。
当然,完全不用注意力也有风险。纯频域混合擅长捕捉长程依赖和周期性模式,但对细粒度的局部语法结构(比如n-gram、邻近词搭配)可能不够精准。Caracal的解法是保留少量滑动窗口注意力(SWA)层,每两个MHF层后面跟一个窗口大小256的局部注意力。这些SWA层专门处理近距离token关系,而MHF层负责全局信息整合。两者配合,既避免了全局注意力的二次方灾难,又保留了局部特征的精确提取能力。
与Mamba相比,Caracal的定位非常清晰:Mamba追求O(L)的极致线性,但付出了硬件依赖和实现复杂度的代价;Caracal接受O(L log L)的轻微妥协,换来的是完全基于标准库的实现。MHF模块的核心运算就是PyTorch里的torch.fft.rfft和torch.fft.irfft,加上标准的1D卷积和线性投影。不需要定制核函数,不需要手动调block size,换块GPU照样跑,改个内部逻辑也不会牵一发而动全身。

频域因果掩码:以前傅里叶模型做不了生成,现在解决了
用FFT做语言模型,之前不是没人试过。FNet把BERT里的注意力换成无参数的2D FFT,在编码任务上效果不错。但所有这类模型都有一个致命限制:它们是非因果的,只能做encoder-only的掩码语言建模,没法做自回归生成。
为什么?因为FFT本质上是对整个序列做全局加权求和。标准注意力可以通过因果掩码把未来token的权重置零,实现"只看过去"的自回归约束。但FFT是高度优化的原子操作,输入进去直接输出全局混合结果,中间没有"权重矩阵"这个可以被掩码的环节。如果硬要做因果, naive 的做法是对每个位置t单独做FFT,只输入前t个token,那训练复杂度会变成O(L² log L),比注意力还慢。
Caracal解决这个难题的方法非常数学化:把频域乘法当成时域因果卷积的快速实现。
具体流程是四步:先把序列通过零填充扩展到双倍长度(2L),然后做FFT变换到频域;在频域里让content和gate做逐元素相乘;接着逆FFT回到时域;最后把结果截断回原始长度L,丢弃后半段非因果的部分。这个"pad-FFT-multiply-iFFT-truncate"流水线,数学上等价于一个严格的因果卷积——输出位置t只依赖于输入位置0到t,绝不会偷看未来信息。
更关键的是,整个过程在训练时是一次并行的前向传播完成的,不需要像naive因果FFT那样做L次独立计算。复杂度严格控制在O(L log L),既保留了因果性,又没有牺牲训练效率。论文里把这个称为frequency-domain causal masking,并指出这是之前所有基于傅里叶的生成模型都没能跨过的门槛。
从第一性原理看,注意力和FFT其实在做同一件事:都是通过加权求和来混合token信息。注意力的权重是数据相关的动态矩阵α_tj,由query和key的 softmax 决定;FFT的权重是静态的复指数,只由位置决定。

Caracal的MHF模块通过gate stream动态生成滤波器,把静态的FFT升级成了数据相关的动态频域混合,既保留了FFT的效率,又恢复了类似注意力的表达能力。
MHF模块拆解:四步流水线,把频域卷积装进Transformer层
Caracal的核心是Multi-Head Fourier (MHF)模块,它的前向传播可以拆成四步,每一步都有明确的分工。
第一步,注入局部归纳偏置。输入先过一个轻量的因果1D卷积,卷积核只有3,左侧补零确保因果性。这一步专门捕捉局部语法模式,比如常见的n-gram搭配。论文里管这叫"补偿移除显式位置编码后的局部感知需求",说白了就是:全局混合交给FFT,但邻近词之间的关系还得有个专门的探针。
第二步,准备双分支信号。经过Layer Norm后,输入被投影成两个并行流:content stream(值分支)通过一个简单的线性层生成;gate stream(门控分支)则经过Linear→SiLU激活→1D分组卷积的嵌套结构。这个两阶段门控设计不是随便加的——分组卷积按head切分通道,让同一个head内部能集体学习共享的门控表示,实现head内的信息沟通。
第三步,频域因果混合。这是MHF的灵魂。content和gate分别做FFT变换到频域,然后逐元素相乘。频域里的乘法,对应时域里的卷积。为了严格保证因果性,序列先被零填充到双倍长度(2L),FFT相乘后再逆FFT回时域,最后截断回原始长度L,把非因果的后半段直接扔掉。这个"填充-变换-相乘-逆变换-截断"的流水线,数学上等价于一个严格的因果卷积,但复杂度只有O(L log L)。
第四步,投影输出。截断后的混合信号再经过一个线性层,整合多head信息,输出与输入同维度的表示。
整个MHF模块没有用到任何位置编码,因为FFT的基函数本身就是不同频率的正弦和余弦,它们的相位天然编码了token的绝对位置和相对距离。论文在消融实验里验证了这个论断:显式加上位置编码后,性能几乎没有变化(后面会细说)。
实测:速度追平Mamba,精度追平Transformer
Caracal到底能不能打?
团队在FineWeb-10B数据集上从头训练了四个尺寸的模型,与Llama(纯Transformer)、Mamba/Mamba-2(纯SSM)、Jamba(混合SSM-Attention)做严格对照。
Table 2展示了从Tiny到Large的scaling结果。
在Large规模(约724M参数),Caracal在9个基准上的平均准确率达到49.01%,与Llama(48.73%)、Mamba(49.00%)、Mamba-2(48.75%)、Jamba(49.07%)处于同一水平线。
具体到单项,Caracal在PIQA(物理常识)上拿到69.26%,超过所有对比模型;在LAMBADA困惑度上为29.39,优于Mamba的34.34和Mamba-2的36.32。
更广泛的对比在Table 3。团队采用了Behrouz等人(2025)的协议(340M参数、15B token、4096上下文),把Caracal与RetNet、GLA、DeltaNet、TTT、Gated DeltaNet、Moneta、Yaad、Memora等十余个亚二次架构放在同一起跑线。Caracal(Default)平均准确率达到46.62%,在这些基线中表现最强。即使去掉SWA层的纯MHF版本(Caracal w/o SWA),也能拿到44.92%,保持竞争力。
效率是Caracal最锋利的刀刃。Figure 2画出了不同上下文长度下的训练时间和token吞吐量。Llama的曲线随着长度增加呈典型的二次方爆炸:256长度时训练时间约33118秒,到8192长度时飙到94258秒。而Caracal几乎是一条平缓的直线,8192长度时仅34071秒,不到Llama的三分之一。在token吞吐量上,8192长度时Caracal达到约293504 tokens/s,与Mamba(289720)和Mamba-2(294498)基本持平,远胜Llama的106091。
长上下文信息提取任务(Table 4)揭示了当前的一个trade-off:Llama凭借密集点积匹配在SWDE和FDA上平均拿到9.55%,而Caracal为5.37%,与其他亚二次架构(Mamba 5.46%、Jamba 5.91%)处于同一梯队。这说明Caracal在细粒度精确检索上仍有提升空间,但它换来的是全局序列建模的极致效率。
消融实验:位置编码真的多余,局部注意力层不能全删
Caracal的设计选择有没有水分?Table 5用Large模型做了系统消融。
去掉SWA层(纯MHF),平均准确率从49.01%掉到48.22%,下降0.79个百分点。说明局部注意力层虽然占比不高,但对细粒度语言一致性有实质贡献。再去掉Pre-Conv(预卷积),进一步掉到47.82%。这两个局部模块叠加贡献了约1.2分的性能,证明纯频域混合需要局部组件打配合。
最关键的验证是加显式位置编码。论文把标准的位置编码重新装回Caracal,结果平均准确率几乎没变:48.94% vs 49.01%。这直接坐实了MHF模块自带位置感知能力,外部位置编码完全是冗余的。
两阶段门控 vs 单阶段线性投影(SSLP)的对比也很说明问题。把复杂的Linear_G1→SiLU→Conv1d_G2替换成单层线性门控,准确率从49.01%掉到48.05%。论文分析,分层门控能让head内部建立更丰富的通信,学出更具表达力的上下文感知滤波器。
Table 6进一步探索了MHF层与SWA层的混合比例。在Small模型(12层)上测试,5:1(稀疏SWA)平均43.04%,3:1为43.19%,2:1达到43.35%的峰值,1:1(密集SWA)反而回落到43.26%。这说明局部注意力不是越多越好——过多的SWA会打断频域全局建模与时域局部提取之间的协同。2:1是经验上的"sweet spot"。
结语:一条不用写CUDA的第三条路
Caracal的出现,在Transformer和SSM之间划出了第三条路。它不像Mamba那样追求极致的O(L)线性复杂度而牺牲实现简洁性,也不像稀疏注意力那样在二次方的框架里修修补补。O(L log L)的复杂度对绝大多数实际场景来说已经足够快,而标准FFT库带来的硬件无关性,让研究和部署的门槛大幅降低。
论文在Limitations里坦诚了两点:一是当前验证最大到724M参数,万亿参数级别的大规模预训练还需要进一步验证;二是在细粒度信息检索任务上(如Table 4所示),Caracal仍落后于密集注意力模型,未来可以通过多尺度门控或层次化混合来缩小这个"分辨率差距"。
但即便如此,Caracal已经证明了一件事:用傅里叶变换替代注意力,不是理论上的浪漫想象,而是工程上的可行方案。它不需要定制CUDA,不需要复杂的状态空间对偶理论,不需要 increasingly sophisticated 的位置编码补丁。几行PyTorch标准代码,就能搭出一个训练快3倍、性能不打折、还能自回归生成的语言模型。
当行业越来越卷向超长上下文,也许真正需要的不是更复杂的注意力变体,而是回到更基础的数学工具——让正弦和余弦去做它们最擅长的事。



497

被折叠的 条评论
为什么被折叠?



