← 返回蜂巢洞察

为什么你的量子电路在模拟器中能够正常运行,但在真实的硬件设备上却会失败?[完整指南]

如果完全相同的量子电路在模拟器中能够完美运行,那么为什么在实际的量子计算机上却常常会产生不同的结果呢? 这个问题几乎让每一位量子开发者都感到困惑。如果你打算开发更大规模、更可靠的量子应用,理解这个现象就至关重要。 本教程假设你已经熟悉如何在 Qiskit 中创建和执行基本的量子电路。 当你第一次在真实硬件上运行一个量子电路时,你可能会认为其输出结果应该与模拟器中的结果一致。毕竟,代码、算法和编译器都是相同的。然而实际情况往往并非如此。 有时候这种差异几乎难以察觉;而有时,那些在模拟器中运行得非常完美的电路,在实际设备上却会产生令人费解的输出结果。当你的量子电路结构变得更加复杂,涉及的量子比特数

如果完全相同的量子电路在模拟器中能够完美运行,那么为什么在实际的量子计算机上却常常会产生不同的结果呢?

这个问题几乎让每一位量子开发者都感到困惑。如果你打算开发更大规模、更可靠的量子应用,理解这个现象就至关重要。

本教程假设你已经熟悉如何在Qiskit中创建和执行基本的量子电路。

当你第一次在真实硬件上运行一个量子电路时,你可能会认为其输出结果应该与模拟器中的结果一致。毕竟,代码、算法和编译器都是相同的。然而实际情况往往并非如此。

有时候这种差异几乎难以察觉;而有时,那些在模拟器中运行得非常完美的电路,在实际设备上却会产生令人费解的输出结果。当你的量子电路结构变得更加复杂,涉及的量子比特数量增多,或者包含的逻辑门更多时,这些差异就会变得愈加明显。

当我第一次遇到这种现象时,我和许多初学者一样,第一反应就是:“肯定是在某个地方出了错。”

我仔细检查了自己的代码,核实了所有的逻辑门,也对比了电路图,还重新运行了一次模拟实验。一切看起来都正常,问题显然不在于算法,而在于硬件。

与Qiskit Aer所模拟的理想环境不同,真实的量子处理器所处的环境充满了各种不完美因素。量子比特会逐渐丢失其量子信息,逻辑门的运算结果也永远不会完全精确,测量过程本身也会引入不确定性。即使那些还在等待执行操作的量子比特,也会持续与其周围环境发生相互作用,从而在下次被使用时积累误差。

这些挑战统称为量子噪声,它们正是当前阻碍量子计算机可靠地进行复杂计算的主要因素之一。

幸运的是,量子研究者们并没有停滞不前。多年来,他们开发出了许多技术来减少量子噪声的影响,从而提高量子计算的准确性。从广义上来说,这些技术可以分为两大类:

  • 错误纠正:这种技术在电路执行完成后,会估算并弥补其中出现的错误。

  • 错误预防:这类技术旨在在电路运行过程中,从源头上防止许多错误的产生。

最近,这些先进的技术已经开始通过一些对开发者友好的工具得以应用,而不再需要研究人员手动调整每一个量子电路的参数了。

最新的一个例子就是Orbit——这是一个可以通过Qiskit Functions Catalog获得的自动化量子错误预防工具。它不需要开发者掌握动态解耦等技术,就能轻松地将这些先进功能集成到现有的Qiskit工作流程中。

但在我们理解为什么像Orbit这样的工具如此重要之前,首先需要了解它们所解决的问题。

正是这一点,我们将在本教程中重点探讨。我们不会直接开始学习新的工具,而是会研究量子计算领域中最常见、也最重要的问题之一:

为什么量子电路在真实硬件上的表现与在模拟器中的表现不同?

通过这个过程,你将了解到量子错误产生的原因,如何使用Qiskit Aer在本地重现许多这类错误,为什么更大的量子电路会越来越难以可靠地执行,以及现代的错误抑制技术是如何帮助开发者从现有的量子计算机中获得更有用的结果的。

读完本指南后,你不仅会明白是什么导致了量子电路在真实硬件上出现故障,还会知道开发者可以采取哪些措施来应对这些问题。

目录

实验:在模拟器和真实硬件上运行相同的电路

使用Qiskit学习量子计算的最大优势之一就是,你不需要立即就能使用量子计算机。你可以先在本地使用Qiskit Aer编写、测试和调试电路,然后再在真实的IBM量子硬件上运行它们。

让我们从量子开发者最初可能会构建的电路之一开始:贝尔态

从熟悉的电路入手

贝尔态通常是开发者在学习量子编程时遇到的第一个例子,因为它能够展示量子计算最令人着迷的特性之一:纠缠

创建bell_state.py文件:

from qiskit import QuantumCircuit

# 创建一个包含两个量子比特和两个经典比特的量子电路
qc = QuantumCircuit(2, 2)

# 将第一个量子比特置于叠加态
qc.h(0)

# 使第二个量子比特与第一个量子比特发生纠缠
qc.cx(0, 1) 

