QuTrunk与MindSpore量子神经网络初探

news2024/11/24 15:23:21

QuTrunk是启科量子开发和已经开源的一款量子编程框架软件产品,关于QuTrunk的详细介绍,用户可以访问启科的开发者社区站点详细了解,也可以进入github上此项目下进行查询。

QuTrunk开发框架是可以与第三方AI框架深度结合进行量子计算程序开发的,前面一篇中我们已经使用QuTrunk+paddle在VQA算法实现上做了一个小的尝试。本篇中我们将使用华为的昇思MindSpore与QuTrunk的结合实践来展示QuTrunk的量子计算程序开发的方法和流程。本示例类似于VQA算法的实现,我们将采用一个更简单的单量子比特的量子神经网络训练程序来说明。

2.1 简介

量子神经网络是基于量子力学原理的计算神经网络模型。1995年,Subhash Kak和Ron Chrisley独立发表了关于量子神经计算的第一个想法,他们致力于量子思维理论,认为量子效应在认知功能中起作用。然而,量子神经网络的典型研究涉及将经典的人工神经网络模型(在机器学习中广泛用于模式识别的重要任务)与量子信息的优势相结合,以发展更高效的算法。这些研究的一个重要动机是经典神经网络难以训练,特别是在大数据应用中更是如此。希望可以利用量子计算的特性,如量子并行性或干涉和纠缠效应作为资源。由于量子计算机的技术实现还处于早期阶段,此类量子神经网络模型大多是理论建议,有待在物理实验中充分实现。

大多数量子神经网络是作为前馈网络开发的。与它们的经典结构类似,这种结构从一层量子位中获取输入,并将输入传递到另一层量子位。这一层量子位评估这些信息,并将输出传递给下一层。最终,这条路径通向量子比特的最后一层层不必具有相同的宽度,这意味着它们不必具有与层之前或之后相同数量的量子比特。量子神经网络研究仍处于起步阶段,已经提出了一系列不同范围和数学严谨性的建议和想法。其中大多数都是基于用量子位(可以称为“量子位”)取代经典的二进制或McCulloch-Pitts神经元的想法,从而产生可以处于“激发”和“休息”状态叠加的神经单元。

在较广泛的领域内,研究人员试图将神经网络推广到量子环境中。构建量子神经元的一种方法是首先将经典神经元泛化,然后再将其进一步泛化,以形成幺正门。神经元之间的相互作用可以通过单一门进行量子控制,也可以通过网络状态的测量进行经典控制。通过采用不同类型的网络和量子神经元的不同实现,大多数学习算法遵循训练人工神经网络的经典模型,以学习给定训练集的输入输出函数,并使用经典反馈环路来更新量子系统的参数,直到它们收敛到最优配置。量子神经网络可以应用于算法设计:给定具有可调谐相互作用的量子位,可以尝试从期望的输入输出关系的训练集中学习遵循经典反向传播规则的相互作用,这被认为是期望的输出算法的行为。

使用这种量子前馈网络,可以有效地执行和训练深度神经网络。深度神经网络本质上是一个具有许多隐藏层的网络,如上面的示例模型神经网络所示。由于正在讨论的量子神经网络使用扇出酉算子,并且每个算子只作用于其各自的输入,所以在任何给定时间都只使用两层。换句话说,在任何给定的时间,没有酉算子作用于整个网络,这意味着给定步骤所需的量子位数量取决于给定层中的输入数量。由于量子计算机以其在短时间内运行多次迭代的能力而臭名昭著,量子神经网络的效率仅取决于任何给定层中的量子比特数,而不取决于网络的深度。

2.2 量子神经网络基本结构

量子神经网络中,其量子线路结构通常由三个部分组成。

1、Encoder线路即编码线路,用于将经典数据编码到量子数据

2、Ansatz即训练线路,用于训练带参量子门的参数

