谷歌量子机器学习笔记-全-
谷歌量子机器学习笔记(全)
001:量子纠错入门




欢迎来到谷歌的量子纠错入门课程。我是Must Fowler。我在这个领域已经工作了超过20年,很高兴能为大家讲解这门课程的内容。
在开始之前,我想感谢几位为此课程做出贡献的人。Dave、Abe和August都帮助塑造了这门课程并推动了它的启动。同时,制作团队的Jessica、Iva和Es也帮助打磨了最终的成果。
课程概述
在本课程中,我们将学习量子纠错的核心概念与实践。课程将从基础硬件开始,逐步深入到量子电路理论和纠错技术,最终介绍用于大规模模拟和计算的先进工具。
课程内容结构
上一节我们介绍了课程的整体目标,本节中我们将详细看看课程的具体安排。以下是课程将涵盖的主要模块:
- 量子计算机硬件概述:首先,我们将概览各种量子计算机硬件。目前存在多种多样、非常奇特且有趣的硬件平台。我们将从这里开始,确保大家对人们正在尝试构建的设备有一个良好的基础认识。
- 量子电路理论:在硬件基础之上,我们将学习量子电路的理论。这部分内容会进展得比较快,但会从最基础开始讲解。因此,即使你之前没有接触过这个领域,在经过几次内容重复学习后,也希望你能跟上课程后续的进度。
- 量子纠错基础:有了前面的基础,我们将进入量子纠错部分。我们将逐步构建用于检测错误的基本电路,并讲解如何处理这些信息的经典计算过程。我们将层层递进,学习你可能尚未听过的概念,如稳定子码。
- 大规模电路模拟器:为了处理大规模量子电路并快速返回结果,我们将介绍先进的模拟器。具体来说,我们会讲解ST,这是我们用于量子纠错电路的最先进模拟器。
- 复杂计算管理工具:最后,我们将介绍Crumble。这个工具帮助我们管理在受量子纠错保护的数据上进行计算的复杂性。
总结

本节课中,我们一起学习了谷歌量子纠错入门课程的整体框架和目标。我们从感谢贡献者开始,然后概述了课程将涵盖的五个核心部分:硬件基础、电路理论、纠错原理、模拟工具以及计算管理工具。接下来的课程将逐一深入这些主题。
002:什么是量子计算机?🔬




在本节课程中,我们将探讨“什么是量子计算机”这个问题。我们将了解到,量子计算机并非单一的技术,而是一个活跃的研究领域,包含多种不同的物理实现方案。我们将逐一介绍几种主流的量子计算技术,并分析它们各自的原理、优势与挑战。
量子计算技术概览
上一节我们介绍了量子计算的基本概念,本节中我们来看看几种具体的物理实现技术。需要强调的是,这是一个选择性的介绍,并非全部技术。
以下是几种主要的量子计算技术方案:
- D-Wave系统(量子退火):这是谷歌早期涉足量子硬件的起点。其核心并非高相干性的量子比特操控,而是通过大量耦合器对众多量子比特施加约束,让系统弛豫到尽可能满足所有约束的状态。本质上,它是一个优化器。其挑战在于,目前没有已知的方法为此方案实施量子纠错。随着系统规模增大,需要更低的温度和更精确的控制,其可扩展性存疑。
- 离子阱:利用电磁阱(通常在表面电极上)捕获单个离子原子,并使用离子的内部能级状态进行计算。其优势是基于原子能级,拥有极纯净的物理特性,因此能实现保真度极高的量子门操作。主要挑战在于速度和规模,目前系统通常只有几十个离子,且需要复杂的激光或微波控制系统。
- 中性原子:使用激光阱捕获中性原子,无需实体电极。原子被概率性地捕获后,可移动以形成密集的阵列。这种技术能实现数百个量子比特的规模,一些最大规模的量子实验即基于此。挑战包括操作速度,以及在某些方案中,测量会导致原子丢失,需要持续补充新原子。
- 光量子:基于光子芯片,概率性地产生单光子并纠缠它们以构建更大的量子态。原理上,通过足够多的光源和路由,丢弃失败案例,可以构建用于量子计算的大规模量子态。挑战在于需要快速路由光子、克服光子损耗,并实现快速的光开关。
- 量子点:通过电极阵列囚禁单个电子,利用电子状态编码数据。这是英特尔等机构重点投入的方向。挑战在于扩展性。量子点尺寸极小(纳米级),目前研究设备尚难以形成二维阵列。没有二维阵列,单个量子比特的失效可能导致系统被分割成无法通信的部分,难以实现容错。
- 超导量子比特(谷歌重点方向):在硅片上刻蚀超导电路,其行为类似可调谐的谐振器(如吉他弦)。基态和第一激发态分别代表 |0⟩ 和 |1⟩。挑战在于需要抑制电路进入更高的能级(|2⟩, |3⟩ 等),这些态对计算无用。此外,超导量子比特尺寸较大(毫米级),但需要极低温(约10毫开尔文)运行以保持量子态。制造工艺中,约瑟夫森结的特性对电路性能极为敏感,导致芯片良率是重大挑战。
超导量子比特的深入与系统构成
现在让我们更详细地看看超导量子比特技术。一个可工作的超导量子比特芯片只是起点。一个完整的量子计算机系统包括:低温冰箱、复杂的布线以及驱动量子比特状态变化的微波电子学系统(通常占据整个机架)。
这提醒我们,对于所有讨论过的量子技术,一个普遍的事实是:量子计算机并不“小”。它通常需要一整套庞大而精密的设备来使核心的量子比特正常工作。我们课程后续将聚焦的核心——量子态——只是整个庞大装置中极小的一部分。
总结

本节课中我们一起学习了量子计算机的多种物理实现路径。从D-Wave的量子退火,到离子阱、中性原子、光量子、量子点,最后到谷歌重点研究的超导量子比特,我们看到了每种技术独特的原理、当前的成就与面临的主要挑战(如扩展性、速度、纠错和制造良率)。我们也认识到,一个实用的量子计算机是一个复杂的系统工程,而不仅仅是那个承载量子比特的芯片。在下一讲中,我们将把注意力转向对这些量子比特可以进行的具体操作。
003:量子态与量子电路



