Yao.jl -- 可微分量子编程

英文原文在Julia官网,祝大家新年快乐!

本文作者:罗秀哲,刘金国

Yao是我们为了解决实际量子算法研究中的问题而开发的一个开源Julia软件包(欢迎阅读我们最新的论文)。它的名字取自幺正矩阵中文的第一个字。

Yao的LOGO

;

为什么我们要写这样一个东西?因为我们和Julia一样贪婪。我们想要这样一个框架,它需要是

可微分的

正如其它Julia相关的博客(以及论文,例如Zygote这篇)已经讲过的:梯度有时候是比人类更厉害的程序员!在量子计算中,梯度可以被用在变分算法(variational algorithms),量子控制(quantum control),门的分解和学习(gate learning)等问题中。所以我们也希望能够在量子线路上进行可微分编程!

然而,对量子线路进行微分和普通的程序是不太一样的:在反向模式(reverse mode)的自动微分中,在模拟量子线路中,由于需要缓存临时变量用于计算导数,内存的消耗将是非常可观的。而在前向模式(forward mode)里,我们则需要量子线路相关的语义来保证我们的梯度是一个可以被真正执行的量子线路,以使得它最终能够被硬件真正实现。

在“幺“里,我们实现了一套针对量子线路的自动微分来充分利用量子线路天然的可逆性。下面是一个用“幺“实现变分本征值求解器(variational quantum eigensolver)的代码,同构使用我们高性能的自动微分引擎你可以直接在自己的笔记本上运行这个例子

using Yao, YaoExtensions # 量子比特数量和线路深度
n, d = 16, 100
circuit = dispatch!(variational_circuit(n, d),:random)

h = heisenberg(n)

for i in 1:100
    _, grad = expect'(h, zero_state(n) => circuit)
    dispatch!(-, circuit, 1e-1 * grad)
    println("Step $i, energy = $(real.(expect(h, zero_state(n)=>circuit)))")
end

这个例子训练了一个100层的参数化线路(共4816个参数)来寻找一个16个格点的海森堡模型的基态。我们的自动微分实现可以和Zygote进行对接,例如在我们这个学习门的例子里。我们使用可微分编程来寻找给定幺正矩阵的分解。你还可以在我们的教程以及Quantum Algorithm Zoo找到更多这样的例子。

可扩展的

在这个世界上,每分每秒都有新的想法出现。甚至连量子软件这个领域本身也在快速发展着,我们希望这个框架足够灵活,以至于研究人员和开发者们可以不断地为任何一种(量子算法的)研究进行扩展。

于是,首先我们定义了一种硬件无关的中间表示(量子方块 ,Quantum Block Intemediate Representation, QBIR)来定义和操作量子线路以及一套(量子)寄存器的接口。这样一个设计使得我们能够通过重载相关的接口不断为“幺“增加特化的算法,新的硬件支持等等。例如,我们用仅仅几百行通过 CUDAnative 使用纯Julia编写的代码扩展了我们的GPU硬件支持,并且达到了当前最高水平的性能。而在增加了一个语法糖以及补丁之后,我们很轻松就通过 SymEngine 增加了符号计算的功能,从而使得符号微分等特性成为可能。

而接下来,和很多其它的Julia项目一样。我们让“幺”在整体结构上变得可扩展:Yao这个包本身只是一个meta-package,它依赖于多个负责实际实现的包。开发者可以很容易地去定制他们自己的包,从而快速迭代出他们自己想要的功能。

高性能的

模拟的性能在需要进行数值实验的研究中是很重要的,例如变分量子线路。在拥有上述其它特性的前提下,我们还希望这个框架达到领先的性能。

通过使用Julia的GPU编程以及利用多重派发进行的特化,“幺”在近期研究中常用的线路尺寸中有着目前领先的性能

你可以在这里查看到更加详细的benchmark

还有啥?

到目前为止,我们很开心宣布它的诞生 ,但旅程才刚刚开始。

我们还想要线路编译到硬件(例如到更基础的量子汇编指令,QASM)线路优化和编译 ,线路可视化,张量网络的支持(我们还有一个playground!)以及更多更多的新功能。

尽管,在早期有一些测试用户在他们的实际研究中已经使用了Yao ,我们仍然需要更多的用例来完善它的设计,以及更多的人参与到它的开发中去。如果你对此感兴趣,欢迎为这个开源项目出一份力 ,让我们一起为量子计算的研究构建越来越强大的工具!

5 个赞

第一个链接好像挂了?

https://julialang.org/blog/2019/12/yao-differentiable-quantum-programming估计是手误:joy:

1 个赞

如此观之,似乎楼主代码也错了?我注意到你给出的网页中的代码和楼主给的不同,并且楼主的代码在我1.3版本的Julia不能正常运行,你的到可以。

已修复


代码里的 > 被莫名其妙的 html 转义了,改一下就好了。