QuTrunk 与 MindSpore 量子神经网络初探
QuTrunk 与 MindSpore 量子神经网络初探
1、概述
QuTrunk 是启科量子开发和已经开源的一款量子编程框架软件产品,关于 QuTrunk 的详细介绍,用户可以访问启科的开发者社区站点详细了解,也可以进入 github 上此项目下进行查询。
QuTrunk 开发框架是可以与第三方 AI 框架深度结合进行量子计算程序开发的,前面一篇中我们已经使用 QuTrunk+paddle 在 VQA 算法实现上做了一个小的尝试。本篇中我们将使用华为的 MindSpore(昇思)与 QuTrunk 的结合实践来展示 QuTrunk 的量子计算程序开发的方法和流程。本示例类似于 VQA 算法的实现,我们将采用一个更简单单量子比特的量子神经网络训练程序来说明。
2、量子神经网络
2.1 简介
量子神经网络是基于量子力学原理的计算神经网络模型。1995 年,Subhash Kak 和 Ron Chrisley 独立发表了关于量子神经计算的第一个想法,他们致力于量子思维理论,认为量子效应在认知功能中起作用。然而,量子神经网络的典型研究涉及将经典的人工神经网络模型(在机器学习中广泛用于模式识别的重要任务)与量子信息的优势相结合,以发展更高效的算法。这些研究的一个重要动机是经典神经网络难以训练,特别是在大数据应用中更是如此。希望可以利用量子计算的特性,如量子并行性或干涉和纠缠效应作为资源。由于量子计算机的技术实现还处于早期阶段,此类量子神经网络模型大多是理论建议,有待在物理实验中充分实现。大多数量子神经网络是作为前馈网络开发的。与它们的经典结构类似,这种结构从一层量子位中获取输入,并将输入传递到另一层量子位。这一层量子位评估这些信息,并将输出传递给下一层。最终,这条路径通向量子比特的最后一层层不必具有相同的宽度,这意味着它们不必具有与层之前或之后相同数量的量子比特。量子神经网络研究仍处于起步阶段,已经提出了一系列不同范围和数学严谨性的建议和想法。其中大多数都是基于用量子位(可以称为“量子位”)取代经典的二进制或 McCulloch-Pitts 神经元的想法,从而产生可以处于“激发”和“休息”状态叠加的神经单元。
在较广泛的领域内,研究人员试图将神经网络推广到量子环境中。构建量子神经元的一种方法是首先将经典神经元泛化,然后再将其进一步泛化,以形成幺正门。神经元之间的相互作用可以通过单一门进行量子控制,也可以通过网络状态的测量进行经典控制。通过采用不同类型的网络和量子神经元的不同实现,大多数学习算法遵循训练人工神经网络的经典模型,以学习给定训练集的输入输出函数,并使用经典反馈环路来更新量子系统的参数,直到它们收敛到最优配置。量子神经网络可以应用于算法设计:给定具有可调谐相互作用的量子位,可以尝试从期望的输入输出关系的训练集中学习遵循经典反向传播规则的相互作用,这被认为是期望的输出算法的行为。
量子神经网络在理论上可以类似于训练经典/人工神经网络。关键区别在于神经网络各层之间的通信。对于经典神经网络,在给定操作结束时,当前感知器将其输出复制到网络中的下一层感知器。然而,在量子神经网络中,每个感知器都是一个量子位,这将违反无克隆定理。对此提出的广义解决方案是用一个任意幺正来代替经典扇出方法,该幺正将一个量子位的输出扩展到下一层量子位中,但不会复制。使用这种扇出酉()和处于已知状态的伪态量子位,来自量子位的信息可以传输到下一层量子位。该过程符合可逆性的量子操作要求。
使用这种量子前馈网络,可以有效地执行和训练深度神经网络。深度神经网络本质上是一个具有许多隐藏层的网络,如上面的示例模型神经网络所示。由于正在讨论的量子神经网络使用扇出酉算子,并且每个算子只作用于其各自的输入,所以在任何给定时间都只使用两层。换句话说,在任何给定的时间,没有酉算子作用于整个网络,这意味着给定步骤所需的量子位数量取决于给定层中的输入数量。由于量子计算机以其在短时间内运行多次迭代的能力而臭名昭著,量子神经网络的效率仅取决于任何给定层中的量子比特数,而不取决于网络的深度。
2.2 量子神经网络基本结构
量子神经网络中,其量子线路结构通常由三个部分组成。
Encoder 线路即编码线路,用于将经典数据编码到量子数据
Ansatz 即训练线路,用于训练带参量子门的参数
Measurement 及测量,用于检测测量值(例如在
Z
方向上测量,就是某个量子比特的量子态在Z
轴上的投影,该测量得到的是量子态关于泡利Z
算符(不限定于泡利Z
算符,换成其它的算符亦可)的期望值)是否接近于目标期望值。
量子神经网络的基本结构如下图所示,左右两边均为经典网络,中间方框内为量子网络。
3、QuTrunk+MindSpore 量子神经网络示例
为便于理解和上手,本文参考 MindQuantum 教程的这个简单例子示例来展示如何使用 QuTrunk+Minspore 构建量子神经网络。
我们搭建如上图所示的量子神经网络,其 3 个部分的组成如上图所示,Encoder 由和组成,Ansatz 由和组成,Measment 为PauliZ
算符。
问题描述:我们将 Encoder 看成是系统对初始量子态的误差影响(参数α0,α1 和α2 是将原经典数据经过预处理后得到的某个固定值,即为已知值,本示例中我们之间设置为 0.2, 0.3 和 0.4)。我们需要训练一个 Ansatz 来抵消掉这个误差,使得最后的量子态还是处于态。
解决思路:对末态执行泡利PauliZ
算符测量,此时的测量值就是此时的量子态关于泡利Z
算符的期望值。由于是算符Z
的本征态,且本征值为 1,容易知道.也就是说,目标期望值为 1。可以通过测量得到的期望值来验证此时的状态是否为。
解决方案:通过训练 Ansatz 中的参数,希望测量值接近于目标期望值,换句话说,我们只需让测量值尽可能接近于态关于泡利PauliZ
算符对应的期望值,那么此时的状态就是,即 Ansatz 抵消了 Encoder 对初始量子态产生的误差。
下面我们将展示采用 QuTrunk 量子编程框架结合 mMindSpore 如何一步步完成量子神经网络的应用。
3.1 导入需要的模块
程序使用到了 numpy,matplotlib,mindspore 和 qutrunk 等,首先导入这些使用到的模块
设置生成随机数的种子
3.2 搭建 Encoder
构建编码线路 Encoder,将经典数据编码到量子数据,这里我们定义了一个 encoder 的函数如下:
构建的线路如下:
该量子线路由 4 个量子门组成,其中有 3 个含参量子门且参数为α0,α1,α2(3 个参数值通过 encoder_data 这个形参传入),该量子线路调控的量子比特数为 1。
3.3 定义 Ansatz
Ansatz 训练线路的函数定义如下:
其线路图为:
函数定义了一个量子比特线路,对这个比特实施参数化的和操作,其角度分别是和.这两个角度值通过训练优化得到。
3.4 定义用于测量/投影的哈密顿量
这里哈密顿量构建主要用于线路末态的测量,函数定义如下:
对 0 位的量子比特执行 PauliZ 算符并返回。
3.5 连接线路并绑定参数值
前面定义了 Encoder 和 Ansatz 的线路,整个量子神经网络线路即为 Encoder+Ansatz,如下即为定义整个线路构建的函数,并绑定了当前的参数值:
3.6 定义梯度计算函数
本示例同样使用参数化移位法则(parameter-shift rule)来计算梯度,参数偏移量指定为π/2,程序实现如下:
3.7 自定义训练网络的类
针对训练网络定义了一个类CustomTrainOneStepCell
,这个类包含 2 个函数,其中_init_
用于定义优化器及其参数,construct
用于计算损失函数,具体实现如下:
3.8 执行训练
首先设置训练网络参数的初始化值,迭代次数 ITR 设置为 200,学习速率 LR 设置为 0.02。
然后设置构建 Encoder 量子线路的参数在值:, 其初始化值分别设置为 0.2,0.3 和 0.4
最后定义测量的算符
op
为hamiltonian
函数, 并指定优化器使用 MindSpore 的 Aadm 优化器
然后通过自定义训练函数进行参数化训练,并将损失函数保存到列表中.
通过迭代训练,打印输出的结果如下,可以看到通过 230 迭代后,loss 不断变小收敛,并达到目标值-1。
3.9 结果呈现
由于测量值接近收敛于-1,所以我们可以打印此时 Ansatz 中的参数。
得到的的值为 2.19643544。的值为-1.07710791
同时也可以获取到此时最优参数下的量子线路的状态向量和 fidelity 值及打印最终线路图,程序实现如下:
得到的结果如下:
打印的线路图为:
为了更形象的展示损失函数的下降趋势,我们也可以通过 matplot 打印出其损失函数的曲线,程序如下:
打印的曲线图如下:
4、总结
以上的示例只是 QuTrunk 与 MindSpore 结合的一次小的尝试,通过这次 QuTrunk 的量子编程框架和 MindSpore AI 深度学习框架的结合实践的探索,也为后续的深层次合作提供了较好的参考,QuTrunk 将继续深入探索与 MindSpore 的结合最佳实践。
版权声明: 本文为 InfoQ 作者【启科量子开发者官方号】的原创文章。
原文链接:【http://xie.infoq.cn/article/7b22b2d5c84ef02c2b3598fab】。文章转载请联系作者。
评论