QuTrunk与MindSpore量子神经网络初探
1、概述
QuTrunk是启科量子开发和已经开源的一款量子编程框架软件产品,关于QuTrunk的详细介绍,用户可以访问启科的开发者社区站点详细了解,也可以进入github上此项目下进行查询。
QuTrunk开发框架是可以与第三方AI框架深度结合进行量子计算程序开发的,前面一篇中我们已经使用QuTrunkPaddle在VQA算法实现上做了一个小的尝试。本篇中我们将使用华为的MindSpore(昇思)与QuTrunk的结合实践来展示QuTrunk的量子计算程序开发的方法和流程。本示例类似于VQA算法的实现,我们将采用一个更简单单量子比特的量子神经网络训练程序来说明。2、量子神经网络2。1简介
量子神经网络是基于量子力学原理的计算神经网络模型。1995年,SubhashKak和RonChrisley独立发表了关于量子神经计算的第一个想法,他们致力于量子思维理论,认为量子效应在认知功能中起作用。然而,量子神经网络的典型研究涉及将经典的人工神经网络模型(在机器学习中广泛用于模式识别的重要任务)与量子信息的优势相结合,以发展更高效的算法。这些研究的一个重要动机是经典神经网络难以训练,特别是在大数据应用中更是如此。希望可以利用量子计算的特性,如量子并行性或干涉和纠缠效应作为资源。由于量子计算机的技术实现还处于早期阶段,此类量子神经网络模型大多是理论建议,有待在物理实验中充分实现。
大多数量子神经网络是作为前馈网络开发的。与它们的经典结构类似,这种结构从一层量子位中获取输入,并将输入传递到另一层量子位。这一层量子位评估这些信息,并将输出传递给下一层。最终,这条路径通向量子比特的最后一层层不必具有相同的宽度,这意味着它们不必具有与层之前或之后相同数量的量子比特。量子神经网络研究仍处于起步阶段,已经提出了一系列不同范围和数学严谨性的建议和想法。其中大多数都是基于用量子位(可以称为量子位)取代经典的二进制或McCullochPitts神经元的想法,从而产生可以处于激发和休息状态叠加的神经单元。
在较广泛的领域内,研究人员试图将神经网络推广到量子环境中。构建量子神经元的一种方法是首先将经典神经元泛化,然后再将其进一步泛化,以形成幺正门。神经元之间的相互作用可以通过单一门进行量子控制,也可以通过网络状态的测量进行经典控制。通过采用不同类型的网络和量子神经元的不同实现,大多数学习算法遵循训练人工神经网络的经典模型,以学习给定训练集的输入输出函数,并使用经典反馈环路来更新量子系统的参数,直到它们收敛到最优配置。量子神经网络可以应用于算法设计:给定具有可调谐相互作用的量子位,可以尝试从期望的输入输出关系的训练集中学习遵循经典反向传播规则的相互作用,这被认为是期望的输出算法的行为。
量子神经网络在理论上可以类似于训练经典人工神经网络。关键区别在于神经网络各层之间的通信。对于经典神经网络,在给定操作结束时,当前感知器将其输出复制到网络中的下一层感知器。然而,在量子神经网络中,每个感知器都是一个量子位,这将违反无克隆定理。对此提出的广义解决方案是用一个任意幺正来代替经典扇出方法,该幺正将一个量子位的输出扩展到下一层量子位中,但不会复制。使用这种扇出酉()和处于已知状态的伪态量子位,来自量子位的信息可以传输到下一层量子位。该过程符合可逆性的量子操作要求。
使用这种量子前馈网络,可以有效地执行和训练深度神经网络。深度神经网络本质上是一个具有许多隐藏层的网络,如上面的示例模型神经网络所示。由于正在讨论的量子神经网络使用扇出酉算子,并且每个算子只作用于其各自的输入,所以在任何给定时间都只使用两层。换句话说,在任何给定的时间,没有酉算子作用于整个网络,这意味着给定步骤所需的量子位数量取决于给定层中的输入数量。由于量子计算机以其在短时间内运行多次迭代的能力而臭名昭著,量子神经网络的效率仅取决于任何给定层中的量子比特数,而不取决于网络的深度。2。2量子神经网络基本结构
量子神经网络中,其量子线路结构通常由三个部分组成。Encoder线路即编码线路,用于将经典数据编码到量子数据Ansatz即训练线路,用于训练带参量子门的参数Measurement及测量,用于检测测量值(例如在Z方向上测量,就是某个量子比特的量子态在Z轴上的投影,该测量得到的是量子态关于泡利Z算符(不限定于泡利Z算符,换成其它的算符亦可)的期望值)是否接近于目标期望值。
量子神经网络的基本结构如下图所示,左右两边均为经典网络,中间方框内为量子网络。
3、QuTrunkMindSpore量子神经网络示例
为便于理解和上手,本文参考MindQuantum教程的这个简单例子示例来展示如何使用QuTrunkMinspore构建量子神经网络。
我们搭建如上图所示的量子神经网络,其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等,首先导入这些使用到的模块importmindsporeasmsimportnumpyasnpfrommatplotlibimportpyplotaspltfrommindsporeimportnn,Tensor,Parameter,opsfrommindspore。nnimportAdamfromqutrunk。circuitimportQCircuitfromqutrunk。circuit。gatesimportPauliZ,Rx,Ry,H,Rz
设置生成随机数的种子ms。setseed(12)设置生成随机数的种子ms。setcontext(modems。PYNATIVEMODE,devicetargetCPU)3。2搭建Encoder
构建编码线路Encoder,将经典数据编码到量子数据,这里我们定义了一个encoder的函数如下:defcircuitencoder(encoderdata):alpha0,alpha1,alpha2〔float(f)forfinencoderdata〕定义角度参数circuitQCircuit()初始化量子线路qregcircuit。allocate(1)分配量子比特,申请一个量子寄存器Hqreg〔0〕对0位量子比特执行H操作Rx(alpha0)qreg〔0〕Rx(alpha0)门作用在第0位量子比特Ry(alpha1)qreg〔0〕Ry(alpha1)门作用在第0位量子比特Rz(alpha2)qreg〔0〕Rz(alpha2)门作用在第0位量子比特returncircuit返回线路
构建的线路如下:
该量子线路由4个量子门组成,其中有3个含参量子门且参数为0,1,2(3个参数值通过encoderdata这个形参传入),该量子线路调控的量子比特数为1。3。3定义Ansatz
Ansatz训练线路的函数定义如下:defcircuitansatz():circuitQCircuit()qcircuit。allocate(1)angles〔theta0,theta1〕paramscircuit。createparameters(angles)Rx(params〔0〕)q〔0〕Ry(params〔1〕)q〔0〕returncircuit
其线路图为:
函数定义了一个量子比特线路,对这个比特实施参数化的和操作,其角度分别是和。这两个角度值通过训练优化得到。3。4定义用于测量投影的哈密顿量
这里哈密顿量构建主要用于线路末态的测量,函数定义如下:defhamiltonian():circuitQCircuit()qregcircuit。allocate(1)returnPauliZ(qreg〔0〕)
对0位的量子比特执行PauliZ算符并返回。3。5连接线路并绑定参数值
前面定义了Encoder和Ansatz的线路,整个量子神经网络线路即为EncoderAnsatz,如下即为定义整个线路构建的函数,并绑定了当前的参数值:defjoincircuit(encoder,ansatz,inputs):params{thetastr(i):inputs〔i〕foriinrange(len(inputs))}ansatz。bindparameters(params)encoder。appendcircuit(ansatz)returnencoder3。6定义梯度计算函数
本示例同样使用参数化移位法则(parametershiftrule)来计算梯度,参数偏移量指定为2,程序实现如下:defparametershift(inputs,expop,params,shiftnp。pi2):Backwardpasscomputation,calculatethegradientofquantumcircuitbyparametershiftrule。paramsnp。array(params)gradients〔〕foriinrange(len(params)):shiftrightnp。copy(params)shiftright〔i〕shiftshiftleftnp。copy(params)shiftleft〔i〕shiftcircuitjoincircuit(circuitencoder(inputs),circuitansatz(),shiftright)expectationright1circuit。expvalpauli(expop)circuitjoincircuit(circuitencoder(inputs),circuitansatz(),shiftleft)expectationleft1circuit。expvalpauli(expop)gradientnp。array(〔expectationright〕)np。array(〔expectationleft〕)gradients。append(gradient)gradientsnp。squeeze(np。array(gradients)。T)returngradients3。7自定义训练网络的类
针对训练网络定义了一个类CustomTrainOneStepCell,这个类包含2个函数,其中init用于定义优化器及其参数,construct用于计算损失函数,具体实现如下:classCustomTrainOneStepCell(nn。Cell):definit(self,optimizer,expop):super(CustomTrainOneStepCell,self)。init(autoprefixFalse)self。optimizeroptimizer定义优化器self。expopexpopself。weightsself。optimizer。parameters待更新参数self。gradparametershiftdefconstruct(self,inputs):inputsinputs〔0〕前向计算输出circuitjoincircuit(circuitencoder(inputs),circuitansatz(),self。weights〔0〕)loss1circuit。expvalpauli(self。expop)用参数位移计算梯度gradsself。grad(inputs,self。expop,self。weights〔0〕)进行反向传播,计算梯度lossops。depend(loss,self。optimizer((Tensor(grads),)))使用优化器更新梯度returnloss3。8执行训练首先设置训练网络参数的初始化值,迭代次数ITR设置为240,学习速率LR设置为0。02。然后设置构建Encoder量子线路的参数在值:,其初始化值分别设置为0。2,0。3和0。4最后定义测量的算符op为hamiltonian函数,并指定优化器使用MindSpore的Aadm优化器设置训练参数ITR240LR0。02设置Encoder线路角度初始化值encdnp。array(〔0。2,0。3,0。4〕)设置测量操作符及优化器ophamiltonian()optAdam(〔Parameter(Tensor(np。random。rand(2)),nameansatztheta)〕,learningrateLR)
然后通过自定义训练函数进行参数化训练,并将损失函数保存到列表中。trainnetCustomTrainOneStepCell(opt,op)losslist〔〕foriinrange(ITR):restrainnet(Tensor(encd))losslist。append(res)ifi100:print(i,:,。4fres)
通过迭代训练,打印输出的结果如下,可以看到通过230迭代后,loss不断变小收敛,并达到目标值1。0:0。766810:0。577720:0。332630:0。047440:0。246450:0。510060:0。713870:0。849080:0。926490:0。9651100:0。9826110:0。9901120:0。9936130:0。9956140:0。9969150:0。9979160:0。9986170:0。9991180:0。9994190:0。9996200:0。9998210:0。9999220:0。9999230:1。00003。9结果呈现
由于测量值接近收敛于1,所以我们可以打印此时Ansatz中的参数。ansdtrainnet。weights〔0〕print(finaltheta:,ansd。value())
得到的的值为2。19643544。的值为1。07710791finaltheta:〔2。196425441。07710791〕
同时也可以获取到此时最优参数下的量子线路的状态向量和fidelity值及打印最终线路图,程序实现如下:circjoincircuit(circuitencoder(encd),circuitansatz(),ansd)statecirc。getstatevector()print(state:,str(state))fidnp。abs(np。vdot(state,〔1,0〕))2print(fidelity,:,fid)circ。draw()
得到的结果如下:state:〔0。389835340。92082061j0。00979640。00467482j〕fidelity:0。999882176674514
打印的线路图为:
为了更形象的展示损失函数的下降趋势,我们也可以通过matplot打印出其损失函数的曲线,程序如下:plt。figure(1)ITRlist〔〕foriinrange(ITR):ITRlist。append(i)funcplt。plot(ITRlist,losslist,alpha0。7,marker,linestyle,colorr)plt。xlabel(iterations)plt。ylabel(loss)plt。legend(labels〔lossfunctionduringiteration〕,locbest)plt。show()
打印的曲线图如下:
4、总结
以上的示例只是QuTrunk与MindSpore结合的一次小的尝试,通过这次QuTrunk的量子编程框架和MindSporeAI深度学习框架的结合实践的探索,也为后续的深结合使用提供了较好的参考。
作者:黄文、潘彦宽、邵伟、郭梦洁
注:本文已优先投稿于MindSpore公众号
新五大黄金产业孕育机遇,中高端人才加速迁徙北京日报客户端记者潘福达12月28日,2022脉脉MAX年度职场夜话暨职得去雇主评选揭晓典礼在线上举办,会上发布抢滩数字时代人才迁徙报告2023。报告称,2023年人工智能电子芯片
京东健康联合中华社会救助基金会发起京东健康应急小药箱乡村用药支援公益行动日前,由京东健康与中华社会救助基金会联合发起的京东健康应急小药箱公益项目启动乡村用药支援行动,项目首批将为全国5个省级行政区的8个村镇捐赠退烧药品,覆盖3。7万名乡村群众。据悉,该
看山望水寄乡愁渝北乡村旅游再提质兴隆镇曾家老房子。渝北区文化旅游委供图两江环带,三山列屏。渝北,一方山水之城,魅力之地,人文底蕴深厚,有着丰富的物产资源和自然风光,山川黛色如青,流水碧溪潺潺,乡村自然风光令无数游
2022年湖南省五星级乡村旅游区(点)公示永州3地拟入选郴州市北湖区小埠大院。红网时刻新闻12月30日讯(记者何超)今天,湖南省文化和旅游厅官网发布公示,经创建申报单位自查市州文化旅游行政主管部门初审推荐,湖南省星级乡村旅游区(点)评定
云南镇康百亩乡村采摘游露鲜甜这里的草莓特别甜,周末有时间,就约上几个朋友来摘,我很享受这种亲近大自然,采摘鲜果的乐趣。这些天,临沧市镇康县勐捧镇岩子头村村民刘红顺的20多亩草莓园里热闹极了,这也让种草莓的农人
盘点世界各地的奇葩节日,裸泳只是前戏,更变态的还在后头!可能大家觉得裸泳这项运动项目非常奇葩,但在世界各国,有个国家的风俗文化更变态。(此处已添加小程序,请到今日头条客户端查看)众所周知,随着全球化趋势加快,我们与各国之间的联系越来越密
广州出发重庆5天游,畅游仙女山雪景天生三桥武隆山大裂谷今天给大家分享一条从广州出发,重庆高铁5天旅游行程,畅游仙女山雪景探秘天生三桥与武隆山大裂谷苗族建筑九黎城景区。重庆,一座带有麻辣味道的城市,美食与美景并存的城市。1洪崖洞没去过洪
勐海县的七大著名古茶区西双版纳勐海县号称中国普洱茶第一县,是世界茶树原产地和普洱茶发祥地之一,也是滇藏茶马古道的源头和滇缅通关的重要驿站。勐海种茶制茶用茶贸茶历史悠久,是我国和云南最早的普洱茶出口基地。
遂潼携手护一江碧水这个新建的涪江自然公园真的太美了,还能和涪江亲密接触,我每天都来。2022年9月,涪江沿岸绿树成荫,潼南区居民李先生正在悠闲散步。和李先生一样,很多居民一大早就来到涪江之滨休闲健身
阳康之后去哪儿?8个冬季户外旅行地,还有免门票政策加持!好消息!一波阳性患者已经转阴!他们也将马上回归正常的生活而彼时冬日的户外没有了人潮拥挤,风景倒是更加自然纯净云海日出雪山湖泊草地森林那里的一切都令人无比想念!如果可以,真想不顾一切
开封有个包青天,铁面无私辨忠奸包公即包拯(公元9991062年),字希仁,庐州合肥(今安徽合肥市)人,父亲包仪,曾任朝散大夫,逝世后追赠刑部侍郎。包公少年时便以孝而,性直敦厚。在宋仁宗天圣五年,即公元1027年