# 对这两个量子比特进行测量
qc.measure([0, 1], [0, 1]) 

print(qc)

在这段代码中,Hadamard门将第一个量子比特置于叠加态,而CNOT门则使第二个量子比特与它发生纠缠。一旦对这两个量子比特进行测量,它们总是会产生相同的测量结果。

在理想的量子计算机中,你只会得到两种测量结果:

  • 00

  • 11

每种结果出现的概率应该大致相同。

0110这样的结果是不可能出现的,因为它们违反了贝尔态所期望的关联特性。

步骤1:在模拟器上运行电路

你将首先使用Qiskit Aer模拟器来执行这个电路:

from qiskit_aer import AerSimulator

simulator = AerSimulator()

result = simulator.run(
    qc,
    shots=4096
).result()

counts = result.get_counts()

print(counts)

将模拟器添加到bell_state.py文件中后,你的代码就会变成这样:

from qiskit import QuantumCircuit
from qiskit_aer import AerSimulator

qc = QuantumCircuit(2, 2)

qc.h(0)

qc.cx(0, 1)

qc.measure([0, 1], [0, 1])

simulator = AerSimulator()

result = simulator.run(
    qc,
    shots=4096
).result()

counts = result.get_counts()

print(counts)

请确保你的虚拟环境已经激活(source .venv/bin/activate),并且你已经安装了Qiskit以及Qiskit Aer(pip install qiskit qiskit-aer)。

运行python bell_state.py,典型的输出结果如下所示:

{'00': 2039, '11': 2057}

由于量子测量具有概率性,因此你得到的结果可能会略有不同,但整体趋势应该是一样的。

只有0011这两种结果会出现,并没有出现任何意外的测量结果,一切都在符合量子理论的预测范围内运行。

从这个结果来看,你很有理由相信自己的电路是正确的——确实如此。但在这些完美的结果背后,其实隐藏着一个重要的细节。

注意:这个模拟器假设使用的是理想的量子计算机。

由于它只是计算你的量子态的数学演变过程,因此不必考虑硬件的限制因素。

此外,该模拟器还做了以下这些假设:

  • 所有的量子门都能被完美地执行。

  • 量子比特永远不会失去它们的量子状态。

  • 所有的测量结果都一定是准确的。

  • 外部环境不会干扰计算过程。

  • 在电路运行过程中不会出现任何额外的噪声。

正是因为这些假设,模拟器才在学习和调试量子算法方面发挥了极其重要的作用。

不幸的是,真实的量子处理器并不总是在理想的环境中运行。

步骤2:在真正的量子计算机上运行相同的电路

现在,请想象将这个完全相同的电路在真实的量子处理器上运行。

请注意,没有任何地方需要改变——无论是代码、算法还是贝尔态本身。我们唯一改变的,就是电路运行的环境而已。

如果你将这个电路提交给真正的量子计算机进行测试,你可能会期望得到与模拟器相似的结果。毕竟,如果算法是正确的,那么输出结果应该也是一样的才对吧?

但实际上,你往往会得到这样的结果:

{
    '00': 1912,
    '11': 1834,
    '01': 161,
    '10': 189
}

首先引起注意的是出现了两个意料之外的结果:0110

在模拟器中并没有出现这些结果,那么它们是从哪里来的呢?答案并不是你的代码突然出了问题。

贝尔态电路本身并没有发生变化,模拟器也没有给你提供错误的信息。

实际上,是量子硬件的不完美导致了这些结果。在电路运行过程中,某些量子门可能无法被完全准确地执行;有些量子比特可能在计算结束之前就失去了它们的量子信息;偶尔也会出现测量结果错误的的情况。

单独来看,这些错误通常都非常微小,但累积起来就会改变最终的测量结果。对于简单的贝尔态来说,这种差异其实还算比较小的。

然而,真正的量子算法很少只涉及两个量子比特和两个量子门而已。

随着电路结构变得越来越复杂,这些微小的缺陷也会逐渐累积。最终,它们可能会压倒算法试图保护的量子信息,从而导致最终结果的可信度降低。

这是当今量子计算机所面临的最大挑战之一。

模拟器可以让我们了解在理想条件下,量子算法应该会如何运行

而真实的硬件设备则能展示出在存在噪声的情况下,同一算法会表现出怎样的行为。缩小这种差距是现代量子计算研究的核心目标之一。

在探讨诸如量子错误抑制这类技术,或了解Orbit等工具如何帮助自动化相关流程之前,你首先需要明白这些错误究竟是从哪里产生的。

真实的量子计算机内部发生了什么?

到目前为止,我们发现了一个几乎会让所有新接触量子计算的人感到惊讶的事实:

同样的量子电路,在不同的环境中运行时,可能会产生不同的结果。

但这自然引出了另一个问题:

在真实的量子计算机内部究竟发生了什么,而这些现象在模拟器中又是如何无法重现的?

要回答这个问题,你就需要超越Python代码本身,去了解当你点击运行按钮之后,到底会发生什么。