在本节课中,我们将学习量子计算的基础:量子态和量子电路。我们将暂时抛开所有硬件细节,专注于理解量子比特的表示方式、量子态的数学描述以及如何通过量子门来操作它们。这是学习量子纠错的重要前提。
量子态:量子计算机的“0”和“1”
上一节我们介绍了课程背景,本节中我们来看看量子计算的基本存储单元——量子态。
在经典计算机中,我们使用比特(0或1)和比特串来存储信息。量子计算机则使用量子比特。一个由n个量子比特组成的系统,其状态不是简单的0或1字符串,而是由2^n个复数来描述。每个复数对应系统所有可能经典状态(如000, 001, ..., 111)的“振幅”。
例如,一个3量子比特系统有8种可能状态,其量子态可以表示为:
|ψ⟩ = α₀|000⟩ + α₁|001⟩ + α₂|010⟩ + α₃|011⟩ + α₄|100⟩ + α₅|101⟩ + α₆|110⟩ + α₇|111⟩
其中每个α都是一个复数。
这些振幅的物理意义是:测量系统时,得到某个特定经典状态(如|101⟩)的概率等于该状态对应振幅的模平方(|α|²)。所有状态的概率之和必须为1,因为测量总会得到一个确定的结果。
量子门:操作量子态
了解了量子态的表示后,我们来看看如何操作它们。量子门是改变量子态振幅的基本操作。
比特翻转门(X门)
X门是最简单的量子门之一,其作用类似于经典的非门(NOT gate)。
以下是X门的行为:
- 当输入为
|0⟩时,输出为|1⟩。 - 当输入为
|1⟩时,输出为|0⟩。
当应用于叠加态时,X门会同时作用于所有分量。例如,对一个三量子比特态α|000⟩ + β|111⟩应用X₂门(翻转最左边的量子比特,按我们的约定,下标从左到右递增),结果是:
X₂ (α|000⟩ + β|111⟩) = α|100⟩ + β|011⟩
相位翻转门(Z门)
Z门是量子计算特有的操作,它可以改变振幅的符号(相位)。
以下是Z门的行为:
- 当输入为
|0⟩时,输出仍为|0⟩。 - 当输入为
|1⟩时,输出变为-|1⟩。
再次以态α|000⟩ + β|111⟩为例,对其应用Z₂门:
Z₂ (α|000⟩ + β|111⟩) = α|000⟩ - β|111⟩
因为只有|111⟩分量中第二个量子比特是1,所以其振幅符号被翻转。
量子电路:门操作的序列
我们已经介绍了两种基本门,现在来看看如何将它们组合起来。量子电路是表示一系列量子门操作的标准方式。
在量子电路图中:
- 每条水平线代表一个量子比特。
- 时间从左向右推进。
- 量子门按照从左到右的顺序依次作用在量子态上。
让我们追踪一个简单电路的作用。初始态为α|000⟩ + β|111⟩。
- 首先遇到作用于量子比特2的X门,得到
α|100⟩ + β|011⟩。 - 接着遇到作用于量子比特1的Z门,得到
α|100⟩ - β|011⟩(因为|011⟩中第二个量子比特是1)。 - 最后遇到作用于量子比特0的X门,得到最终输出
α|101⟩ - β|010⟩。
更多重要的量子门
除了X和Z门,还有几个关键的门需要掌握。
哈达玛门(H门)
H门可以创建叠加态,是许多量子算法的核心。
以下是H门的行为:
H|0⟩ = (|0⟩ + |1⟩)/√2,这个态称为|+⟩态。H|1⟩ = (|0⟩ - |1⟩)/√2,这个态称为|-⟩态。
测量|+⟩或|-⟩态,得到0或1的概率都是50%。虽然测量概率相同,但它们是不同的量子态,因为再次应用H门后:H|+⟩ = |0⟩,而H|-⟩ = |1⟩。
受控非门(CNOT门)
要进行有意义的计算,量子比特之间必须相互作用。CNOT门是最常用的双量子比特门。
CNOT门有一个控制量子比特(带黑点)和一个目标量子比特(带⊕符号)。其规则是:
- 如果控制比特为
|0⟩,则目标比特保持不变。 - 如果控制比特为
|1⟩,则目标比特翻转(应用X门)。
受控Z门(CZ门)
CZ门是另一个有用的双量子比特门。其规则是:
- 仅当两个量子比特都为
|1⟩时,整个态的振幅符号才会翻转。 - 在其他情况下,态保持不变。
由于其对两个量子比特的作用是对称的,其电路符号像一个哑铃,没有明确的控制和目标之分。
电路等价性与练习
理解不同门序列的等价性有助于简化电路。这里有一个重要的电路恒等式:
H(目标比特)· CZ · H(目标比特) = CNOT(控制比特, 目标比特)
你可以通过将CNOT门的四种可能输入(|00⟩, |01⟩, |10⟩, |11⟩)分别代入左边的门序列(H-CZ-H)来验证这一点,结果与直接应用CNOT门完全相同。
测量:从量子到经典
最后,我们介绍量子计算中至关重要的操作——测量。
测量会使量子态“坍缩”到与测量结果一致的经典态。以我们之前得到的态α|101⟩ - β|010⟩为例,如果我们测量中间的量子比特(量子比特1):
- 以概率
|α|²,我们测得1,整个态坍缩为|101⟩。 - 以概率
|β|²,我们测得0,整个态坍缩为|010⟩。
关键点是,对一个量子比特的测量会影响整个系统的态,使其坍缩到与测量结果相容的那些分支。
总结
本节课中我们一起学习了量子计算的核心基础。我们首先了解了量子态如何用复数振幅的叠加来表示。接着,我们学习了如何用X门、Z门、H门、CNOT门和CZ门等基本量子门来操作这些态。我们通过量子电路图来可视化这些操作序列,并理解了测量如何使量子态坍缩为经典结果。
掌握这些量子态和量子电路的基本概念,是进入下一阶段——学习量子纠错——的必要准备。在接下来的视频中,我们将应用这些知识来探索如何保护脆弱的量子信息免受错误影响。


004:什么是量子错误?🔍


在本节课中,我们将学习量子计算中一个核心且不可避免的挑战:量子错误。我们将从经典的比特错误概念入手,逐步构建对量子错误的理解,并探讨如何通过编码和纠错技术来应对这些错误。
从经典错误到量子错误
上一节我们讨论了量子电路,并假设一切都能完美运行,没有错误。但在现实世界中,情况并非如此。实现量子电路并使其按预期工作非常困难。因此,我们将用一节课的时间来讨论错误,即当你尝试运行量子计算机时可能出现的所有问题。
与之前一样,我们将从经典计算机的直觉开始,讨论经典错误。这更简单,能为我们构建概念提供大量素材。
经典比特存储与纠错
我们从一个经典问题开始:存储一个比特(0或1),特别是在硬件存在错误的情况下。硬件在单位时间内存在一个比特翻转的概率P。问题是,如果我们不能接受单位时间内比特翻转的概率P,我们如何做得更好?无论单位时间是秒还是世纪,如果我们希望以高成功率存储数据超过单位时间,我们能做什么?
一个自然的想法是,如果硬件不完美,就使用更多硬件,制作副本。但这还不够。如果只有副本,且每个副本都有失败概率P,那么经过大约1/P的时间后,它们都会变得随机,你仍然会失败。必须引入某种智能处理才能使其工作。
一个很好的例子就是多数表决。如果你等待一段时间,发生了一个错误,但你有五个副本(如示例所示),通过多数表决,你会回到初始状态(多数为0),重置掉队的比特,就完成了。目前我们假设这种多数处理既是瞬间的又是完美的。我们将逐步移除这个假设。
现在假设发生了两个错误。这仍然是少数。当我们进行多数表决时,我们回到了初始状态。然而,如果发生三个或更多(超过一半)的比特翻转,我们就会失败。因此,这不是一个完美的协议。无论我们使用多少比特来提高成功率,总会有一定的失败概率。不过,这已经相当不错了。我们从单个比特在单位时间内有失败概率P,变成了五个副本,现在至少需要三个(即P³量级)错误才会导致失败。
在术语上,我们现在拥有的是一个逻辑比特。我们五个物理比特的集合形成了一个逻辑比特,其可靠性高于任何一个物理比特。
编码距离与纠错能力
我们希望进一步升级处理方式和术语。首先,我们引入编码距离的概念。对于五个比特,需要五次翻转才能到达相反状态(从逻辑0到逻辑1)。这意味着编码距离是5。一旦我们形式化了这个概念,我们就可以说,一个距离为D的编码只有在至少发生(D+1)/2个错误时才会失败。通常,如果我们希望错误概率任意小,只需使用越来越多的比特,任意增加编码的距离,就能以指数方式抑制错误。
从多数表决到配对奇偶校验
我们希望在这个例子中做更多事情。到目前为止,我们讨论了多数表决,这隐含意味着你将查看每一个比特,确定其状态,然后进行多数表决。这在量子计算中不是一个兼容的操作。因此,我们将调整我们的处理方式,以同样的效果,但采用一种能够过渡到量子纠错的方法。
现在,我们不再进行多数表决,而是查看配对奇偶校验。在第一个发生单个错误的例子中,你会发现我们有四个奇偶校验结果,前两个是1,后两个是0。我们可以利用这些信息做任何我们想做的事情。我们选择用它形成一个图:一个四节点、五条边的图,其中两条边被标为红色,因为那是我们得到奇数奇偶校验结果(即1)的地方。
这就定义了一个图问题。如果你解决以下问题:将高亮顶点成对连接或连接到最近的边界,使得使用的边数最少,这被称为最小权重完美匹配。图中高亮的绿色边就是该解决方案——一条连接那两个高亮节点的边。这告诉我哪个比特出了问题(具体是顶部第二个比特)。实际上,我根本不需要回到我的数据,我可以把这个知识留在计算系统中:那个比特是错误的。之后,当我去查看它时,翻转它的结果。计算机中可能发生更多错误,我可以利用现有的知识正确计算奇偶校验。
因此,与其说前两个比特导致了一个奇数奇偶校验(1),我们知道第二个比特是错误的,所以我们将其纠正为0。这使我们能够只看到错误链的端点,即这两个新的错误比特。这两个新的比特翻转给了我们一个有两个高亮节点的新图,一个带有两条新绿色边的新解决方案。最终,我们留下了对错误位置的信念:我们相信中间三个比特是错误的。然后,我们是否应该实际查看这些比特,确定每一个的状态,并得到结果(如0, 1, 1, 1, 0)?我们将利用对错误的了解来翻转中间那些比特,回到我们想要的状态。
事实证明,我们讨论的一切完全等同于进行多数表决。花点时间想想为什么是这样。我们将在量子案例中使用这个类比,但首先我们需要升级对错误的理解。
量子错误的丰富性与挑战
量子计算机中的错误比简单的比特翻转要丰富和多样得多。正如在硬件视频中提到的,我们在谷歌研究的硬件并不真正是一个量子比特(qubit),它有超过两个能级。除了基态和第一激发态,还有更高的激发态。如果我们的系统进入这些更高的状态,这被称为泄漏,这是一个问题,因为当一个泄漏到高能级的量子比特与其他量子比特相互作用时,它会污染所有接触到的东西。更糟的是,泄漏可以在计算机中传播。
在这张图中,我们从芯片中间一个泄漏的单个量子比特开始,然后运行一个旨在检测错误的量子电路。但实际上,它正在将那个错误传播到整个电路中。这是一个需要在硬件层面设计避免的例子。如果我们把它留给错误检测系统,这将导致失败。泄漏会累积,最终计算会失败。
这是另一种从测量过程本身导致泄漏的方式。当我们测量量子比特时,我们使用特定的微波音调,你可以认为它被两种不同状态(0和1)以略微不同的方式反射。它在信号中引入了一个可被室温检测到的偏移。如果你输入大量功率,理论上可以获得更快的测量,但你也向系统中倾注了更多能量,可能将其激发到更高的状态。由于许多量子比特连接到同一条线上,这可能导致许多不同量子比特出现大量错误。所以这是我们需要管理的事情。我们希望快速测量,但不能太快,否则会引入大量错误。
接下来,因为我们的芯片工作在10毫开尔文的极低温度,量子比特的能量尺度非常低,倾注的能量非常显著。你可以在这里看到一个图表。这是对我们芯片的一次冲击,倾注了大量能量,导致我们所有的数据升温并变得随机。在几十毫秒(相当于许多轮错误检测)的时间内,芯片基本上无法工作,错误概率接近50%的水平。这显然又是我们无法在软件层面应对的事情,必须在硬件层面减轻这种影响。
量子错误模型与处理基础
那么,我们剩下什么?我们明确地得出结论:真实的量子计算机并不理想。我们想要这样的门:你施加到一个状态上,它能在输出端精确地给出你想要的结果。但在现实中,这不会发生。我们还展示了我们甚至不期望通过量子软件来纠正的错误类型的例子。
那么,我们如何继续?我们将不得不依赖硬件工程师的建议,至少满足以下假设:无论发生什么错误,它们都使我们留在状态0和1中。这允许我们将这两个状态表示为一个只有两个分量的向量。因此,0态可以表示为 [1, 0],1态可以表示为 [0, 1]。
如果我们不做这个假设,那么我们将需要更长的向量来表示那些更高的状态,这在做错误检测和纠正时会变得有问题。因此,我们将专注于这种情况。同样地,当我们有不止一个量子比特(例如两个量子比特的系统)时,假设没有泄漏到更高的状态,这允许我们将该系统表示为一个长度为4(不多于)的向量。这非常有用,因为当我们考虑每个门的操作时,我们现在可以将它们写成矩阵。
这里是我们相同的哈达玛门(H门)和相同的CNOT门,但这次表示为作用于向量的矩阵。向量 [α, β] 替换了原始状态 α|0> + β|1>。我们选择了以 |0> 和 |1> 为基础的表示法,这允许我们以这种形式书写它。通过这样做,我们现在可以将H写成所示的矩阵,CNOT门也是如此。通过选择将我们自己限制在状态0和1,它允许我们以矩阵的形式进行清晰的表述。
完成这些后,我们现在可以讨论那些我们可以用量子电路本身处理的错误。因此,我们将允许自己有一个单量子比特门(一个2x2矩阵),后面跟着一个任意的矩阵(任何东西都可以),这就是我们的错误。同样,一个双量子比特门(4x4矩阵)后面跟着一个任意的4x4错误矩阵。
我想重申,这仍然是一个限制,但这明确地忽略了泄漏,并假设这些问题已经在硬件层面得到处理。测量之前有一个任意错误,初始化状态 |0> 的方框后面也有一个任意错误。我们现在想讨论如何处理这种形式的错误。
泡利矩阵与错误分解
一些定义:这些是泡利矩阵——单位矩阵I、X、Y和Z。它们非常方便,我们会经常使用。我们将专注于X和Z矩阵,即比特翻转和相位翻转矩阵。这些特别有用,因为我们可以用它们作为任意矩阵空间的基。我可以取一个任意的2x2矩阵,并将其写成仅由单位门、比特翻转、相位翻转以及两者同时发生的线性组合。这实际上是一小段深刻的数学,它意味着一个任意错误真的只是这些简单错误的组合:可能什么都没有,可能是一个比特翻转,可能是一个相位翻转,或者两者都有。
这意味着在检测和纠正错误时,我们可以只关注比特翻转和相位翻转。因为即使它们可能非常复杂(这些任意矩阵),那种任意性实际上只是简单事物的线性组合。
你也可以对多量子比特门做同样的事情。这是一个双量子比特门的例子。一个双量子比特错误可以分解为16项的和。这些项利用了张量积,其定义如下所示。本质上,你取两个矩阵,并将最右边的矩阵代入最左边矩阵的每一个位置。这里有一个单位矩阵与X矩阵张量的例子,你会看到X矩阵被代入到原来为1的两个位置。
因此,我们可以分解错误,并且我们将确保专注于仅发现比特翻转和相位翻转。所以,我们现在的目标是构建实现这一点的电路,然后在软件中跟踪这些检测到的错误,这与我们在经典案例中所做的非常类似。我们将在下一个视频中开始讨论这些具体的电路。
总结

