转载于:GiantPandaCV
作者:于璠
MindSpore在3.28日正式开源了量子机器学习库MindQuantum,本文介绍MindQuantum的关键技术。介绍MindQuantum前,先简单阐述下量子计算的相关概念。
量子计算基本概念
量子计算是当今世界最具颠覆性的技术之一,各个国家和公司都在加大该领域的研发投入。量子计算机的概念最早是由著名物理学家费曼于1981年提出,按照他的想法,利用量子力学原理运行的量子计算机,相比于经典计算机能够更快的对复杂量子系统进行模拟。由于量子系统的纠缠性、叠加性和并行性,人们可以以多项式级乃至指数级的加速来实现一些算法,如用于大数分解的Shor算法、用于量子搜索的Grover算法等。为了让大家快速步入量子计算大门,我们首先需要了解一些基本的概念,包括用于信息存储的量子比特和对量子比特进行逻辑操作的量子门。
量子比特
在经典计算机里,人们通常用电位的高低来表示二进制的0和1,然后利用三极管等半导体器件对电流进行操控,以完成通用逻辑运算。然而,在同一时间内,同一个比特只能处于低电位和高电位中的一种情况。在神奇的量子世界里,一些实体可以同时处于两种不同的状态。例如电子,它的自旋可以同时处于向上的状态和向下的状态,如果我们把这种向上和向下的状态分别记为0和1,那么以电子自旋为代表的量子比特则可以同时处于0和1的叠加态。按照狄拉克符号的规则,我们把这种0和1的状态分别记为 ,称为右矢表示。对于单个量子比特,其状态是处于 和 的叠加态,也即:
这里, 和 必须满足 ,也即态的归一化条件。有一定线性代数基础的同学看到这里可能就会想到,单量子比特的态就是以 和 为基矢所张成的二维空间中的矢量。我们把此空间称为希尔伯特空间。而多比特量子态所处的空间则由多个这种单比特空间直积而成。为了便于大家理解,我们可以将 和 用二维空间中最简单的两个正交基矢表示:
这样任意的单量子比特态可以表示为:
那么多量子比特又该如何表示呢?以两比特为例,两比特量子态所处的空间由两个二维希尔伯特空间直积而成,四个基矢分别为 、 、和 ,其中:
其他以此类推。因此,我们可以发现,对于 个比特的系统,其量子态能够同时处于 个计算基矢的叠加态上,这是经典比特无法企及的。
量子逻辑门
有了基本量子信息载体的量子比特后,我们就需要对这些量子比特进行相应的操控。在经典计算机里,我们有一些半导体器件来对电信号进行处理,从而形成经典逻辑门,例如与非门、异或门等。而在量子计算机里,我们将这种对量子比特进行操控的逻辑门成为量子逻辑门,例如在超导量子计算机中,我们可以将一些微波脉冲作用在超导量子比特上,对其进行相应的控制,例如比特翻转等。这种操控所形成的逻辑我们也可以用线性代数语言来描述,例如最常用的几个逻辑门 、 和 三个泡利门和哈达玛门 可以分别用矩阵表示为:
这些门都是作用在单比特上的量子门,其作用在量子态的运算规则满足矩阵乘法,例如:
我们可以发现, 就是比特翻转门,它将 态翻转为 态,将 态翻转为 态。除了这种单比特门,我们还有多比特门,例如控制翻转门CNOT,它的作用效果是只有当控制位为 时,才在作用位上作用翻转门 。
不难发现,上面的量子门的矩阵数值上都是固定的,还有一些门,他们是可变参数的,例如 、 和 旋转门。它们的矩阵表达式为:
这里,通过改变 \theta 的值,我们得到不同的旋转门。
量子线路
类比于经典线路,我们可以把一系列的量子逻辑门进行精心的设计组合,构成一个量子线路并完成一定的任务。如下图所示,该量子线路对三个量子比特进行调控,分别为 、 和 ,线路由三个量子门构成分别为作用在 上的哈达玛门、受 控制且作用在 上的 门和作用在上的含参数旋转门 。
我们可以对量子线路演化后的量子态进行测量,从量子态中提取信息,并进行后续操作。
下面,我们利用MindQuantum来对上面的线路进行演化,并得到最终的量子态。首先,按照[安装指导](MindSpore/mindquantum)完成MindQuantum的安装,运行如下代码,将得到末态量子态。
import numpy as np
from mindquantum import Circuit
from mindquantum.highlevel import StateEvolution
c = Circuit()
c.h(0)
c.x(1, 0)
c.ry('theta', 2)
state = StateEvolution(c).final_state({'theta': np.pi/2}, ket=True)
print(state)
输出如下
0.5¦000⟩
0.5¦011⟩
0.5¦100⟩
0.5¦111⟩
因此我们得到最终用的量子态为:
量子在机器学习中的应用
早在上个世纪,科学家就提出了用于机器学习的量子感知机概念。最近20年,越来越多的用于机器学习的量子算法被发掘出来,其中包括用于求解线性方程组的HHL算法,和基于此的量子主成分分析、量子支持向量机等。下图给出了各种量子机器学习算法对最好经典算法的加速效果。
然而,有意义地实用化这些算法需要成千上万,乃至百万量级的量子比特,在当前NISQ(Noisy Intermediate-Scale Quantum)阶段,真实量子计算机的比特数只能达到几十到几百的量级,且系统含有较多噪声。为了在NISQ阶段展现量子计算机的优势,人们发展出来了量子经典混合机器学习库,经典计算机与量子计算机相辅相成,共同完成一个复杂的任务,例如量子化学模拟和组合优化等。
量子机器学习库MindQuantum
MindQuantum是结合MindSpore和HiQ开发的量子机器学习库,支持多种量子神经网络的训练和推理。得益于华为HiQ团队的量子计算研发能力和MindSpore高性能自动微分能力,MindQuantum能够高效处理量子机器学习、量子化学模拟和量子优化等问题,性能达到业界TOP1,为广大的科研人员、老师和学生提供了快速设计和验证量子机器学习算法的高效平台。
下图是MindQuantum的架构图,当前我们利用量子模拟器算子来对量子体系进行模拟,它可以完成前向传播和梯度计算的功能,在此基础之上,我们有量子算法库,例如量子神经网络啊、量子化学模拟的VQE和量子优化算法的QAOA等,再往上就有了量子应用,我们可以利用MindQuantum的量子算法来进行机器学习、化学模拟和运筹优化等任务。
在MindQuantum中,量子神经网络的结构如下图所描述,其中的量子线路由三大块构成,编码线路会将经典数据编码到量子态上,然后是待训练线路,我们可以通过调节线路中逻辑门的参数来使得最后的测量结果符合预期。
通过MindQuantum中的MindQuantumLayer,我们可以很容易的搭建量子机器学习层,并且可以无缝的跟MindSpore中其他的算子构成一张更大的机器学习网络。下面,我们结合一个简单的例子来体验一下MindQuantum量子机器学习库。
MindQuantum量子神经网络初体验
对于如上的量子线路,encoder线路表征系统对初始量子态的误差影响, 和 为某个固定值,我们需要训练一个ansatz线路来抵消掉这个误差,使得最后的量子态还是处于 态。这时我们只需要对量子末态进行泡利 算符测量,由于 态是 算符的本征态,且本征值为1,因此我们只需让测量值最大即可。
1. 量子线路的搭建
import numpy as np
from mindquantum.ops import QubitOperator
from mindquantum import Circuit, Hamiltonian
encoder = Circuit().rx('alpha', 0).ry('beta', 0).no_grad()
ansatz = Circuit().rx('a', 0).ry('b', 0)
circ = encoder + ansatz
ham = Hamiltonian(QubitOperator('Z0'))
alpha, beta = 0.5, 1.2
encoder_data = np.array([[alpha, beta]]).astype(np.float32)
2. 搭建训练网络
from mindquantum.nn import MindQuantumLayer
import mindspore as ms
class Net(ms.nn.Cell):
def __init__(self, pqc):
super(Net, self).__init__()
self.pqc = pqc
def construct(self, x):
return -self.pqc(x)
pqc = MindQuantumLayer(['alpha', 'beta'], ['a', 'b'], circ, ham)
train_net = Net(pqc)
3. 训练
opti = ms.nn.Adam(train_net.trainable_params(), 0.2)
net = ms.nn.TrainOneStepCell(train_net, opti)
for i in range(100):
print(net(ms.Tensor(encoder_data)))
最后收敛结果为-0.993。同时我们也可以求得最后量子态与目标态的保真度。
from mindquantum.highlevel import StateEvolution
a, b = pqc.weight.asnumpy()
pr = {'alpha': alpha, 'beta': beta, 'a': a, 'b': b}
state = StateEvolution(circ).final_state(pr)
fid = np.abs(np.vdot(state, [1, 0]))**2
通过上面的训练,我们利用量子神经网络抵消了系统的误差,使得最后的量子态的保真度达到99.9999%。
更多样例
除了上面简单的例子外,我们还给出了利用MindQuantum来进行自然语言处理、量子化学模拟、组合优化求解和手写体识别等案例,具体请参考下面链接
https://link.zhihu.com/?targe...
推荐阅读
更多嵌入式AI技术干货请关注嵌入式AI专栏。