从Python代码到物理量子比特

当你使用Qiskit Aer来执行一个量子电路时,模拟器会进行数学计算,以确定量子态会如何演变。它运用复数和线性代数的知识,严格按照量子力学的预测来执行每一个操作。

除非你刻意引入噪声模型,否则没有任何因素会干扰这种计算过程。

而真实的量子计算机的工作原理则完全不同。它们操纵的并不是数学对象,而是物理量子比特

根据不同的硬件架构,这些量子比特可能由以下几种方式实现:

  • 被冷却到远低于外太空温度的超导电路

  • 通过电磁场悬浮起来的囚禁离子

  • 被光学镊子固定住的中性原子

  • 其他新兴的量子技术

尽管这些平台使用的硬件各不相同,但它们都有一个共同的特点:

量子比特极其脆弱

与传统的二进制位不同,传统比特在状态未被改变之前始终保持01的状态;而量子比特则必须在整个计算过程中始终保持诸如叠加态和纠缠态这样的复杂量子特性。

维持这些特性的难度远远超出了人们的想象。

每一个量子操作都是一种物理过程

当你编写这样的代码时:

qc.h(0)
qc.cx(0, 1)

这一过程看起来几乎毫不费力。只需要两行Python代码,执行时间还不到一秒钟。

然而,在幕后,量子处理器实际上要执行一系列精心设计的物理操作。

控制电子设备会生成微波脉冲或激光脉冲,这些信号会通过专门的硬件设备进行传输。

这些脉冲会在极短的时间内与各个量子比特发生相互作用,因此timing必须精确到极致。

如果这一过程中的任何环节出现哪怕微小的偏差,最终产生的量子状态都可能会发生变化。

现在想象一下,在同一个算法中重复这个过程数十次、数百次甚至数千次,那些细微的缺陷就会逐渐累积起来。

最终,这些小错误会在最终的测量结果中显现出来。这就是我们通常所说的量子噪声

什么是量子噪声?

“量子噪声”是一个统称,用来指任何会导致量子计算机偏离量子力学所预测的理想行为的因素。

通常来说,这并不意味着发生了什么严重的故障。

大多数情况下,这些错误都非常微小。

某个逻辑门可能会使量子比特旋转一个与预期值略有不同的角度;

在等待下一次操作时,某个量子比特可能会丢失一部分量子信息;

有时测量结果也可能显示错误的量子状态。

单独来看,每一个错误似乎都无关紧要。但问题在于,量子算法通常会涉及大量的计算步骤。

即使是很微小的误差,也会逐渐累积起来。想象一下,如果试图复制一张手写的页面,一个拼写错误可能并不会造成什么影响;

但如果重复复制数百次,每次都加入一个小错误,最终得到的文件就会与原始文件相差甚远。

量子电路的工作原理也是如此。计算时间越长,错误累积的机会就越多。

四种常见的量子噪声来源

尽管研究人员研究了多种不同类型的量子错误,但大多数开发者遇到的主要是以下四类。

了解这些原因,有助于你理解为什么量子硬件的实际表现会与理想模型有所不同。

1. 烦散

量子计算面临的最大挑战之一就是烦散。一个量子比特只能保持其量子状态一段时间,一旦与环境发生相互作用,它存储在叠加态中的信息就会丢失。

可以这样理解:想象把一枚硬币放在桌子上旋转。刚开始旋转时,硬币处于一种快速变化的状态,既不是正面也不是反面;随着时间推移,摩擦力会逐渐使其停下来,最终它会稳定在一个特定的状态。

量子比特也会出现类似的信息丢失现象。只不过,导致这种现象的原因并非摩擦力,而是它们与周围环境发生的微弱相互作用。

如果你的量子电路执行所需的时间过长,那么在计算完成之前,某些量子比特可能会开始丢失它们的量子信息。

2. 门操作错误

每一个量子门都代表一种物理操作。理想情况下,哈达玛德门总是会执行完全相同的变换。但实际上,没有任何硬件是完美的。

用于实现该量子门的脉冲信号可能会比预期的强度稍大、稍弱,或者延迟时间略有不同。这些细微的误差就会导致门操作错误的发生。

一个有缺陷的量子门通常不会造成太大问题,但数百个有缺陷的量子门叠加在一起时,问题就会变得严重了。

这就是为什么复杂的量子电路往往比简单的量子电路表现更差的原因之一。

3. 测量误差

即使你的计算成功完成了,仍然存在最后一个挑战:

读取结果。

测量一个量子比特本身也是一个物理过程。有时,硬件会错误地将某个量子比特识别为1,而实际上它应该是0,反之亦然。

想象一下,如果你使用的是一台偶尔会多显示两公斤体重的体重秤,那么出现这种误差的原因其实是在于测量仪器本身,而不是你。

量子计算机在读取量子比特的状态时也会遇到类似的问题。

4>空闲状态下的噪声

其中一种不太容易被人们察觉的量子噪声来源,发生在某个量子比特处于完全静止、没有进行任何操作的时候。