在本节课中,我们一起学习了量子计算中错误的基本概念。我们从经典的比特存储和多数表决纠错入手,理解了逻辑比特和编码距离的概念。接着,我们探讨了量子错误的丰富性和独特性,如泄漏和能量冲击,这些挑战需要在硬件层面进行管理。最后,我们建立了量子错误模型的基础,引入了泡利矩阵,并理解了任意量子错误都可以分解为比特翻转和相位翻转的组合,这为后续设计量子纠错电路奠定了理论基础。下一节,我们将开始构建具体的量子纠错电路。
005:量子纠错(二)—— 比特翻转与相位翻转的检测 🔍


在本节课中,我们将开始构建实际执行量子错误检测与纠错所需的量子电路。我们已经讨论过量子电路和门操作上可能发生的错误,现在我们将非常明确地构建执行所需工作的结构。
电路基础回顾与定义 📐
上一节我们介绍了量子电路的基本概念,本节中我们来看看构建纠错电路所需理解的一些具体示例。在深入之前,这是一个很好的时机来暂停并确保你理解如何计算这些电路的输出。请现在完成这个练习,确保你理解这些电路的作用以及对于给定输入,测量会报告什么结果。
以下是这些电路的预期输出。请检查你的理解,因为在本视频的剩余部分你将需要这些知识。
一个有用的定义是:在正常情况下,测量结果将是 0 或 1。我们也可以在不同的基中定义测量,即在测量前进行哈达玛变换,这被称为 X基测量,记作 Mx。这本质上是检测输入是处于 |+> 态还是 |-> 态的测量。
构建错误检测电路 ⚙️
现在让我们构建一些更接近实际量子纠错世界的东西:重复的错误检测。以下是一个简单的电路。它不保护逻辑态,但是一个很好的讨论起点。
我们假设顶部的线路是我们想要保护的数据量子比特。底部的线路是我们重复制备和测量的测量量子比特。这个电路有什么作用?在无错误的情况下,它只会反复产生结果 0。这告诉我们没有错误发生,所以这是有用的信息。
如果发生错误,情况就会改变。让我们看看这是如何变化的。假设我们的数据量子比特上发生了一个比特翻转错误。当我们将其向前传播时会发生什么?它会翻转所有未来测量的结果。现在顶部量子比特处于 1 态,这将反映在测量中。通过改变所有未来的测量,真正检测到错误存在的是从一串 0 到一串 1 的变化。这是我们将反复使用的一个通用特征:错误会在来自测量量子比特的测量流中产生变化。
那么测量量子比特本身的错误呢?我们的数据仍然被保存,完全没有被破坏。我们现在有一个错误的测量,它本应是 0,但在测量前发生了一个错误将其翻转了。这是一个孤立的“异常值”错误。这是一个测量错误会呈现的样子的例子。
请记住这两种情况:当测量流发生变化时,那是数据量子比特错误;当你有一个孤立的异常值时,那是测量错误。
增加复杂度:保护两个数据量子比特 🔗
将复杂度再增加一步。之前我们所做的完全是经典的,你无法放入任何量子态并以任何方式保护它。一旦我们开始使用单个测量量子比特来保护两个数据量子比特,我们就可以做更多事情。
例如,我们可以输入形式为 A|00> + B|11> 的态。这个电路将检测我们是否具有相同或不同的态。特别地,由于在无错误的情况下,这两个态是相同的,我们在这里仍然会得到 0 结果。它会说“是的,在无错误时它们相同”。这还不足以实际纠正任何错误,因为当错误发生时我们不知道是哪一个出了问题,但这足以将讨论提升到下一步。
定位错误:三数据量子比特电路 🎯
要达到能够实际判断错误发生位置的程度,我们必须复制之前的电路。现在我们有三个数据量子比特和两个测量量子比特,这足以实际定位错误发生的位置。
如前所述,我们真正关心的是给定测量是否与其前一次测量相同。如果相同,则附近未检测到错误;如果不同,则附近检测到错误。从技术上讲,绿色圆圈包围了两个测量,我们称之为一个 检测器,因为如果它们相同,则未检测到错误;如果它们不同,则检测到错误。
这个电路中有许多检测器。每一对连续的测量都是一个检测器。再次注意,重要的不是单个测量的具体值,而是该集合的奇偶性,即该集合中 1 的数量是偶数还是奇数。
现在让我们引入一些错误,看看会发生什么。首先你会注意到,现在我们有一个奇偶性为奇的检测器,这就是 检测事件 的定义。当你得到的奇偶性与预期不符时,你就有一个检测事件,并将其高亮显示。
如果同样的比特翻转发生在不同的位置,现在你可以看到我们获得了有用的信息来帮助我们定位那个错误。在这个位置发生的比特翻转错误会被这两个检测器检测到。
这里你可以看到一个比特翻转错误触发了两个检测事件。它从这里开始,然后会向上和向下传播,触发这两条线上未来测量值的变化,从而在这里和这里都导致检测事件,帮助我们定位错误一定发生在这个被两者共享的数据量子比特上。
比特翻转也可能发生在其他位置。在这种情况下,比特翻转的发生使得它在这个测量量子比特上比在下面这个测量量子比特上更早被检测到。同样,检测事件的模式帮助我们定位错误一定发生的位置。当检测事件彼此相邻时,我们知道错误发生在这个电路部分。当它们对角排列时,我们知道错误一定发生在这两个门之间。所以我们现在从一个足够大的电路中获得了非常有用的信息,可以实际定位这些错误的位置。
我们甚至能获得更多信息,因为这两个门之间的时间间隔比这里的时间间隔短。我们可以说,在这种对角排列上获得检测事件的可能性低于获得并排排列的一对检测事件的可能性。所有这些都可以用来帮助我们找出错误可能发生的位置。
构建错误概率图与解码 🗺️
那么这如何帮助我们呢?我们可以回溯,查看我们的电路,查看每个可能发生错误的位置,计算出每个可能的错误是如何被检测的,并对每个可能的检测事件模式,累加导致该模式的所有错误的总概率。
明确地说,这里的这条线代表了每一个可能的错误,即恰好触发此处这个检测事件的每一个可能错误的总概率。你会注意到我稍微缩小了符号以使图表更清晰。这里的这个椭圆代表由紧随其后的测量和之前的测量组成的检测器。线的粗细旨在表示总概率。特别地,发生在此电路部分、导致此确切检测器的所有错误的总概率,大于发生在此电路部分、导致此处和此处检测的所有错误的总概率,这赋予了这条线更细的外观,意味着更低的概率。
因此,通过系统地在电路中的每个位置插入每一个可能的错误,我们可以构建一个所有可能的检测事件结果的图,其中的边具有与底层电路中所有错误的总概率成比例的粗细或概率。
现在假设我们运行一个实验并观察到一组特定的测量结果模式。我们要做什么?首先,我们将在任何具有连续不同测量对的地方构建所有检测事件。那是一个检测事件。所以让我们先高亮显示这些。接下来,我们要处理这些信息。
我们将使用 最小权重完美匹配。我们将搜索一组具有最小权重的边,将我们所有的检测器配对在一起,或配对到附近的边界。如果你只计算边的数量,可能有多种可能性。例如,我本可以选择这里的这条对角边和下面的这条边界边。这仍然是一个两条边的解决方案。但是这些边(与测量失败相关的边)和这条边(与此部分任何位置错误相关的边)更有可能发生。因此它们权重更低,会被优先选择。这是一个更好的猜测。需要强调的是,这并不意味着底层真实的错误不可能是这个位置的一个错误,加上这两个错误,以及下面的一个错误。所以总是存在一些失败的可能性。你只是通过选择最可能的选项来最大化你猜对的机会。
一旦你做出了选择,你可以说,基于现有证据,我相信错误一定是在这里,然后你可以将这些错误通过电路传播以纠正测量。
电路局限性与码距 📉
请注意,在这个特定例子中,如果我们有两个错误,例如,假设顶部数据量子比特和中间数据量子比特上各有一个错误,这对于这个电路来说解码负担过重,因为这两个错误会对此测量进行双重翻转,意味着它是不可检测的。而下面的这个错误会翻转底部的这个测量。我们将认为,仅给定一个检测事件,错误一定是在这里,从而出错并导致逻辑错误。
所以这是一个 距离为3的码 的例子,它最多能处理 距离-1 个 X 错误,在这种情况下是 1 个错误。因此,如果你有稀疏分布的单错误,这个码不会崩溃。然而,当我们得到错误的组合或成对错误时,这将失败,你会猜错,从而破坏你的数据,计算就结束了。
随着这个码变大,即我们不断向下复制这个电路,增加码距,需要在从顶部到底部的任何给定路径上对齐的错误数量线性增长。由于这些错误是独立的,你在这样一条线上至少获得一半位置出现错误的概率呈指数衰减。因此,通过线性增加资源,你可以指数级地抑制逻辑错误的概率。
检测相位翻转的电路变体 🔄
现在让我们看看我们刚刚研究内容的一个轻微变体:相同类型的电路,但设计用于检测相位翻转。这是一个允许你在电路中的任何位置放置 Z 错误并检测它们的结构示例。目前我们将在此暂停,下次我们将把这两个电路结合到表面码中。
总结 📝

