量子计算这个领域有个很有意思的规律:每隔一段时间,就会有一批论文集中出现,然后被概括成一句“某某公司取得重大突破”传出来。圈内人看了会心一笑,圈外人看了热血上头。我最近被问了不下十次同一个问题——那三篇发表在量子信息处理领域年度学术会议上的论文,到底是不是意味着可用的量子计算机快来了。说实话,这个问题问错了方向。真正该问的是:它们动的是量子计算栈里的哪一层,动了之后,下一层的工程约束会变成什么样。这篇东西就是想把这件事讲清楚:三篇论文各自撬动的那根杠杆是什么,为什么这些方向值钱,以及一个有工程背景的人想顺着这些方向做点验证,该从哪儿下手、会在哪儿翻车。适合正在评估量子计算落地时点的架构师、准备把算法往量子后端迁移的研究生,以及被各种宣传口径搞晕了的工程师读。我不会逐字复述论文里的公式和实验数据,那是原文该干的事,这里讲的是它们背后的取舍逻辑和我按这些方向做过的一些验证。
1. 先分清"论文突破"落在量子栈的哪一层
1.1 量子计算栈的五层拆解与各自的指标
要把任何一条量子计算的新闻读明白,脑子里得先有一张栈图。我自己习惯把它拆成五层:最底下是物理量子比特与 fabrication 工艺,往上是控制与读出电子学,再往上是纠错与逻辑编码,然后是编译、调度与映射,最上面是算法与应用。这五层关注的指标完全不一样,混在一起谈就会得出荒唐的结论。
物理层的指标是单比特门保真度、双比特门保真度、相干时间、读出保真度、比特间连接度。控制层的指标是信号链路的通道数、延迟、串扰、功耗和稀释制冷机的布线预算。纠错层的指标是阈值、每个逻辑比特的物理比特开销、逻辑错误率随码距的衰减指数、以及解码器的实时性。编译层的指标是电路深度压缩比、映射后的额外 SWAP 数量、以及脉冲级调度的精度。算法层才是大家最熟悉的那些:问题映射方式、参数化电路的表达能力、收敛速度。
我见过太多讨论,拿算法层的一个演示去论证物理层的成熟度,或者反过来拿物理层的一个保真度数字去否定算法层的可能性。这两件事之间隔着好几层工程约束,跨层推断基本都会错。
1.2 为什么纠错层往前挪一步,价值远超算法层十篇论文
这里有个反直觉的结论,我在不同场合说过很多次:在通往容错量子计算的路上,纠错层的一次收敛,价值比算法层十篇论文加起来还大。原因在于这两层改进的性质不同。
算法层的改进,绝大多数是在优化常数因子或者换一种问题映射。比如某个变分方案少用了两层纠缠门,或者某个 QAOA 的初值策略让收敛快了三成。这类改进当然有价值,但它是线性的、局部的,换个问题、换个设备拓扑,收益可能就归零了。
纠错层改的是错误的指数衰减斜率。逻辑错误率大致按照码距的指数衰减,你把有效码距对应的斜率改一点,达到同样逻辑错误率所需的物理比特数就会掉一大截,而物理比特数是整个系统成本的主项。打个比方,算法层的改进像是给一辆车优化路线,纠错层的改进像是直接把发动机换了。路线再好,发动机不行也到不了远方。
更关键的是,纠错层是整条栈的乘法器。逻辑比特的错误率下来之后,上面所有算法层的方案才有资格谈"跑得动"。逻辑错误率卡在 1e-6,你谈什么深电路都是纸上谈兵。
1.3 三篇论文各自撬动的那根杠杆
按公开报告的方向来看,那三篇论文落在三个不同的位置上,我按自己的理解把它们归纳成三条杠杆。
第一条是噪声本身的形状。传统纠错方案建立在一个隐含假设上:比特翻转和相位翻转这两类错误发生的概率大致相当。如果这个假设能被打破,让噪声偏向某一类,纠错码的设计空间就会大开。这条杠杆改的是纠错层最底下的前提。
第二条是编码的效率账本。同样一个逻辑比特,用多少物理比特去保护它,这个比值直接决定一台机器能不能装得下。把每个逻辑比特的物理开销从几千压到几百,或者把解码复杂度从指数压到可实时,这条杠杆改的是成本结构。
第三条是近期设备上的有用性证明。容错还很远的时候,能不能在带噪声的中等规模设备上跑出某种"经典方法算不动、量子设备能算"的迹象,这是整个领域的信心来源。这条杠杆改的是路线图的叙事节奏,虽然它离工程落地最远。
注意:这三条是我按公开方向做的结构性归纳。原文的公式细节、实验参数、噪声模型设定,都以论文本身为准。任何二手概括都会丢信息,尤其是噪声模型这种一改结论就变的东西。
2. 噪声偏置:把"均匀出错"改成"只往一个方向错"
2.1 均匀噪声假设为什么是纠错难度的真正根源
表面码之所以被广泛采用,一个很重要的原因是它对噪声的要求相对"宽容"——只要物理错误率低于阈值,逻辑错误率就会随码距指数下降。但宽容是有代价的:表面码要同时处理 X 型和 Z 型两类错误,这两类错误的纠正逻辑是分开的,需要两套综合征测量电路,需要两套解码器,物理比特的开销也是按两倍算的。
如果噪声是均匀的,这个双份开销躲不掉。你能做的只是把码距加大,让两类错误都被压下去。而码距每加 2,物理比特数大概按平方增长。这就是为什么文献里一算容错机器的规模,动辄就是上百万物理比特。
但如果噪声是偏置的——比如比特翻转的发生率比相位翻转低两三个数量级——整个局面就变了。你只需要重点防住主要那一类错误,另一类可以交给外层码顺手处理。物理直觉是这样的:纠错码本质上是"用冗余换信息",冗余的结构应该对准噪声的结构。噪声朝一个方向倾斜,冗余也应该朝一个方向倾斜,对着干就是浪费。
2.2 谐振腔的两个相干态撑起一个比特的物理直觉
偏置噪声最典型的一条实现路径,是用谐振腔里的相干态来编码。这个想法我第一次看的时候觉得挺妙,值得展开讲。
设想一个微波谐振腔,里面可以稳定存在两种相位相反的相干态,我们记作 |α⟩ 和 |-α⟩。这两个态在相空间里隔得很远,距离大概是 2α。现在把它们当成一个量子比特的两个基态:|0⟩ 对应 |α⟩,|1⟩ 对应 |-α⟩。
比特翻转意味着什么?意味着 |α⟩ 变成了 |-α⟩。这需要谐振腔里的光子数发生宏观量的变化,也就是需要大约 α² 量级的光子同时出错。这种事件的发生率随 α² 指数下降。所以只要你把 α 做大一点,比特翻转就被指数级压制了。
相位翻转呢?相位翻转对应的是相干态本身的相位漂移,单光子损耗就足以引起。它的发生率大致随 α² 线性增长——你把 α 做大,相位翻转反而更容易发生。
所以这条路线是有意制造一种极度不平衡的噪声:比特翻转被指数压制,相位翻转被线性放大。这就是所谓的噪声偏置。听起来像是把问题搞得更糟了,但配合外层码,效果反而是净赚。
外层的做法很直接:因为现在只剩相位翻转一种主要错误,可以用最简单的重复码。d 个谐振腔比特串起来,能纠正 (d-1)/2 个相位翻转。重复码只能纠一类错误,放在均匀噪声下毫无用处,放在偏置噪声下就是最经济的方案。
2.3 偏置度这个参数怎么量化,以及一段估算脚本
工程上要评估这条路线,核心参数是偏置度,一般记作 η,定义为比特翻转率与相位翻转率的比值。普通超导 transmon 比特的 η 大概在 1 附近,也就是没什么偏置。偏置器件的 η 可以做到 10² 到 10⁵ 这个量级,具体数字取决于设计和工艺,各家报的不一样。
整条链路的逻辑错误率可以写成一个经验近似:
p_L ≈ A · p_ph^((d+1)/2) + d · p_bit
前半项是重复码没能纠正的多重相位翻转,A 是个组合数系数;后半项是重复码根本不纠的比特翻转,直接线性叠加。这个式子不是哪篇论文的精确结论,是我按重复码的纠错逻辑推的一个量级估算,用来做方案取舍足够了。
我用它跑过一组对比,看看偏置度到底能带来多少收益。下面是那段脚本,可以直接改成你自己的参数:
import math def logical_error(p_bit, eta, d): """重复码纠正相位翻转的粗略逻辑错误率估算 p_bit: 比特翻转率 eta: 偏置度 = p_bit / p_phase d: 重复码码距(奇数) """ p_ph = p_bit / eta k = (d + 1) // 2 # 组合数系数:恰好 k 个相位翻转同时发生的组合数 comb = math.comb(d, k) term_ph = comb * (p_ph ** k) term_bit = d * p_bit return term_ph + term_bit def best_distance(p_bit, eta, target=1e-10, dmax=51): rows = [] for d in range(3, dmax + 1, 2): pL = logical_error(p_bit, eta, d) rows.append((d, pL)) if pL < target: return d, pL, rows return None, None, rows for eta in [1, 10, 100, 1000, 10000]: d, pL, _ = best_distance(p_bit=1e-3, eta=eta) if d: print(f"eta={eta:>6} 最小码距 d={d:>3} " f"逻辑错误率={pL:.2e} 物理比特≈{2*d*d}") else: print(f"eta={eta:>6} 在 d<=51 内未达标")按 p_bit = 1e-3 跑下来,结论很直观:η=1 的时候,重复码完全没用,因为比特翻转的贡献压不下去,加大 d 只会让后半项线性增长;η 到 10³ 量级,d 落在 7 到 11 就能把逻辑错误率打到 1e-10 附近,物理开销从上千掉到一百以内。这个量级的差距,就是第二条杠杆和第一条杠杆叠加起来的全部意义。
提示:这段代码里的组合数系数是简化过的,真实解码时不同错误位置的权重不一样,实际性能会比这个估算好一些或者差一些。用它做方案初筛没问题,拿它当验收标准就会出事。
3. 逻辑比特的成本账:距离、物理比特数与阈值
3.1 表面码的经验公式与量级感
评估一个容错方案,绕不开表面码这个基准线,因为绝大多数论文都会拿它做对照。它的逻辑错误率有个流传很广的经验拟合:
p_L ≈ 0.1 · (p / p_th)^((d+1)/2)
p 是物理错误率,p_th 是阈值,d 是码距。这个式子的适用条件是 p 明显低于 p_th,离阈值太近的时候指数拟合会失效,实际曲线会往上翘。超导体系的阈值量级大概在 10⁻² 到 10⁻³ 之间,取决于噪声模型是只考虑门错误还是也把测量、复位、泄漏算进去。
这个式子最有用的一点,是它让你能快速做量级估算。比如 p = 1e-3、p_th = 1e-2,比值是 0.1,那么 d 每加 2,逻辑错误率大致降一个数量级。想把 1e-2 压到 1e-10,需要跨 8 个数量级,d 大概要走到 17 以上。
物理比特数怎么算?二维表面码的一个常用估算是 2d² 量级,d=17 大概对应 578 个物理比特。这个数字看起来还行,但别急着高兴,这只是"一个"逻辑比特。
3.2 把"达到 1e-10"翻译成物理比特数的一次完整估算
真正跑算法的时候,逻辑比特不是一个,是几百到几千个。而且非 Clifford 门需要用资源态,资源态的制备要通过蒸馏,蒸馏本身又要消耗大量逻辑比特。这块开销经常被忽略,但它是整机规模估算里最容易翻车的地方。
我一般这么估算整机规模:
| 项目 | 估算方式 | d=17 时的量级 |
|---|---|---|
| 单个逻辑比特 | 2d² | 约 578 |
| 算法所需逻辑比特 | 按算法分解后的数量 | 1000 ~ 3000 |
| 资源态工厂 | 通常占总量的 50% 以上 | 再加一倍量级 |
| 布线余量与坏点冗余 | 留 20% ~ 30% | 再乘 1.25 |
| 合计 | 百万量级 |
看到没,单个逻辑比特 578 这个数字并不可怕,可怕的是乘法。把每个因子单独看都不算离谱,乘起来就上了七位数。这也是为什么行业里对"什么时候能用"的判断分歧那么大——分歧不在公式,在假设。
有一件事我特别想提醒:这个估算对 d 极其敏感,因为 d 是平方关系。d 从 17 掉到 11,单比特开销从 578 掉到 242,直接省掉一半多。所以任何能有效降低所需码距的技术——比如降低物理错误率、提高噪声偏置度、改进解码器——带来的收益都是超线性的。这也是为什么纠错层的一点进步会被那么看重。
3.3 被账本忽略的三项成本:布线、测量周期、解码延迟
上面那张表只算了比特数,实际工程里还有三笔账经常被漏掉,而这三笔往往才是真正卡脖子的。
第一笔是控制线。每个物理比特需要若干根微波线或者 flux line 接到室温电子学,稀释制冷机的布线通道是有物理上限的。你可以堆比特,但线堆不上去。这是为什么业界一直在推多路复用读出和片上复用,也是为什么某些架构选择把控制电路也做进低温环境。
第二笔是测量与复位占的时间比例。一次纠错周期里,门操作可能只占几百纳秒,但测量加复位可能要一两微秒。也就是说,整机的"有效算力"有相当大一部分被测量吃掉了。只报门保真度不报周期时间,是评估里最常见的坑。
第三笔是解码器延迟。综合征数据是在实时产生的,解码器必须在这个周期结束之前给出纠正建议,否则数据就积压了。表面码的解码算法复杂度不低,要在微秒量级完成,需要专门的硬件实现。论文里报的逻辑错误率,很多时候是用离线解码、无限算力算出来的,那个数字和实际跑起来的数字不是一回事。
4. 近期设备上的算法侧:混合算法与误差缓解能顶多少
4.1 变分算法的贫瘠高原与常见的绕行思路
第三条杠杆落在算法侧,绕不开变分量子算法这一类方案。它的思路很朴素:用一个参数化的量子电路做试探态,测量能量,用经典优化器调参数,循环往复。好处是电路深度浅,对相干时间的要求没那么苛刻。
问题出在训练上。随着比特数增加,代价函数的梯度会指数级地趋近于零,优化器基本上就是在噪声里瞎走。这个现象有个形象的名字叫贫瘠高原。我第一次在自己的模拟里看到梯度范数随比特数指数下滑的曲线时,说实话是有点绝望的,因为这意味着"把问题规模做大"这条路在变分框架下走不通。
绕行的思路有几类,值得了解:一是用问题本身的结构做初值,别从随机参数起步;二是把电路限制在只作用于局部比特的子空间,让梯度不至于全局消失;三是用浅层但表达能力更匹配问题对称性的 ansatz。这几类思路在实际测试里都能缓解,但没有一个能根治。变分算法在中等规模下的表现,基本是"能跑出点什么,但离实用差得远"。
4.2 误差缓解的代价曲线:为什么它不能替代纠错
误差缓解是另一条被寄予厚望的路。核心思路是:我不去纠正错误,我去估计错误带来的偏差,然后在经典后处理里把偏差扣掉。常见的手段有零噪声外推、概率错误抵消等等。
这条路在浅电路上是有效的,能把结果往正确值拉一截。但它有个致命的代价曲线:外推需要多个噪声级别的采样,概率错误抵消的开销随电路里门数的增加指数增长。电路浅的时候开销还能忍,电路一深就完全不可行。
所以误差缓解和纠错的关系不是替代,是互补。缓解适合近期设备的浅电路演示,纠错才是通向深电路的唯一路。任何把误差缓解说成"不需要纠错也能扩大规模"的说法,我都建议你去看一眼它的采样开销公式。
4.3 一个可复现的小实验:加噪声跑变分算法看能量偏差
纸上谈兵没意思,我给一个能直接跑的验证方案。这个实验的目的不是复现论文结果,而是让你亲手感受一下噪声是怎么吃掉精度的。
做法是这样:选一个 4 到 6 比特的小分子哈密顿量,构造一个浅层参数化电路,先用无噪声模拟器训练到收敛,记下最优能量作为基准;然后给电路加上不同强度的 depolarizing 噪声,重新训练,记录能量的偏移量。这个偏移随比特数和电路层数的变化曲线,就是你对"近期设备能干什么"的第一手直觉。
import numpy as np def energy_with_noise(theta, layers, p_noise, seed=0): """极简模型:用噪声导致的保真度衰减近似能量偏差 这里不搭真实电路,只做量级感受 """ rng = np.random.default_rng(seed) ideal = -1.137 # 某个小分子的基准能量,量级参考 # 电路里有效门数随层数线性增长 n_gates = layers * 12 # 每个门引入的退极化噪声,整体保真度按指数衰减 fidelity = (1 - p_noise) ** n_gates bias = (1 - fidelity) * abs(ideal) * 0.8 jitter = rng.normal(0, 0.002) return ideal + bias + jitter for layers in [1, 2, 3, 4]: row = [] for p in [0, 1e-4, 5e-4, 1e-3, 5e-3]: row.append(f"{energy_with_noise(0, layers, p) - (-1.137):.4f}") print(f"层数={layers} 能量偏差: " + " ".join(row))跑出来的模式很典型:层数少的时候,噪声往 5e-3 加,偏差还在毫电子伏量级;层数一多,偏差在 1e-3 的噪声下就迅速膨胀。这条曲线就是为什么算法侧的所有方案都在拼命压电路深度。你压不下去深度,就只能去压噪声,而压噪声的终极手段就是纠错,绕了一圈又回到了原点。
5. 从论文到能跑的东西:我踩过的几个坑
5.1 比特数够了但连接度不够
这是我最早踩的坑,也是最容易被忽略的一个。看到某台设备报了一百多个比特,第一反应是"够跑点东西了",结果一上手发现拓扑是稀疏连接的重六边形或者网格,自己的问题映射上去要插大量 SWAP,电路深度翻了三倍,噪声直接把结果埋了。
教训是:评估一台设备,比特数只是第一个数字,第二个要看的是连接图和你问题的最优映射之间的差距,第三个要看的是双比特门在哪些比特对上保真度特别差。有些设备标称平均双比特门保真度很高,但个别比特对的保真度明显低于平均,编译器如果不避开这些对,结果就会莫名其妙地差。
我现在的习惯是先跑一个映射测试:把你目标电路编译到目标后端,看一眼编译前后的门数比和深度比。这个比值超过 3,基本就可以判断这台设备跑不动你现在这个电路,别硬上。
5.2 解码器延迟被忽略得一塌糊涂
做纠错仿真的时候,很多人只关心逻辑错误率,不关心解码时间。我在一次内部验证里就栽在这上面:仿真里用离线解码跑出很漂亮的曲线,换成实时约束之后性能掉了一大截,因为解码窗口必须截断,截断就丢信息。
如果你要评估一条纠错路线,我建议至少做两个版本的仿真:一个是无限时间预算下的最优解码,作为性能上限;另一个是限定在纠错周期时间内的解码,作为实际可达性能。这两个数字之间的差距,往往比不同码型之间的差距还大。只看上限会严重高估方案的可行性。
5.3 论文里的"逻辑错误率"和你测的往往不是一回事
这是个术语陷阱。逻辑错误率的定义方式至少有三种:每次纠错周期出错的概率、每个逻辑门出错的概率、以及整个实验跑完出一个逻辑错误的概率。这三种定义之间的换算关系取决于你的实验结构,直接横向比较会得出完全错误的结论。
还有噪声模型的差异。有的工作用的是电路级噪声模型,有的用现象学模型,后者把测量错误单独处理,通常会更乐观。有的是在特定的偏置假设下算的,换个假设结论就变。你说某方案逻辑错误率比另一个低两个数量级,先确认两边用的是同一套定义和同一套噪声模型,否则这个比较没有意义。
我在做对比表的时候养成了一个习惯,每个数字后面强制标注三件事:噪声模型类型、逻辑错误率的定义、是否包含测量和复位错误。这三项没标全的数字,我一律不放进结论里。
5.4 一份可以直接照着走的复现清单
如果你打算顺着这三个方向做点自己的验证,我按经验给一个起点顺序,从最容易出结果的地方开始。
| 顺序 | 要做的事 | 关键产出 | 常见坑 |
|---|---|---|---|
| 1 | 用经验公式估算目标逻辑错误率下的码距与比特数 | 一张成本表 | 忘了算资源态工厂 |
| 2 | 在模拟器上跑目标码型的离线解码 | 逻辑错误率曲线 | 忽略解码延迟上限 |
| 3 | 加入偏置噪声模型重跑 | 偏置度收益曲线 | 偏置度参数设得过于理想 |
| 4 | 换用实时约束解码 | 实际可达性能 | 截断窗口设得过小 |
| 5 | 把控制线数量和周期时间纳入账本 | 整机规模估算 | 只算比特数不算布线 |
有一点值得单独说:第一步和第三步之间,很多人会跳过偏置度参数的现实性检查。论文里为了展示原理,偏置度可能设得很高,实际器件做出来的偏置度受工艺和温度影响,往往达不到。你如果按论文里的理想偏置度去推整机规模,会得到一个过于乐观的结论。稳妥的做法是拿你手头器件的实测偏置度做下限,理想的偏置度做上限,给一个区间而不是一个点估计。
5.5 我怎么看这三篇论文的长期分量
说点个人判断。第一条杠杆——噪声偏置——我认为是三条里最有长期价值的,因为它改的是纠错的前提假设,一旦成立,上面所有方案的性价比都要重算。第二条杠杆——编码效率——短期收益最直接,因为它能马上把估算表上的数字压下来,但要真正兑现,得看实时解码能不能跟上。第三条杠杆——近期设备的有用性证明——舆论价值最大,工程价值最小,我建议把它当成信心指标而不是进度指标。
还有个容易被忽视的点:这三条路线不是互相独立的。偏置噪声降下来之后,你需要的码距变小,解码复杂度也跟着降,实时解码的可实现性就上去了。这种路线之间的正反馈,往往比单条路线自身的进步更值得关注。我在做技术路线评估的时候,会专门画一张"哪条路线放松了哪条约束"的图,比看单篇论文的性能曲线有信息量得多。
最后分享一个实操层面上的小技巧:把这个领域的论文当成本台账来读,而不是当成成果发布会来读。每读一篇,问自己三个问题——它放松了哪条约束、放松的代价转移到了哪一层、这个代价在真实器件上能不能付得起。这三个问题问下来,一篇论文到底有多少分量,心里基本就有数了。我自己用这个方法看下来,真正能称得上"改前提"的工作,一年也就那么两三篇,其余的大多是在同一条曲线上往前挪一小格。挪一小格当然也有价值,只是别把挪一小格说成换了一条曲线。