3、Measurement即测量,用于检测测量值(例如在 Z 方向上测量,就是某个量子比特的量子态在 Z轴上的投影,该测量得到的是量子态关于泡利 Z 算符(不限定于泡利 Z 算符,换成其它的算符亦可)的期望值)是否接近于目标期望值。

量子神经网络的基本结构如下图所示,左右两边均为经典网络,中间方框内为量子网络。

为便于理解和上手,本文参考MindQuantum教程的这个简单例子示例来展示如何使用QuTrunk+MindSpore构建量子神经网络。

下面我们将展示采用QuTrunk量子编程框架结合MindSpore如何一步步完成量子神经网络的应用。

3.1 导入需要的模块

程序使用到了numpy,matplotlib,mindspore和qutrunk等,首先导入这些使用到的模块。

import mindspore as ms
import numpy as np
from matplotlib import pyplot as plt
from mindspore import nn, Tensor, Parameter, ops
from mindspore.nn import Adam

from qutrunk.circuit import QCircuit
from qutrunk.circuit.gates import PauliZ, Rx, Ry, H, Rz

设置生成随机数的种子。

ms.set_seed(12)  # 设置生成随机数的种子
ms.set_context(mode=ms.PYNATIVE_MODE, device_target="CPU")

3.2 搭建Encoder

构建编码线路 Encoder,将经典数据编码到量子数据,这里我们定义了一个encoder的函数如下:

def circuit_encoder(encoder_data):
    alpha0, alpha1, alpha2 = [float(f) for f in encoder_data]#定义角度参数
    circuit = QCircuit()  #初始化量子线路
    qreg = circuit.allocate(1) #分配量子比特,申请一个量子寄存器
    H * qreg[0]         #对0位量子比特执行H操作
    Rx(alpha0) * qreg[0]  #Rx(alpha_0)门作用在第0位量子比特
    Ry(alpha1) * qreg[0]  #Ry(alpha_1)门作用在第0位量子比特
    Rz(alpha2) * qreg[0]  #Rz(alpha_2)门作用在第0位量子比特
    return circuit  #返回线路

构建的线路如下:

该量子线路由4个量子门组成,其中有3个含参量子门且参数为α0,α1,α2(3个参数值通过encoder_data这个形参传入),该量子线路调控的量子比特数为1。

3.3 定义Ansatz

Ansatz训练线路的函数定义如下:

def circuit_ansatz():
    circuit = QCircuit()
    q = circuit.allocate(1)
    angles = ["theta-0", "theta-1"]
    params = circuit.create_parameters(angles)

    Rx(params[0]) * q[0]
    Ry(params[1]) * q[0]

    return circuit

其线路图为:

3.4 定义用于测量/投影的哈密顿量

这里哈密顿量构建主要用于线路末态的测量,函数定义如下:

def hamiltonian():
    circuit = QCircuit()
    qreg = circuit.allocate(1)
    return PauliZ(qreg[0])

对0位的量子比特执行PauliZ算符并返回。

3.5 连接线路并绑定参数值

前面定义了Encoder和Ansatz的线路,整个量子神经网络线路即为Encoder+Ansatz,如下即为定义整个线路构建的函数,并绑定了当前的参数值:

def join_circuit(encoder, ansatz, inputs):
    params = {"theta-" + str(i): inputs[i] for i in range(len(inputs))}
    ansatz.bind_parameters(params)
    encoder.append_circuit(ansatz)
    return encoder

3.6 定义梯度计算函数

本示例同样使用参数化移位法则(parameter-shift rule)来计算梯度,参数偏移量指定为π/2,程序实现如下:

def parameter_shift(inputs, exp_op, params, shift=np.pi / 2):
    """
    Backward pass computation, calculate the gradient of quantum circuit by
parameter shift rule.
   """
  params = np.array(params)