本节课中我们一起学习了如何构建用于检测比特翻转和相位翻转错误的量子电路。我们从简单的单数据量子比特检测开始,逐步扩展到保护多个数据量子比特并能够定位错误位置的更复杂电路。我们介绍了检测器、检测事件的概念,以及如何使用最小权重完美匹配算法根据测量结果推断最可能的错误模式。最后,我们了解了码距的概念及其如何影响纠错能力,并预览了用于检测相位翻转的电路结构,为下一课学习结合两者的表面码奠定了基础。
006:量子纠错实践 III - 稳定子理论入门 🧮


在本节课中,我们将深入探讨量子纠错的理论基础,特别是稳定子理论。我们将学习如何用稳定子来描述量子态,以及如何利用它们来检测和定位量子比特上的错误。
上一节我们介绍了量子纠错的基本概念,本节中我们将构建一个理论框架来应对复杂量子电路的复杂性。这个框架就是稳定子理论。
什么是稳定子?
我们从泡利矩阵开始。以下是四个基本的2x2矩阵:单位矩阵 I、比特翻转 X、相位翻转 Z 以及两者同时翻转 Y。Y 矩阵可以近似看作是 X 和 Z 的乘积。
为了解释这个理论,我们需要一些线性代数知识。我们将讨论这些矩阵的张量积。以下是一个例子:
X ⊗ I ⊗ Z ⊗ Z ⊗ Y
对于一个五量子比特系统,这表示对第一个量子比特进行比特翻转,对第二个不做任何操作,对第三和第四个进行相位翻转,对最后一个同时进行两种翻转。
更紧凑的写法是 X I Z Z Y,其含义相同。任何泡利算符的有符号张量积,我们简称为一个“算符”,我们将广泛使用它们。
单量子比特稳定子示例
一些简单的稳定子就是单个泡利矩阵。例如,Z 矩阵。当你将其应用于 |0> 态时,状态不变。因此我们说 |0> 态被稳定子 Z 所稳定。这允许我们用算符符号来替代态符号。
更多例子:
|1>态被算符-Z稳定。|+>态被算符X稳定。|->态被算符-X稳定。
我们需要熟悉“本征态”这个术语。上述状态就是其对应算符的本征态,即在算符作用下保持不变的状态。
这暗示了一种符号替换:如果一个算符有一个定义良好的 +1 本征态(即在其作用下不变的状态),那么我们可以不写出该状态,而直接写出该算符。目前看来,写这个符号和写那个符号似乎一样困难,但随着我们转向更复杂的量子纠错态,这样做的好处将越来越明显。
多量子比特稳定子
让我们从单量子比特扩展到多量子比特态,特别是一个三量子比特态:
|ψ> = |000> + |111>
这个特定的三量子比特态被三个独立的稳定子所稳定:
X X XZ Z II Z Z
如果我们翻转每个比特,三个 0 变成三个 1,三个 1 变成三个 0,我们得到的是初始状态。因此,|ψ> 确实是 X X X 的 +1 本征态。同样,它也是 Z Z I 和 I Z Z 的 +1 本征态。你可以也应该将这些算符应用于该态,会发现回到了起点。
现在你可能仍然觉得,列出这三个稳定子看起来并不简单。让我们继续探索。
为了确保理解扎实,让我们详细计算其中一个例子:将稳定子 Z Z I 应用于态 |ψ>。
这是从上一张幻灯片中取出的态。这是我们正在应用的算符。我们将其分配到叠加中的所有态上。Z 对 |0> 态不做任何操作,每次我们将 Z 应用于一个 |1> 态时,我们会得到一个负号。因为有两个 Z 算符,所以有两个负号,这再次让我们回到了起点。当你思考将稳定子应用于特定状态时,脑海中应该有这个步骤序列。
稳定子与错误检测
这如何与我们讨论的量子纠错,特别是错误联系起来呢?
让我们回到这个态,但现在对其施加一个错误:一个 X2 错误(翻转第二个量子比特,按当前符号表示是最左边的量子比特)。现在我们有了 |100> + |011>。什么改变了?
让我们回到上一张幻灯片详细讨论的算符 Z2 Z1,但现在将其应用于这个带有错误的态,看看这意味着什么。
之前没有错误时,我们有 Z2 Z1 的 +1 本征态。现在当我们计算时,X2 可以简单地穿过 Z1 算符,因为它们作用于不同的、互不影响的量子比特。然后 X2 和 Z2 作用于同一个量子比特,它们反对易,将其穿过会得到一个负号。我们现在可以说,带有错误的态 X2|ψ> 是算符 Z2 Z1 的 -1 本征态。
因此,在遭受错误后,我们改变了关于特定算符是 +1 还是 -1 本征态的陈述。所以,如果我们能找出如何测量我们的稳定子是 +1 还是 -1 本征态,那将是一种检测错误的方法。事实上,这就是我们要做的。
测量本征态的电路
什么电路能够告诉我们一个态是特定算符的 +1 还是 -1 本征态呢?答案是下面这个电路。你应该尝试计算这个电路在两种可能测量结果(0 和 1)下的输出。
现在,假设你已经尝试过了,让我们一起逐步分析。
初始时,我们只有态 |0>|ψ>,即我们的输入。应用哈达玛变换后,我们在第一个量子比特上得到 |+> 态(|0> 和 |1> 的叠加)。现在我们将执行一个受控 A 门,这意味着如果控制位是 1,则将算符 A 应用于态 |ψ>;如果是 0,则什么都不做。在 |0> 的情况下,我们什么都不做;在 |1> 的情况下,我们将对态 |ψ> 应用 A。然后我们将应用另一个哈达玛门。将这个态应用于 |0>,我们得到另一个 |+>;应用于 |1>,我们得到 |-> 态。然后,如果我们重新排列这些项以强调两种可能的测量结果,这就是测量结果为 0 时在其余量子比特上留下的态;如果我们得到测量结果 1,我们将留下这个态在其余量子比特上。
仔细观察这两项,你会发现这是 A 的 +1 本征态。|ψ> + A|ψ>,给定 A^2 = I,这正是我们开始时的状态。因此,这个电路不仅告诉我们它所接触的量子比特上的态是 A 的 +1 还是 -1 本征态,而且对于任何输入态,它都会根据观察到的测量结果,将该输入投影到这两个本征态之一(要么是 +1 本征态,要么是 -1 本征态)。所以,这就是我们正在寻找的电路。它告诉我们是否有 +1 或 -1 本征态,并且如果我们的态偏离了这两种可能性之一,在运行此电路后,它将被清理并只成为其中一种状态。从根本上说,这个电路使我们那些总想被弄乱的量子态保持清洁。
定位错误:一个具体例子
现在让我们运行一个具体例子,用我们的稳定子定位错误。继续之前的例子,我们对第二个量子比特(最左边的量子比特)施加了一个比特翻转,然后那个翻转将我们的稳定子 Z Z I 变成了 -Z Z I。
一个好的练习是去思考,在这些错误之后,稳定子的符号会是什么。你可以再花点时间,看看这些态,计算出来。
你会发现:
- 如果你翻转中间比特,那么这两个符号都会翻转(这是中间量子比特,如果我们施加一个与这两者都反对易的错误,两个稳定子的符号都会被翻转)。
- 最后,如果我们只翻转最右边的量子比特(量子比特0),它只与最后一个稳定子反对易,因此只有它的符号会被翻转。
稳定子的图形表示
现在让我们展示这个完全相同状态的另一种表示。我们可以将 |ψ> 表示为一个显式态,我们可以将其表示为一个稳定子列表,并且我们可以将该稳定子列表表示为一幅图。
如果我们定义这个符号:3个量子比特(0,1,2),一个连接它们的形状(这里是三角形),颜色为白色,这将是我们的 X 稳定子(即 X2 X1 X0 稳定子的图示)。同样,我们可以看两个 Z 稳定子:一个接触量子比特2和1(这个对象),最后第三个稳定子接触量子比特1和0(这个形状代表了这张图的一部分)。
因此,我们也可以讨论这上面的错误。例如,如果我们有一个相位错误(使第一个稳定子从正翻转为负的东西),我们可以在图上将其表示为这部分图片符号的翻转。这就是我们开始讨论表面码时希望建立的基础,这将是下一讲的主题。