假设有一个量子比特正在等待,而另一个量子比特正在被测量或参与多量子比特操作,那么这个处于空闲状态的量子比特并不会停止与周围环境的相互作用。在这段等待时间内,它可能会逐渐失去其量子态的稳定性。

随着量子电路规模的扩大,这种空闲状态会变得更加普遍。

为了减少这些等待时间带来的影响,人们开发出了诸如动态解耦这样的先进误差抑制技术——我们以后在讨论Orbit时还会详细探讨这一技术。

为什么模拟器不会显示这些问题

如果你目前只使用过Qiskit Aer,你可能会好奇为什么自己从未遇到过这些问题。

答案很简单。

默认情况下,模拟器并不是在尝试模拟一台有缺陷的量子计算机,而是在试图模拟理想状态下的量子计算机

正因为如此,模拟器才是一个非常优秀的学习工具——因为你可以在不担心硬件限制的情况下,验证自己的算法是否在逻辑上是正确的。

但这也意味着,模拟器无法让你完全了解在实际的量子设备上会发生什么情况。

要想理解这种差异,你就需要自己动手进行实验来验证。

幸运的是,Qiskit为我们提供了这样的机会。

你不必等到能够使用真正的量子计算机时才开始实验,可以直接在本地模拟器中人为地引入真实的噪声,然后观察贝尔态会如何发生变化。

使用Qiskit Aer模拟量子噪声

到目前为止,你们已经比较了两种不同的情况。

在第一种情况下,我们的贝尔态电路在理想的模拟器中运行,在这种模拟器中,每一个量子操作都完美无缺。

在第二种情况下,同样的电路在实际的量子处理器上运行,在那里,量子比特会不断受到周围环境中的噪声的影响。

显而易见,这里存在一个挑战:

如果你没有量子计算机,该怎么办?

你仍然可以研究噪声是如何影响你的算法的吗?幸运的是,你可以。

Qiskit最实用的功能之一就是它能够使用Qiskit Aer在本地模拟真实的硬件缺陷。你不必等到电路真正运行在量子处理器上,就可以在模拟器中引入各种类型的噪声,然后观察这些缺陷会如何影响最终的结果。

这样,你就可以在自己的电脑上进行实验、调试,并更好地理解量子算法的行为。

让我们来看看它是如何工作的吧。

创建一个简单的噪声模型

Qiskit Aer提供了一组工具,用于构建自定义的噪声模型。这些模型可以帮助你模拟刚才提到的各种错误类型,包括门操作错误、测量错误以及量子比特的去相干现象。

对于你的第一个实验,可以简单地在每个单量子比特门和双量子比特门之后引入少量随机误差:

from qiskit_aer.noise import NoiseModel, depolarizing_error

# 创建一个空的噪声模型
noise_model = NoiseModel()

# 定义门操作错误
single_qubit_error = depolarizing_error(0.01, 1)
two_qubit_error = depolarizing_error(0.03, 2)

# 将这些错误应用到常见的量子门上
noise_model.add_all_qubit_quantum_error(
    single_qubit_error,
    ["h", "x", "y", "z"]
)

noise_model.add_all_qubit_quantum_error(
    two_qubit_error,
    ["cx"]
)

在这段代码中,你创建了一个空的NoiseModel,并定义了两种退极化误差

退极化误差是模拟硬件噪声最常见的方法之一。模拟器不会每次都完美地执行门操作,而是会以一定的概率使量子比特的状态变得部分随机化。

可以把这种情况想象成拍了一张有点模糊的照片:照片仍然与原图相似,但各种细微的瑕疵使得人们更难分辨出其中的细节。

退极化噪声对量子态的作用本质上就是这样的。

注意,我们使用了两种不同的错误概率:

  • 1% 用于单量子比特门

  • 3% 用于双量子比特门

这反映了当今量子硬件的一个重要特点。

通常来说,执行双量子比特操作要比执行单量子比特操作更加困难,因此在实际的量子处理器上,双量子比特操作的精确度往往也会更低。

在存在噪声的情况下运行贝尔态实验

将我们之前使用的bell_state.py文件重命名为bell_state_noise.py,这样就能表示该代码中添加了NoiseModel模块。

使用我们的噪声模型重新配置模拟器:

from qiskit_aer import AerSimulator

noisy_simulator = AerSimulator(
    noise_model=noise_model
)

compiled = transpile(qc, noisy_simulator)

job = noisy_simulator.run(
    compiled,
    shots=4096
)

result = job.result()

counts = result.get_counts()

print(counts)

此时,你的bell_state_noise.py文件应该看起来像这样:

from qiskit import QuantumCircuit
from qiskit_aer import AerSimulator
from qiskit_aer.noise import NoiseModel, depolarizing_error

# 第一步:构建贝尔态电路
qc = QuantumCircuit(2, 2)

# 将量子比特0置于叠加态
qc.h(0)

# 使量子比特1与量子比特0发生纠缠
qc.cx(0, 1)

# 对两个量子比特进行测量
qc.measure([0, 1], [0, 1])