gradients = []
for i in range(len(params)):
      shift_right = np.copy(params)
      shift_right[i] += shift
      shift_left = np.copy(params)
      shift_left[i] -= shift

      circuit = join_circuit(circuit_encoder(inputs), circuit_ansatz(),
shift_right)
      expectation_right = -1 * circuit.expval_pauli(exp_op)

      circuit = join_circuit(circuit_encoder(inputs), circuit_ansatz(),
shift_left)
      expectation_left = -1 * circuit.expval_pauli(exp_op)

      gradient = np.array([expectation_right]) - np.array([expectation_left])
      gradients.append(gradient)
  gradients = np.squeeze(np.array(gradients).T)
  return gradients

3.7 自定义训练网络的类

针对训练网络定义了一个类 CustomTrainOneStepCell ,这个类包含2个函数,其中_init_用于定义优化器及其参数, construct 用于计算损失函数,具体实现如下:

class CustomTrainOneStepCell(nn.Cell):

   def __init__(self, optimizer, exp_op):
       super(CustomTrainOneStepCell, self).__init__(auto_prefix=False)
      self.optimizer = optimizer  # 定义优化器
      self.exp_op = exp_op

      self.weights = self.optimizer.parameters  # 待更新参数
      self.grad = parameter_shift

  def construct(self, *inputs):
      inputs = inputs[0]
      # 前向计算输出
      circuit = join_circuit(circuit_encoder(inputs), circuit_ansatz(),
self.weights[0])
      loss = -1 * circuit.expval_pauli(self.exp_op)

      # 用参数位移计算梯度
      grads = self.grad(inputs, self.exp_op, self.weights[0])  # 进行反向传播,计
算梯度
      loss = ops.depend(loss, self.optimizer((Tensor(grads),)))  # 使用优化器更新
梯度
      return loss

3.8 执行训练

1、首先设置训练网络参数的初始化值,迭代次数ITR设置为240,学习速率LR设置为0.02。

2、然后设置构建Encoder量子线路的参数在值:α0,α1,α2,其初始化值分别设置为0.2,0.3和0.4。

3、最后定义测量的算符 op 为 hamiltonian 函数, 并指定优化器使用MindSpore的Aadm优化器。

#设置训练参数
ITR = 240
LR = 0.02
#设置Encoder线路角度初始化值
enc_d = np.array([0.2, 0.3, 0.4])
#设置测量操作符及优化器
op = hamiltonian()
opt = Adam([Parameter(Tensor(np.random.rand(2)), name="ansatz-theta")],
learning_rate=LR)

然后通过自定义训练函数进行参数化训练,并将损失函数保存到列表中。

train_net = CustomTrainOneStepCell(opt, op)

loss_list = []
for i in range(ITR):
    res = train_net(Tensor(enc_d))
    loss_list.append(res)
    if i % 10 == 0:
        print(i, ": ",'%.4f' % res)

通过迭代训练,打印输出的结果如下,可以看到通过230迭代后,loss不断变小收敛,并达到目标值-1。

0 :  0.7668
10 :  0.5777
20 :  0.3326
30 :  0.0474
40 :  -0.2464
50 :  -0.5100
60 :  -0.7138
70 :  -0.8490
80 :  -0.9264
90 :  -0.9651
100 :  -0.9826
110 :  -0.9901
120 :  -0.9936
130 :  -0.9956
140 :  -0.9969
150 :  -0.9979
160 :  -0.9986
170 :  -0.9991
180 :  -0.9994
190 :  -0.9996
200 :  -0.9998
210 :  -0.9999
220 :  -0.9999
230 :  -1.0000

3.9 结果呈现

由于测量值接近收敛于-1,所以我们可以打印此时Ansatz中的参数。

ans_d = train_net.weights[0]
print("final theta: ", ans_d.value())

final theta: [ 2.19642544 -1.07710791]

同时也可以获取到此时最优参数下的量子线路的状态向量和fidelity值及打印最终线路图,程序实现如下:

circ = join_circuit(circuit_encoder(enc_d), circuit_ansatz(), ans_d)
state = circ.get_statevector()
print("state: ", str(state))
fid = np.abs(np.vdot(state, [1, 0])) ** 2
print("fidelity", ": ", fid)
circ.draw()