本节课中我们一起学习了稳定子理论的基础。我们了解了如何用稳定子算符来描述和表示量子态,特别是多量子比特的纠缠态。我们看到了错误如何改变稳定子的本征值符号,并介绍了通过特定量子电路测量这些符号来检测错误的核心方法。最后,我们接触了稳定子的图形表示,为后续学习更复杂的表面码等纠错方案奠定了基础。
007:表面码


概述
在本节课中,我们将学习量子纠错中的表面码。我们将了解如何用稳定子表示复杂的量子态,探讨表面码的拓扑性质,并学习如何设计测量电路以避免错误传播,从而保护逻辑量子比特。
稳定子表示法回顾
上一节我们介绍了稳定子的概念,以及如何用一组稳定子列表来表示一个复杂的量子态。在之前的例子中,量子态并不复杂,但当我们开始讨论表面码时,稳定子表示法就变得至关重要。
我们来回顾一下表示量子态的三种方法:
- 显式的态向量表示。
- 一组稳定子列表表示。
- 用图形表示同一组稳定子。
我们倾向于使用图形方法,因为它能让我们直观地展示表面码。
表面码的图形表示
以下是一个最小的非平凡表面码:在一个正方形中排列9个数据量子比特,并交错布置X型和Z型稳定子。

为什么我们更喜欢这种表示法?让我们看看其他方式。
如果用稳定子列表来表示,数学表达式已经相当冗长。如果用态向量来表示,情况会更糟。这个态是通过将所有数据量子比特初始化为|0⟩态,然后测量所有稳定子来制备逻辑态的结果。态本身取决于测量结果,实际上很难处理。
然而,至少要知道这种表示是可行的,并且能明确看到如何进行逻辑操作。
逻辑操作与拓扑性质
例如,我们可以翻转这条垂直线上的量子比特,这将产生一个新的态,即我们的逻辑|1⟩态。
# 逻辑X算符的一个例子:翻转一列量子比特
logical_X = X⊗I⊗X⊗I⊗X⊗I⊗X⊗I⊗X
但这并不是从逻辑|0⟩到逻辑|1⟩的唯一方式。不过,在讨论其他方式之前,我们需要简化一下符号。
目前,我们的逻辑X算符是翻转这条垂直线上的量子比特。但它同样可以是连接顶部边缘和底部边缘的任何一条X算符线,只要这条X算符线与所有Z型稳定子对易。这意味着它与所有深色方格恰好接触两个点(或偶数个点),那么这就是一个完全有效的逻辑X算符。
这就是为什么它被称为拓扑码:它的许多性质只取决于我们是否使用一条X算符线从一个地方(顶部边缘)连接到另一个地方(底部边缘),而不取决于这条线的具体形状细节。
我们可以对逻辑Z进行同样的操作,逻辑Z算符是从左到右的一条物理Z算符线。
以下是一个接触中间行的例子,但同样,这不是唯一的方式。
一旦我们接受可以使用连接顶部到底部、左到右的任意算符线作为逻辑X和逻辑Z,并且不需要具体讨论接触了哪些量子比特,那么我们就可以进一步省略量子比特的编号。这非常有帮助,因为这样我们就可以开始讨论更大的晶格,而不会被符号淹没。
进一步简化:边界与对易关系
我们可以更进一步,甚至抑制棋盘格图案本身,只关注顶部有一个X边界(X算符链可以在此终止),底部有相同类型的边界。左边和右边则是Z边界(Z算符链可以在此终止)。
现在可以看到,给定一条从顶部到底部的任意线,如果我们画一条从左到右的任意线,它必须与那条线相交奇数次。如果直接穿过,就是一次。如果绕过去再回来,或者来回两次,总是会增加偶数次相交,所以总是奇数次相交。
你总是有奇数个位置,逻辑Z算符与逻辑X算符相交,这意味着它们反对易。这正是我们拥有有效的逻辑X和逻辑Z算符所需的条件。
稳定子测量电路
好了,以上就是表面码的稳定子。我们最近花了一些时间讨论如何检测稳定子的值,这里写下了那些显式的电路。
例如,下面这个电路的形式最接近我们之前讨论过的受控A门,其中A是XXXX。这些是受控非门或受控X门。
# 测量四个相邻量子比特上X⊗X⊗X⊗X稳定子本征值的电路示例
# 这是一个概念表示,实际电路由多个CNOT门构成
circuit.measure_stabilizer(qubits=[q1, q2, q3, q4], pauli='XXXX')
这个电路将测量我们在这四个相邻量子比特上处于X算符的+1还是-1本征态。
然而,这里有一个问题:这些电路测量我们处于哪个本征态,原则上我们可以用它们来检测错误。但门的顺序呢?我们有很多可能的选择,有没有一个首选顺序?
错误在电路中的传播
在讨论顺序之前,我们需要了解错误是如何通过电路传播的。
假设这个量子比特上有一个比特翻转错误,我们想知道经过CNOT门后,这个比特翻转错误会变成什么样子。我们可以通过在前面放置一个恒等操作和两个CNOT门来计算,然后算出这组门等价于什么。答案是两个比特翻转。
一个比特翻转通过CNOT门的控制端传播,会导致两个比特翻转。类似地,一个相位翻转通过CNOT门的目标端传播,会导致两个相位翻转。这一点很重要,所以我们需要小心安排门的顺序,以免这种复制过程带来危险。
让我们明确地看一下:
- Z错误(相位翻转)可以变成一对错误。
- 比特翻转错误可以变成一对比特翻转错误。
我们不希望这破坏我们的编码。我们希望所有的错误在逻辑算符的路径上都是随机且独立的。
例如,如果我们安排的电路可能将单个错误变成沿着这条线的两个错误,那将是很糟糕的。
错误的电路顺序示例
这里有一个糟糕顺序的明确例子。我们以相位翻转错误为例,构建了一个最后接触这两个量子比特的电路。这意味着测量量子比特上的单个错误可能变成数据量子比特上的两个相关错误。
现在,只需要两个随机事件就会导致一条非常接近逻辑算符的错误链,这会迷惑我们的解码器,导致纠错错误。解码器会认为你一定只是在这里有一个错误,从而损坏我们的数据,导致数据丢失。
这达不到我们想要的性能水平。这是一个距离为5的码。如果你数一下这个正方形从一角到另一角的量子比特数量,你会发现每个方向有5个量子比特。理论上,需要5个错误才能无法检测地从逻辑|0⟩变为逻辑|1⟩,或者至少需要3个独立错误才能走到一半以上并迷惑解码器,使其引入错误的纠正。
这种电路顺序无法达到那种性能水平。
正确的电路顺序
相反,在这个电路中最后被接触的两个量子比特,必须使相位翻转错误传播的方向与我们的逻辑算符垂直,这一点非常重要。
之前,我们看到当它们平行时会发生什么:代码距离被降低,需要更少的错误就能破坏代码。
在这里,我们保持代码距离。技术上,仍然需要数量等于(代码距离+1)/2的错误来破坏一个距离为5的码(本例中是3个)。每次我们将代码距离增加2,这个数字就增加1。
这对两种类型的错误都成立,不仅仅是相位翻转需要安排电路使错误传播方向与逻辑算符垂直,我们的比特翻转电路也必须如此安排,使其最后两个门接触的量子比特是垂直方向的。
这为我们的操作顺序布局设定了一个约束,以便保留我们精心构建的代码的全部强度。
有效的并行排序
一旦我们遵循这个约束,我们可以找到与完美并行应用相一致且不会严重传播错误的排序。这里有一个这样的排序示例,它是完全并行的。
你会发现,每个数据量子比特总是被不同时间序列的门接触。在这里共享一个对应时间步的编号是不合法的,所以这是一个有效的排序。
还有一个技术约束:你必须能够说出这些稳定子中哪一个在任何邻居之前被测量。如果你看这个,你会发现标记为1和2的门比标记为2和4的门更早。所以,在最近邻的意义上,这个比那个更早被测量。这也是一个重要的属性,当你环绕这个棋盘时,你会发现它总是满足的:你总是可以告诉一对相邻的稳定子哪一个先被测量,即使从某种意义上说它们是同时测量的,门的顺序给了你这种判断能力。
基础逻辑操作
好了,现在我们有了一个不会严重传播错误的电路,并且可以完美并行实现。那么,让我们开始做一些不仅仅是检测错误的事情。如何进行一些基本的计算?比如初始化和测量表面码。
初始化
- 如果你想制备逻辑|0⟩态,其实你已经见过一个例子。你只需将所有数据量子比特初始化为|0⟩,然后开始测量所有稳定子,就会得到逻辑|0⟩。
- 类似地,如果你想要逻辑|+⟩态,只需将每个数据量子比特物理初始化为|+⟩。
测量
- 当需要测量时,如果你想以逻辑Z基测量量子比特(即询问它是处于逻辑|0⟩还是逻辑|1⟩态),那么就以常规方式测量所有物理量子比特,询问每一个:“你是0还是1?”
- 最后,如果你想以逻辑X基测量那个逻辑量子比特(即它是|+⟩态还是|-⟩态),你可以简单地以物理X基测量每个数据量子比特(即进行变换后再进行常规测量)。
这些是最简单的逻辑操作:初始化和测量(两种基下均可)。
内存操作与探测
如果我们想做一点内存操作,而不仅仅是初始化后立即测量,而是在中间实际运行多轮错误检测,我们最终会得到一个看起来像这样的电路。这只是表面码的一个切片,因为讨论整个表面码的完整电路太复杂,不适合写在幻灯片上。
让我们以此作为表面码的代理,检查它是否按预期工作。
如果我们专注于检测比特翻转的电路(即测量Z型稳定子的电路),那么在最初,如果你想运行一个完整电路,会有一个单独的测量告诉我们关于错误的信息。因为我们期望在没有错误的情况下,这个测量返回结果0。
这个幻灯片上的电路与我们之前讨论过的关键区别在于初始的状态准备轮次。现在,我们不需要将这个测量与之前的测量进行比较,因为一开始就没有之前的测量,我们已经期望它是0。所以它本身就是一个探测器。
进入电路的主体部分,我们又回到了之前讨论的内容:我们将每个测量与它之前的测量进行比较,这是一个探测器。
还有一个新的情况:最后一轮测量。在这里,我们将把数据的直接物理测量与之前的测量进行比较。这两个测量是对Z型稳定子的直接测量,因为我们单独测量每个量子比特,我们可以取这两个测量的奇偶性,这将告诉我们是否处于+1或-1本征态。如果它们相等,我们得到+1本征态;如果不相等,我们测量到-1本征态。这意味着,如果我们取所有这三个测量的奇偶性,它本身就是一个探测器。在没有错误的情况下,它应该是偶数;如果附近有错误,它将是奇数。
三维电路与解码
让我们简要地看一下构成表面码的三维电路的一小部分,并强调没有什么不同,只是更复杂。你通常会使用软件进行分析,而不是在纸或幻灯片上,但原理没有不同。
你仍然基本上拥有一个由初始化、CNOT门和测量组成的电路。你有会传播并触发探测事件的错误。从根本上说,你将使用所有这些信息,构建一个现在是三维的图,其中边的权重代表导致该边(即该边端点处的探测事件)的所有错误过程的总概率。
然后,当你运行实际实验时,你将把这些探测事件挂在这个图上,在图上进行最小权重完美匹配,以找出最能解释观测到的探测事件的最可能的底层错误。
因此,即使是距离为5的码(页面上显示的是5x5个数据量子比特加上另外24个测量量子比特,这是一个49量子比特的电路),如果我们真的想运行这个电路,分析其输出并研究其性能,我们将需要一些相当先进的工具。这将是下一个视频的主题。
总结与延伸
在本节课结束之前,请注意,如果你对计算的更多细节感兴趣,我们只讨论了表面码中的内存操作。这里有几个参考资料,将带你了解在表面码上执行CNOT门和其他更复杂的多量子比特及单量子比特逻辑操作的细节。
无论如何,下次我们将讨论用于分析表面码的高级工具,特别是在内存的背景下,你仍然可以学到很多东西。
本节课中,我们一起学习了:
- 表面码的稳定子图形表示及其拓扑性质。
- 逻辑X和Z算符可以表示为连接特定边界的任意算符链。
- 设计稳定子测量电路时,门的顺序至关重要,必须避免错误传播降低代码距离。
- 正确的电路顺序能使错误传播方向与逻辑算符垂直,从而保持编码强度。
- 表面码中逻辑量子比特的初始化、测量和内存操作的基本方法。
- 表面码的错误检测和解码可以抽象为三维图上的匹配问题。