print("贝尔态电路")
print(qc)


# 第二步:在理想模拟器上运行实验
ideal_simulator = AerSimulator()

ideal_result = ideal_simulator.run(
    qc,
    shots=4096
).result()

ideal_counts = ideal_result.get_counts()

print("\n理想模拟器的结果")
print(ideal_counts)


# 第三步:创建噪声模型
noise_model = NoiseModel()

single_qubit_error = depolarizing_error(0.01, 1)
two_qubit_error = depolarizing_error(0.03, 2)

noise_model.add_all_qubit_quantum_error(
    single_qubit_error,
    ["h", "x", "y", "z"]
)

noise_model.add_all_qubit_quantum_error(
    two_qubit_error,
    ["cx"]
)

# 第四步:在带有噪声的模拟器上运行实验
noisy_simulator = AerSimulator(
    noise_model=noise_model
)

noisy_result = noisy_simulator.run(
    qc,
    shots=4096
).result()

noisy_counts = noisy_result.get_counts()

print("\n带噪声的模拟器的结果")
print(noisy_counts)

在Windows系统中,运行步骤如下:

首先激活你的虚拟环境,执行source .venv/Scripts/activate,然后运行python bell_state_noise.py

你可能会看到类似的输出结果:

终端输出

虽然具体的数值可能会有所不同,但有一点是显而易见的:

与理想模拟器的结果相比,这次实验出现了两个意料之外的状态:

  • 01

  • 10

在完美的贝尔态中,这些结果是不存在的。

但由于我们在模拟过程中人为地引入了硬件缺陷,因此才会出现这样的结果。

我们没有修改量子算法的任何一行代码,但实验结果的可靠性明显降低了。

比较实验结果

让我们来对比一下迄今为止讨论过的这三种情况吧。

环境类型 典型结果
理想模拟器 仅出现0011两种结果
有噪声的模拟器 主要为0011,也会出现少量0110
真实硬件设备 行为类似,但会受到实际设备的物理特性的影响

有噪声的模拟器并不是试图完美地再现某个特定的IBM量子处理器的工作原理,它的作用是帮助你理解量子噪声是如何改变算法的行为的

这是一个非常重要的区别。你现在不再需要去验证自己的贝尔态电路是否正确了,因为你已经知道它是正确的。

现在你需要问的是另一个问题:

当硬件设备并不完美时,我的电路会有多强的抗干扰能力?

这正是量子开发者每天都在思考的问题。

增加噪声的影响

要想了解错误会以多快的速度累积起来,可以试着增加退极化概率的值。

例如,将代码修改为:

single_qubit_error = depolarizing_error(0.05, 1)
two_qubit_error = depolarizing_error(0.10, 2)

然后再次运行这个电路。

你可能会发现,错误结果出现的频率大大增加了。

贝尔态会逐渐失去其特有的相关性,测量结果分布也会偏离理想的50/50比例。

这个简单的实验揭示了量子计算中的一个重要原理:

硬件噪声的微小增加,都可能对实验结果的质量产生巨大的影响。

现在想象一下,如果一个电路包含数百个门而不是仅仅两个门会怎样。

每多一个操作步骤,就意味着会出现更多的出错机会。

等到计算完成时,累积起来的噪声很可能会淹没算法原本试图保留的有用量子信息。

正因为如此,减少噪声才成为了量子计算领域最重要的研究目标之一。

为什么不能直接消除噪声呢?

此时你可能会想:

如果噪声会带来这么多问题,为什么就不能直接把它消除掉呢?

几十年来,研究人员一直在努力实现这个目标。

但问题是,量子系统具有极高的敏感性。

在完全隔离量子比特的同时还能对其进行控制和测量,这是现代科学中最为棘手的工程难题之一。

因此,研究人员并没有等待完美的硬件设备出现,而是开发出了各种技术,使得量子计算机即使在存在噪声的情况下也能产生更可靠的结果。这些技术主要分为两大类:错误缓解错误抑制

尽管这两种方法都旨在提升量子计算的质量,但它们解决问题的方式本质上截然不同。

在了解这一区别之后,我们才能进一步探讨Orbit是如何将自动错误抑制功能融入现代Qiskit工作流程中的。

错误缓解与错误抑制:有什么区别?

当我们看到即使是少量的噪声也会影响简单贝尔态电路的计算结果时,自然会提出这样一个重要问题:

如果量子硬件存在如此严重的噪声干扰,研究人员究竟是如何运行出有用的量子算法的呢?

答案是:他们很少仅依赖硬件的原始测量结果。相反,他们会利用错误缓解错误抑制技术来提升量子计算的质量。

虽然这些术语有时会被互换使用,但实际上它们解决的是两种不同的问题。

理解这一区别至关重要,因为Orbit就属于其中一种方法类别——而非另一种。

让我们来分别了解一下这两种方法吧。

什么是错误缓解?

想象一下,你拍了一张略微模糊的照片。照片拍摄完成后,你会使用编辑软件来使图像更加清晰、调整颜色并消除模糊效果。