得到的结果如下:

state: [0.38983534-0.92082061j 0.0097964 +0.00467482j]
fidelity :  0.999882176674514

打印的线路图为:

为了更形象的展示损失函数的下降趋势,我们也可以通过matplot打印出其损失函数的曲线,程序如下:

plt.figure(1)
ITR_list = []
for i in range(ITR):
    ITR_list.append(i)
func = plt.plot(ITR_list, loss_list, alpha=0.7, marker='', linestyle='-',
color='r')
plt.xlabel('iterations')
plt.ylabel('loss')
plt.legend(labels=["loss function during iteration"], loc='best')
plt.show()

打印的曲线图如下:

以上的示例只是QuTrunk与MindSpore结合的一次小的尝试,通过这次QuTrunk的量子编程框架和MindSpore AI深度学习框架的结合实践的探索,也为后续的深层次合作提供了较好的参考,QuTrunk将继续深入探索与MindSpore的结合最佳实践。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/68784.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

安装 Unity 个人免费版

安装 Unity 个人免费版 正版是需要收费的,所以我们个人开发使用个人免费版就可以 一、下载Unity 1.打开unity官网 点击”下载Unity" 官网 https://unity.cn/releases 2.下拉,会有各种版本,进入Unity的下载页面,找到对应的版…

Nacos2.1.2+Seata1.5.2+Mysql8+SpringCloud+Feign实现分布式事务笔记

搭建环境可以使用docker或是手动自己构建 1.启动nacos服务,nacos/nacos登录http://nacos-ip:8848 2.修改Seata的配置文件,注册到nacos上: seata\conf\application.yml server:port: 7091spring:application:name: seata-serverlogging:con…

VS调试安卓Unity应用

最近遇到了一个bug,需要在安卓手机上实机调试才行,所以这里记录一下怎么用VS调试安卓应用。我使用的VS是2017,但是更新的2019等版本应该也是差不多的(毕竟实际上依赖的是Visual Studio Tools for Unity插件)。Unity版本…

管理RMAN备份_管理恢复目录(Recovery Catalog)

本章阐述如何管理RMAN恢复目录。Catalog是一个数据库模式,它包含一个或多个目标数据库的RMAN仓库数据。 1.RMAN恢复目录概述 本节阐述与管理恢复目录相关的基本概念。 1.1.RMAN恢复目录的目的 恢复目录是一个数据库模式,RMAN使…

OutOfMemory内存溢出问题排查

OutOfMemory内存溢出问题排查 错误 2022-12-06 00:43:53.296[,] [registrationTask1] ERROR o.s.s.support.TaskUtils$LoggingErrorHandler.handleError96 - Unexpected error occurred in scheduled task. java.lang.OutOfMemoryError: Java heap space 2022-12-06 00:42:49.…

密码技术学习一:密码

0、前言 本文是作者阅读《图解密码技术》时,学习总结的一些知识,在此推荐想要深入学习密码知识的同志,将此书作为入门书来看还是比较适合的。 1、密码技术简介 1.1加密与解密 在两者通信过程中,不想通信的内容被第三方知道&am…

在R语言中进行缺失值填充:估算缺失值

介绍 缺失值被认为是预测建模的首要障碍。因此,掌握克服这些问题的方法很重要。最近我们被客户要求撰写关于缺失值处理的研究报告,包括一些图形和统计输出。 估算缺失值的方法的选择在很大程度上影响了模型的预测能力。在大多数统计分析方法中&#xf…

有状态软件如何在 k8s 上快速扩容甚至自动扩容

概述 在传统的虚机/物理机环境里, 如果我们想要对一个有状态应用扩容, 我们需要做哪些步骤? 申请虚机/物理机安装依赖下载安装包按规范配置主机名, hosts配置网络: 包括域名, DNS, 虚 ip, 防火墙...配置监控 今天虚机环境上出现了问题, 是因为 RabbitMQ 资源不足. 手动扩容…