008:Stim 软件入门




在本节课中,我们将开始介绍 Stim。这是一个由 Craig Gidney 编写的软件,我们用它来模拟量子电路,特别是为量子纠错生成输出数据,以便评估特定纠错协议的效果。
本次讲解将是互动式的。我们会要求您访问 Stim 的代码仓库,下载并使用一些入门教程笔记本,并随着讲解实际编写几个示例代码,以熟悉这个工具及其使用方法。我们将详细讨论 Stim 的语法、文件格式以及使用它所需进行的操作。现在,让我们开始。
概述
上一讲我们以表面码结束,并提到即使是距离为 5(这仍然是一个相对较小的码),我们讨论的也是一个包含 49 个量子比特和大量门操作的电路。我们该如何模拟它呢?答案是使用 Stim。您当然可以查阅其原始参考文献,我鼓励您这样做。但核心要点是,这个软件模拟电路的速度比其他任何工具都快 1000 倍以上。举一个极端的例子,屏幕上显示的是距离为 5 的电路。想象一下距离为 100 的版本,宽度和高度都增加 20 倍。Stim 可以在 15 秒内模拟该电路(距离 100,100 轮),并以每秒 100 次的速度对该实验进行采样。这是一个非常强大且实用的工具,我们的目标是让您今天就开始使用它。
Stim 的输出与应用
使用 Stim 后,您可以得到以下结果:当您输入正确的代码来定义不同距离的表面码电路以及您希望使用的错误模型后,您可以使用配套工具包绘制逻辑错误率随物理错误率和码距离变化的图表,得到类似下图的结果。