你并没有阻止相机生成模糊的图像,而是在了图像被拍摄之后对其进行了处理和优化。

错误缓解所做的也正是这样。

错误缓解并不会在量子电路运行过程中防止错误的产生,而是通过数学和统计方法来估算噪声对计算结果的影响程度,然后在执行完成后尝试弥补这些影响。

其目标并不是制造出一台完美的量子计算机,而是在不完美的硬件条件下,尽可能准确地获得正确的计算结果。

一个简化的工作流程如下:

编写量子电路
       ↓
在有噪声的硬件上运行
       ↓
收集计算结果
       ↓
估算硬件产生的错误
       ↓
修正最终输出结果

由于这种方法不需要依赖具备容错功能的量子硬件,因此它已经成为当今量子计算领域中不可或缺的一部分。

实际上,它完全可以与我们目前拥有的设备一起使用。

一些常见的错误缓解技术包括:

  • 测量误差缓解

  • 零噪声外推法(ZNE)

  • 概率性错误消除技术(PEC)

  • 克利福德数据回归算法(CDR)

你现在并不需要详细了解这些技术,关键在于要明白:错误缓解是在计算完成之后才对结果进行优化的。

什么是错误抑制?

错误抑制采用了一种完全不同的方法。

它并不在电路执行完成后才去纠正错误,而是试图从一开始就防止许多错误的发生

想象一下,你正在泥泞的小路上徒步。错误缓解就像是徒步结束后清洗靴子;而错误抑制则相当于在开始行走之前就穿上防水靴。

这两种方法都能改善最终的结果。一种是在问题出现之后采取行动;另一种则是在整个过程中持续减少问题的发生。

简化后的工作流程如下:

设计电路
      ↓
在执行过程中降低噪声
      ↓
执行电路
      ↓
测量结果

错误抑制并不在事后估算并纠正错误,而是在计算进行的过程中保护脆弱的量子信息。

这通常涉及一些技术,这些技术能够减少环境噪声的影响、提高门操作的效率,或者在量子比特处于空闲状态时保护它们。

其中最著名的例子就是动态解耦技术,你很快就会了解到这一技术。

比较这两种方法

尽管这两种方法都能提升量子计算的效率,但它们在工作流程的不同阶段发挥作用。

错误缓解 错误抑制
在电路执行完成后应用 在电路执行过程中应用
估算并弥补错误 试图在错误积累之前将其消除
侧重于改善测量结果 侧重于保护量子状态本身
通常需要依赖传统的后处理步骤 通常会对量子电路进行修改或补充设计

没有任何一种方法能够完全消除量子噪声。

实际上,这两种方法是相互补充的。

将这两种技术结合起来使用,往往能获得更好的结果。

为什么错误抑制变得越来越重要

随着量子算法规模的扩大,噪声积累的机会也会相应增加。

想象一个只包含两个门的电路,即使出现微小的错误,也可能不会产生明显的影响。

但现在假设这个电路包含了成百上千个门,那么那些微小的错误就会不断累积,最终导致计算结果变得不可靠。

对于那些要求量子比特在较长时间内保持相干性,或者需要等待其他操作完成的算法来说,这种情况尤为棘手。

在这种情况下,在执行过程中降低噪声就显得尤为重要了。

研究人员不会试图在事后恢复丢失的信息,而是会想办法在这些信息消失之前将其保存下来。

正是在这一点上,误差抑制技术引起了人们的高度关注。

介绍动态解耦技术

这是目前被研究最为广泛的误差抑制技术之一。这个名字听起来可能有些令人生畏,但其背后的原理其实相当直观。

想象一下,试着用手将一根扫帚柄竖立起来保持平衡。如果你完全不动手,扫帚柄很快就会倒下;但如果你进行一些细微且时机恰当的调整,就能让它更长时间地保持平衡。

你并没有改变扫帚柄本身,而是通过不断进行微小的修正,防止那些小干扰发展成更大的问题。

动态解耦技术的原理也是如此。

当一个量子比特暂时处于闲置状态时,会通过精心挑选的脉冲序列来减少环境噪声的影响,从而使其量子态能够更长时间地保持稳定。

这一理论已经经过了数十年的研究,如今已成为量子误差抑制领域的重要基础技术之一。

然而,实际应用这些技术并不总是一帆风顺的。

开发人员通常需要具备专门的知识,才能确定应该在电路中的哪些位置、何时插入这些脉冲序列。

对于许多软件开发者来说,这种硬件相关的技术知识显然超出了他们日常工作的范畴。

Orbit技术的适用场景

这就引出了Orbit技术诞生的背景。

我们并不期望每位开发者都能成为动态解耦或其他高级误差抑制技术的专家,因此Orbit的设计目的就是通过熟悉的Qiskit工作流程,让这些技术更容易被人们使用。

从概念上来说,原来的工作流程是这样的:

编写电路代码
     ↓
手动分析电路的闲置时段
     ↓
设计误差抑制策略
     ↓