一夜之间火爆GitHub的JavaWeb轻量级开发面试教程,终于浮出水面

前言 学习是一种基础性的能力。然而,“吾生也有涯,而知也无涯。”,如果学习不注意方法,则会“以有涯随无涯,殆矣”。 学习就像吃饭睡觉一样,是人的一种本能,人人都有学习的能力。我们在刚出生…

[附源码]Python计算机毕业设计Django医院门诊管理信息系统

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

React组件通信

react因为组件化,使得组件间通信十分的重要。本文就来简单介绍一些常见的react组件间传递的内容。 我将归纳为以下几种关系来详述:父组件与子组件之间,子组件与父组件之间,发布者与订阅者模式(context),兄弟…

Netty入门——基于NIO实现机器客服案例

Netty简单案例前言环境准备前置知识网络传输的几种实现方式BIO——同步阻塞IONIO——同步非阻塞IOAIO——异步非阻塞IO适用范围Netty简介特点核心组件使用场景运行简图案例简介关键代码客户端服务器端运行状况总结前言 最近学完了Netty,在这里关于Netty中实现NIO做…

【Shell 脚本速成】09、Shell 循环控制语句 for

目录 一、循环控制 break 语句 二、循环控制 continue 语句 三、循环控制 sleep 四、参数控制命令-shift 五、脚本退出命令 exit 总结 六、for 嵌套 6.1 for 嵌套 if 七、for 与数组 7.1 使用 for 循环遍历读出数组 7.2 使用 for 循环进行数组存值 一、循环控制 bre…

Zabbix6.0使用教程 (一)—zabbix新增功能介绍2

上一篇我们已经介绍了部分zabbix6.0的新增功能,这期我们将继续为家详细介绍下余下的zabbix6.0新增功能,大家可以往下看。 六、监控项 6.1 自动类型选择 监控项配置表单会自动建议匹配的信息类型,如果选定的监控项键值仅返回特定类型的数据…

迷宫逃离的问题-CoCube

ROS1云课→20迷宫不惑之A*大法(一种虽古老但实用全局路径规划算法) 将CoCube分别放入如下地图中的左侧,如何从右侧逃离: 需要算法:求解起点到终点的路径。 还需要什么? 参考: (eng.…

目标检测算法——垃圾分类数据集汇总(附下载链接)

🎄🎄近期,小海带在空闲之余收集整理了一批垃圾分类数据集供大家参考。 整理不易,小伙伴们记得一键三连喔!!!🎈🎈 目录 一、Kaggle 垃圾分类图片数据集 二、垃圾分类数据…

全国青少年软件编程等级考试Python标准解读(1_6级)

考核性质: 全国青少年软件编程等级考试标准(Python语言)由中国电子学会科普培训与应用推广中心和北京大学信息科学技术学院共同制定。由全国青少年电子信息科普创新联盟标准工作组开发,由中国电子学会普及工作委员会审核通过&…

央视主持人康辉再次出圈,一口气播出一个多小时不卡顿、零失误

说起中央电视台的主持人,曾经有好几个国字脸,不过随着时间的流逝,他们都消失在历史的长河里。如今的央视主持人队伍,康辉可以算得上天花板级别的人,他也因此俘获了一大批观众,成为最受欢迎的主持人。 专业科…

阿里P5的测试开发工程师,都有哪些要求?

【北京】高德 高级测试开发工程师(面议) 职位描述: 1、负责高德信息服务核心服务端系统测试和质量保障体系建设; 2、为复杂高德信息-本地生活系统设计并执行高质量的综合测试方案; 3、通过多种技术手段实现高度自…

数据库常见死锁原因及处理

目录前言什么是死锁死锁产生的四个必要条件1. 表锁死锁死锁场景解决方案建议2. 行锁死锁2.1 两个事务分别想拿到对方持有的锁,互相等待,于是产生死锁死锁场景解决方案2.2 共享锁转换为排他锁死锁场景解决方案3. INSERT ... ON DUPLICATE KEY UPDATE产生d…