这张图包含大量信息。其中最常讨论的两个数字是:
- 阈值错误率:在这个错误率下,增加纠错资源(即增大码的尺寸)并不能有效抑制逻辑错误。这对理论研究很有用。
- 实际目标错误率:在实践中,您更想知道的是类似这个数字:在什么物理错误率下,每次将码距离增加 2,逻辑错误率就能被抑制 10 倍?
我们通常将这个抑制因子称为 λ。实现具有良好 λ 值的物理硬件是量子计算硬件研究的主要目标。使用 Stim 这类工具的目的,是研究何种物理错误率、架构和纠错码可以减轻硬件的负担,从而以更少的物理努力实现更高的 λ 值。
Stim 语法入门
首先,我们来讨论 Stim 的语法。和之前一样,我们通常避免讨论整个表面码电路,因为它太复杂。我们将专注于表面码的一个片段,它看起来像重复码。这是一个我们反复使用的经典示例,因为它简单且能很好地代表表面码的工作原理。
右侧的这个电路正是从表面码中提取的这一部分。它只关注比特翻转错误,但包含了所有必要的操作流程。让我们具体看看如何用 Stim 的符号来定义这个重复码电路。
本质上,Stim 的输入是一个文本文件,它指定了所有门操作以及您希望施加在这些门上的所有错误过程。它从简单的重置所有量子比特开始。
以下是 Stim 文件的一个示例片段及其解释:
R 0 1 2 3 4
- 语法:
R后跟一个数字列表。 - 含义:重置列表中的每一个量子比特。
- 对应电路:这对应电路图中蓝色的初始化部分。
接下来,我们需要显式地应用错误。Stim 不会为任何门假设特定的错误模型;如果您不指定错误,门操作将被完美执行。因此,我们需要手动添加错误。
DEPOLARIZE1(0.001) 0 1 2 3 4
- 语法:
DEPOLARIZE1(p)后跟量子比特列表。 - 含义:以概率
p(例如 0.001)对列表中的每个量子比特施加单量子比特退极化噪声。这意味着有相等的概率发生 X、Y 或 Z 错误(或保持为 I)。 - 对应电路:这对应在数据量子比特上随机、独立地施加比特翻转错误(在退极化模型中,X 错误是比特翻转的一种)。
然后,我们应用一些 CNOT 门。
CX 0 1 0 2
- 语法:
CX后跟控制量子比特和目标量子比特列表。 - 含义:以量子比特 0 为控制位,分别以量子比特 1 和 2 为目标位执行 CNOT 操作。
- 注意:我们需要手动为每个双量子比特门添加错误,也不能忘记为闲置的量子比特添加单量子比特噪声。
DEPOLARIZE2(0.001) 0 1 0 2
DEPOLARIZE1(0.001) 3 4
DEPOLARIZE2(p):以概率p对指定的双量子比特门施加双量子比特退极化噪声。这意味着在 15 种可能的非平凡泡利算子乘积(如 IX, IZ, XI, XX, XY, ... , ZZ)中,每种发生的概率相等。DEPOLARIZE1(p):对闲置的量子比特 3 和 4 施加单量子比特噪声。
我们可以继续更快地浏览后续步骤。这些是朝上的 CNOT 门,同样需要为闲置量子比特添加单量子比特噪声,为双量子比特门添加双量子比特噪声。
一个需要注意的点是:当您想要模拟有错误的测量时,您需要在测量门之前添加错误。因为一旦测量完成,就不再存在量子态。因此,您需要将有错误的测量建模为在测量门之前发生错误。
DEPOLARIZE1(0.001) 1 3
M 1 3
现在,我们遇到了一个新的概念:探测器。我们在这个视频系列中广泛讨论了探测器,现在我们在 Stim 代码中看到了它的具体实现。
DETECTOR(1, 0) rec[-1]
- 语法:
DETECTOR(x, t) rec[-n] - 含义:
(1, 0):一个用户自由指定的任意坐标。明智的做法是将其指定为与量子比特相关的方式,以便于记忆。这里我们选择用坐标 (1, 0) 表示,您可以将其理解为与量子比特 1 相关,时间步为 0。rec[-1]:访问最近一次的测量结果。rec数组存储测量结果,-1表示最近一次,-2表示上一次,依此类推。
- 作用:通过提供初始化的状态,我们知道这个测量结果应该是 0。如果它不是 0,那就表示一个探测事件。因此,单个测量本身就可以作为一个探测器。
以上就是电路的一个模块。您还可以添加 TICK 指令,这有助于 Stim 美观地显示电路。
TICK
TICK 指令只是将电路划分为易于人类理解的步骤,便于 Stim 整齐地显示。它们对模拟本身没有影响,只是便于检查您输入的电路是否正确。由于屏幕空间有限,我们后续将省略它们。
构建多轮电路
现在,让我们继续到下一个模块。表面上它和第一个模块相似,是第一个模块的重复,但没有初始化门。我们希望能够多次重复它,当然不希望每次都显式地写出这些门。您不需要这样做,因为 Stim 有重复块的概念。
REPEAT 5 {
# ... 这里是第二轮及以后各轮的门和错误 ...
SHIFT_COORDS(0, 1)
DETECTOR(1, 0) rec[-2] rec[-1]
}
这里有一些新的东西:
REPEAT n { ... }:将其中的内容重复执行n次。SHIFT_COORDS(dx, dt):此指令意味着之后定义的每个探测器的坐标都将被这里指定的值所偏移。这里我们指定空间坐标 (dx) 不变,时间坐标 (dt) 增加 1。因此,后续轮的探测器将与之前的轮次在时间上相差一个单位。这同样是任意的,选择易于记忆和直观的数字关系是明智的。DETECTOR(1, 0) rec[-2] rec[-1]:现在我们的探测器涉及两次测量。为了检测错误,必须将其与之前的测量结果进行比较。在 Stim 中,最近的测量结果存储在rec数组中,使用-1访问最近一次,-2访问上一次,依此类推。在文件中,您需要理清这个线性数组,并确定实际需要比较哪些测量结果来构建您的探测器。
最终轮测量与逻辑错误
最后一部分是最终轮的测量。这比之前的电路简单得多。然而,需要记住的关键点是,现在我们需要在最后一轮中取成对的测量结果,并与倒数第二轮中的单个测量结果进行比较。
DETECTOR(1, 0) rec[-3] rec[-2] rec[-1]
这里最大的新内容是,我们现在有了一个包含三次测量的探测器。
现在,我们还需要最后一件事:判断我们的实验是否成功。如果我们将数据量子比特初始化为全零,并且实验成功,那么在经过所有校正之后,我们最终应该得到零态。这意味着任何一次经过校正的测量结果都应该是 0。如果在校正后,这些测量结果是 1,说明我们的校正在某个时间点失败了,数据没有被保存下来。这将被记录为发生了一次逻辑错误。
由于这些最终测量中的任何一个都能告诉我们是否成功保存了状态,我们选择让 Stim 跟踪的可观测量是这些最终测量中的任何一个。我们选择了 rec[-1](最近一次测量),但选择 rec[-2] 或 rec[-3] 同样有效,它们都是最后一轮的测量,都能告诉我们是否成功地将状态从 0 保存下来,还是错误地翻转为 1。
OBSERVABLE_INCLUDE(0) rec[-1]
- 语法:
OBSERVABLE_INCLUDE(index) rec[-n] - 含义:将指定的测量结果纳入到索引为
index的逻辑可观测量的计算中。如果所有相关测量结果的奇偶性(通常经过校正后)与预期不符,则记录一次逻辑错误。
实践练习
现在,是一些练习。此时,您最好暂停视频,去实际操作。
-
组装与修改:访问 Stim 的 GitHub 仓库,下载并开始编码。首先,将本幻灯片中的所有代码片段组装成一个单独的文件。添加
TICK指令,以便清楚哪些门操作被分组在一起。然后修改它,进行一个小改动以获得使用该格式的经验:修改它,使最后一轮的测量不与前一轮分开,而是发生在同一时间。因为物理上没有必要延迟这些测量,完全可以同时进行。 -
生成参数化电路:完成上述步骤后,您需要认识到 Stim 的真正用途不是单个文件对应单个码距离。您真正需要的是创建一个 Python 脚本,该脚本能为任意的码距离
d和任意的错误率p输出那个文本文件。脚本中应该有您输入的变量,输出应该是一个具有相应生成电路和错误模型的 Stim 文件。如果这看起来工作量很大,确实如此。目前有研究试图使其更容易、更直观,不需要低级编程来创建电路、探测器等所有内容以便运行 Stim 模拟。但目前,这就是练习,请尝试一下。 -
使用内置函数与自定义模型:尝试之后,问题来了:这个函数放在哪里?Stim 中有一个类似的函数示例,您可以使用它来生成重复码的内存实验。您可能会问,为什么我们还要做上一个练习?答案是,内置函数生成的错误模型与我们刚才所做的不完全相同。内置函数不会在闲置量子比特上施加错误。我们在上一个练习中构建的,是文献中一个非常常见的错误模型,其中每个量子比特,无论是否正在执行门操作,都会受到噪声影响。这不是 Stim 的默认设置,您必须自己编码。现在您已经编码了。您需要做的是在 Stim 的入门笔记本中找到这个函数(您会在第 7 节找到它),并用您编写的函数替换它。这样做之后,您将能够使用您的函数(生成带有您定义的错误模型的电路)来模拟不同码距离和物理错误率的输出。
您将得到类似下图的输出。对于较大的码距离和较低的错误率,您将看到错误被迅速抑制。