修改电路代码
     ↓
在量子硬件上执行实验

而现在的流程则简化为:

编写电路代码
     ↓
让Orbit自动应用误差抑制机制
     ↓
在量子硬件上执行实验

需要注意的是,这些步骤并没有发生任何变化——你仍然需要设计量子算法、编写Qiskit电路代码,并在量子硬件上执行实验。

不同之处在于,误差抑制策略现在可以直接成为工作流程的一部分,而不再需要单独进行手动优化操作。

换句话说,Orbit并不是要取代Qiskit,而是旨在帮助开发者们利用他们已经掌握的技能,获得更可靠的结果。

自动化误差抑制技术如何融入现代量子工作流程

到目前为止,我们已经了解了两个重要的概念。

首先,如今的量子计算机本质上存在噪声问题。随着电路规模不断扩大、结构越来越复杂,各种硬件缺陷也会逐渐累积,从而降低最终实验结果的质量。

其次,开发者有两种主要方法来应对这种噪声:错误缓解,即在程序执行后改善结果;以及错误抑制,即在电路运行过程中尝试减少错误。

现在一个显而易见的问题是:

开发者在实际中是如何应用错误抑制技术的呢?

从历史上看,这个问题的答案并不简单。

许多错误抑制技术都需要对量子硬件有深入的了解。开发者通常需要分析自己的电路,找出哪些量子比特处于闲置状态,尝试不同的优化策略,并反复运行电路以确定哪种方法能产生最佳效果。

这个过程既耗时又需要高度的专业知识。

更糟糕的是,某种对某一种电路有效的优化方法,可能对另一种电路毫无帮助。

正如Quantum Elements在其最近的技术博客中指出的那样,由于没有适用于所有情况的解决方案,开发者往往不得不反复进行测试、调整和重新实验。

从手动优化转向自动化工作流程

现代软件开发一直在朝着自动化的方向发展。

我们使用格式化工具来调整代码缩进,而不是手动进行操作;我们使用代码检查工具来检测风格问题,而不是自己去查找这些问题;我们使用CI/CD管道来部署应用程序,而不是手工完成这些工作。

量子软件开发也在遵循同样的趋势。

新的工具并不要求每位开发者都成为精通硬件优化技术的专家,而是旨在自动化部分开发流程,同时让开发者能够继续使用标准的Qiskit代码来编写电路。

一个例子就是Orbit,Quantum Elements最近为IBM Quantum Network的成员提供了这个工具,并将其作为Qiskit函数进行发布。

从概念上来说,原来的开发流程是这样的:

编写量子电路
        ↓
      研究硬件特性
        ↓
      尝试使用错误抑制技术
        ↓
      修改电路
        ↓
      执行

而现在的流程则更为简单:

编写量子电路
        ↓
      应用自动化的错误抑制功能
        ↓
      执行

需要注意的是,你的算法本身并没有发生变化

你仍然需要设计电路并编写Qiskit代码,只不过这些高级优化技术现在可以更轻松地融入到现有的开发流程中而已。

Orbit公开声称的功能

Quantum Elements提供了Orbit的工作原理概述,但并未透露其具体的实现细节。

Orbit通过Qiskit Functions接口接收用户提供的Qiskit电路,然后运用多种优化技术来准备这些电路的执行过程。这些技术可能包括……

  • 在转译过程中进行电路级优化;

  • 减轻测量误差;

  • 在量子比特会积累额外噪声的空闲时段,插入先进的动态解耦机制。

需要注意的是,这些技术都不要求开发者从头开始重新设计他们的算法。

相反,这些技术的重点在于改进现有电路在当前量子硬件上的运行效率。

这些优化措施的具体实现细节属于Orbit软件的内部逻辑,但从开发者的角度来看,使用流程仍然是熟悉的:

  1. 构建你的量子电路。

  2. 通过支持的工作流程提交该电路。

  3. 在兼容的IBM Quantum硬件上执行优化后的电路。

一个真实的硬件案例

到目前为止,你们已经了解了噪声是如何影响简单的贝尔态电路的。但当电路规模变大、量子比特需要等待其他操作完成的时间变长时,真正的挑战才会出现。

Quantum Elements在最近为Orbit进行的一项公开测试中,正是采用了这种场景来进行实验。

在这次实验中,该电路是在IBM的ibm_aachen量子处理器上运行的。实验的目的并不是展示一种完全不同的量子算法,而是想验证当电路包含更多操作、更长的等待时间以及更多的噪声积累机会时,会发生什么。

随着电路规模的扩大,有些量子比特会处于空闲状态,而其他量子比特则正在被测量或处理。正如我们在本文前面提到的,处于空闲状态的量子比特并不会停止与周围环境的相互作用,而这种相互作用会逐渐破坏我们试图保护的量子信息。

根据Quantum Elements发布的测试结果,Orbit软件会在这些空闲时段应用错误抑制技术,并将其与其他电路级优化措施结合使用。

该公司对比了同一工作负载的三个不同实现版本:

  • 标准实现版本;

  • 未采用任何额外保护措施的动态实现版本;

  • 启用了Orbit技术的动态实现版本。