深入分析与关键指标
让我们更进一步,继续学习入门笔记本,并特别注意:当您使用更大的码时,错误率必须低于阈值才能获得改进。这对所有形式的量子纠错都是通用的:总存在一个阈值错误率。这个阈值错误率越高越好,因为更容易建造满足该约束的设备,从而更有可能从纠错中实际获益。
同样,如前所述,虽然阈值错误率是一个很好的数字,但更好的数字是每次将码距离增加 2 时获得 10 倍抑制的错误率(即 λ 对应的错误率)。请花时间找出您编写的重复码和 Stim 中的表面码示例的这个错误率。
一旦您有了这些数字,它们就为您未来的大量工作奠定了基础。当您想计算一个算法的开销时,您可以利用内存实验中错误随码距离的抑制速率,来计算在整个算法体积中可能累积多少错误。这将告诉您需要多强的纠错能力(即需要多大的码距离),进而算出算法的开销(需要多少量子比特、多少时间才能执行一个算法)。这一切都始于为简单的内存实验创建此类图表。
总结
本节课中,我们一起学习了 Stim 软件的基本概念和语法。我们了解了如何使用 Stim 定义量子电路和错误模型,特别是针对重复码这一示例。我们探讨了探测器在 Stim 中的实现方式,以及如何构建多轮实验和定义逻辑错误。通过实践练习,我们掌握了创建参数化 Stim 电路文件的方法,并理解了评估纠错码性能的关键指标,如阈值错误率和逻辑错误抑制因子 λ。这些是使用 Stim 进行量子纠错模拟和分析的基础。

下次课,我们将看看 Craig Gidney 编写的另一个工具——Crumble,它用于分析表面码中一些最复杂的电路,那些实际允许您执行逻辑操作以及移动代码等更复杂功能的电路。
009:Crumble工具介绍 🧩


在本节课中,我们将学习一个由Craig Gidney编写的先进分析工具——Crumble。这个工具能帮助我们深入理解泡利算符如何在量子电路中传播,并特别有助于我们洞察“探测器”的位置和本质。理解探测器对于量子纠错至关重要。
什么是Crumble?🔍
Crumble是一个允许你指定一个通用量子电路,然后输入泡利算符并观察其传播过程的工具。在屏幕上,你可以看到一个X错误(用红色表示)通过一系列CNOT门传播并到达一系列测量点的示例。我们首先需要理解这些彩色线条的含义,以及它们如何让电路行为变得更清晰。
泡利算符传播与颜色编码 🎨
首先回顾一下,当错误通过CNOT门传播时:
- 如果X错误(红色)进入CNOT门的控制位,它会在输出端分裂为两个X错误(两条红线)。
- 如果Z错误(蓝色)进入CNOT门的控制位,它会在输出端分裂为两个Z错误(两条蓝线)。
- 如果错误进入CNOT门的目标位,它会同时出现在输出端的控制位和目标位上。
此外,当错误通过哈达玛门或其他基变换门时,会发生转换。例如,一个X错误(红线)可能转换为一个Z错误(蓝线)。Y错误则用绿线表示。
颜色编码总结:
- 红色:X错误
- 蓝色:Z错误
- 绿色:Y错误
深入解析:从零状态到探测器 🧠
让我们通过一个具体例子,从底层理解Crumble工具告诉我们的信息。假设我们向Crumble输入一个电路,并追踪一个泡利算符。
考虑一个Z算符(蓝点)。这个电路将测量量子比特初始化为|0>态,即Z算符的+1本征态。因此,在电路的这个位置放置一个蓝点,意味着我们知道此时系统处于Z的+1本征态。
随着电路向前推进,经过CNOT门后,我们知道此时两个量子比特处于ZZ算符的+1本征态。继续经过下一个CNOT门,我们得到ZZZ算符的+1本征态。
接下来,我们将测量其中一个量子比特。这个测量结果(0或1)会告诉我们该量子比特处于Z的+1还是-1本征态。由于测量前我们知道整个系统处于ZZZ的+1本征态,因此测量后,剩余两个量子比特的ZZ本征态将与中间量子比特的测量结果相关联。换句话说,测量后ZZ的本征值等于被测量量子比特Z的本征值。
继续向前,有一个重置门。这为系统引入了新的知识:我们知道中间量子比特再次处于Z的+1本征态。结合之前已知的ZZ本征态信息,我们现在又知道了ZZZ的本征态,其值由之前的测量结果决定。
最后,经过后续的CNOT门传播,算符最终坍缩为末端单个量子比特上的Z算符。这意味着:在无错误的情况下运行此电路时,第一个测量报告的结果(+1或-1本征态)将与末端量子比特的状态完全相同。因此,末端测量应与第一个测量结果一致。
这就是通过追踪算符来发现探测器的方法:找出那些在无错误时应给出相同结果的测量对。
探测区域与探测事件 📊
那么,屏幕上所有的蓝色区域意味着什么?它意味着探测区域。任何发生在蓝色高亮位置的、与此类算符(此处为Z)反对易的错误(例如X错误),都会导致这些测量结果的一致性发生改变,从而被检测到。
- 探测区域:图中所有蓝色覆盖的时空区域。
- 探测器:由探测区域关联起来的一组测量。
- 探测事件:当你将实验测量值代入时,如果这些本应匹配的测量结果出现奇偶性错误(即不匹配),就发生了一次探测事件。
实战演练:在Crumble中分析表面码 ⚙️
现在,让我们在实践中使用Crumble。打开工具后,你可以从头定义电路,或直接点击示例。我们选择了一个表面码的例子:code_distance=3,长度为两轮。
右侧显示了电路。我们的目标是使用Crumble分析该电路,找出其中的探测器,就像我们在幻灯片上手动分析简单例子一样。
操作步骤如下:
- 选择一个重置门,按
Z键并输入标签1,放置一个Z算符。右侧窗口立即显示该算符在电路中的传播过程。 - 蓝色线条表示,由于我们将该量子比特初始化为|0>态,因此在任何时间切片上,Z算符所触及的所有蓝色位置的本征态都是已知的。
- 推进到下一个测量点,点击将其纳入我们的知识集。这相当于将该量子比特从算符中“切掉”,现在基于这个测量结果,我们将知道这四个数据量子比特上的四体Z算符(ZZZZ)的本征态。
- 继续到下一轮,包含另一个重置门。有时需要一些尝试来确定需要包含哪些重置和测量才能提取有用信息。
- 当所有线条在屏幕上形成一个闭合区域时,就提取到了有用信息。我们可以在最终测量上放置一个Z算符来完成闭合。
- 现在,我们得到了一个漂亮的闭合区域——一个探测区域,它包含两个测量,这两个测量构成了一个探测器。
进阶示例:复杂电路中的探测器 🔬
上面的表面码例子相对规律,我们可能无需高级工具也能推断。现在让我们看一个更复杂的电路,它是测量逻辑量子比特Y基过程的一部分。
在这个复杂区域,如果我们尝试像之前一样放置Z算符并传播,会得到一团乱麻。紫色高亮的减号告诉我们,某些测量只会给出随机无用的信息,这本身不会形成探测器。
这时,Crumble的强大之处就显现出来了。你可以进行交互式探索:
- 尝试包含不同的重置门。
- 观察包含特定重置和测量后,是否得到了非随机的、确定的本征态信息。
- 通过反复试验,你可能会发现,需要组合两个初始重置、另外两个重置以及三个特定测量,才能确定一个通常的表面码稳定子(如ZZZZ)的本征态。
Crumble允许你发现这些复杂的结构,并建立关于如何构建探测器的直觉。
逆向分析:从已知稳定子开始 🔄
我们还可以从另一个角度分析。假设前一轮已经准备了一个已知的稳定子本征态,我们想知道当前电路如何测量它。
- 清除所有标记,从代表已知稳定子的位置开始(例如放置Z算符)。
- 推进电路,观察传播过程。
- 你会发现,需要结合本轮中特定位置的一个Z基测量和一个X基测量,才能知道那个四体ZZZZ稳定子的本征态。
因此,我们可以用这两个测量结果,与前一轮准备的本征态信息进行比较,从而形成探测器。
总结来说,我们掌握了两种利用Crumble构建探测器的方法:
- 从重置开始:看需要结合哪些测量来准备一个已知的稳定子本征态。
- 从已知稳定子开始:看需要结合哪些重置和测量来测量该本征态。
这两部分信息分布在不同的电路轮次中,即使在这种复杂的电路里,也能让你成功构建探测器。
课程总结 🏁
本节课我们一起深入学习了Crumble工具。我们了解到:
- Crumble是一个用于可视化泡利算符在量子电路中传播的先进分析工具。
- 它使用红、蓝、绿三色分别代表X、Z、Y错误,直观展示了错误传播和变换的路径。
- 通过追踪算符,我们可以找出电路中的探测区域和探测器,即那些在无错误时应输出一致结果的测量集合。
- 我们通过实例演示了如何在Crumble中交互式地分析表面码等量子纠错电路,即使对于复杂结构,也能通过探索找到构成探测器的关键操作组合。

掌握Crumble将极大地增强你分析和设计量子纠错电路的能力,特别是在理解错误传播和验证探测器设置方面。希望你能借助这个工具,更深入地探索量子纠错的精妙世界。

浙公网安备 33010602011771号