测试结果显示,采用保护机制的版本在ibm_aachen处理器上的多次运行中都表现出了更强的性能。

Quantum Elements还指出,在这次实验中,有效量子比特的使用寿命得到了延长,这使得更大规模的电路也能保持更长的可用时间。

重要的是要明白,并不是所有的量子电路都会出现同样程度的性能提升。

更为重要的启示是:正如你们在整个教程中学到的那样,当量子电路的规模变大、量子比特处于空闲状态的时间变长时,减少噪声的积累就变得与设计算法本身一样重要了。

<这就是为什么自动错误抑制机制正逐渐成为现代量子软件工作流程中一个越来越重要的组成部分。与手动分析每一个空闲时段并自行调整各种优化设置相比,像Orbit这样的工具旨在让那些能够充分利用硬件特性的优化措施更容易应用于你已经在Qiskit中编写的电路中。

你应该使用Orbit吗?

如果你才刚刚开始接触量子计算领域,那么现在可能还不适合使用Orbit。

你现在应该把时间花在了解量子电路的工作原理、熟悉Qiskit工具,以及理解叠加态、纠缠、量子噪声和电路深度等概念上。

然而,一旦你开始在IBM的量子硬件上运行更复杂的量子电路,你就会发现:噪声实际上已经成为一种限制因素,而不仅仅是一个理论概念。

而这正是自动化错误抑制工具所旨在帮助解决的问题。

在撰写本文时,Quantum Elements为符合条件的开发者提供了三个月的免费使用Orbit的权限,具体申请流程可以访问Quantum Elements官网了解。如果你已经在使用IBM的量子硬件进行实验,并想了解自动化错误抑制功能如何帮助优化你的工作流程,你可以直接向他们申请。

无论你最终是否选择使用Orbit或其他解决方案,一个重要的道理始终不变:

编写正确的量子算法仅仅是整个挑战的一部分。真正关键的是要了解该算法在真实量子硬件上的运行表现,并学会如何减少噪声对计算结果的影响——这些能力正逐渐成为每一位量子开发者的必备技能。

相关文章

技术实践

演讲主题:利用对手模拟技术来实现生成式人工智能的协同发展

Kennedy Torkura介绍了在AWS环境中使用GenAI技术来保护大语言模型和知识库,使其免受数据污染、LLMjacking等安全威胁的方法。他阐述了工程领导者与架构师如何将传统的云安全措施与MITRE ATLAS框架相结合,从而主动发现漏洞、建立防护机制,并确保生产环境中的AI应用能够获得有效保护。 作者:Kennedy Torkura

阅读全文
技术实践

为什么二维结构中的囚禁离子量子计算机比一维结构的量子计算机更容易实现大规模扩展?

我仍然记得第一次在量子模拟器上运行贝尔态电路的情景。 那段代码只有几行,但它的效果实在令人惊叹——两个量子比特发生了纠缠,模拟器也给出了几乎完美的结果。后来,我把同样的电路应用到了真正的硬件设备上。 然而那种神奇的效果有所减弱。 输出结果仍然可以识别,但原本理想的50/50分布现在出现了误差,额外的错误也让电路的行为不再像我在本地测试时看到的理想状态那样。 那一刻让我明白了一个重要的道理:量子计算的未来不仅仅取决于更优秀的算法,还离不开更好的架构设计。 多年来,许多囚禁离子量子计算机都是基于 一维线性离子链 构建的。这类系统在门操作精度方面取得了行业内的领先水平,因此非常适合用于早期的量子计算

阅读全文
技术实践

介绍:《实现理念循环的实用指南》

霍莉·卡明斯探讨了为何在科技领域“没有什么是全新的”。她将历史上那些与技术架构相关的权衡关系,与现代的云计算、微服务以及人工智能领域的热潮联系起来进行分析。她还把财务债务(零利率政策实施后的现象)、技术债务与认知负担及睡眠不足等问题联系起来,帮助工程领域的领导者们理解如何应对各种假设的变化,如何践行可持续发展的理念,以及如何重新运用那些已被证明有效的工程技术方法。 作者:霍莉·卡明斯

阅读全文
技术实践

利用LangGraph构建智能代理:开发AI代理并自动化工作流程

我们正在迅速超越那些基于单一提示的大型语言模型,步入自主智能体的时代。 为了帮助您掌握这一全新的技术范式,我们在freeCodeCamp.org的YouTube频道上发布了一门内容丰富、系统全面的课程,该课程将全面讲解有关自主智能体的所有知识。 这门课程旨在从基础概念入手,引导您逐步学习如何使用LangChain和LangGraph构建可用于实际生产环境的端到端智能体工作流程。 以下是您可以从这门课程中获得的几项关键收获: 标准大型语言模型与自主智能体在架构上的区别。 如何利用LangChain构建单智能体系统及多智能体系统。 LangGraph的核心组成部分,以及它为何对于那些需要处理状态变

阅读全文