量子神经网络是基于量子力学原理的计算神经网络模型。1995年,Subhash Kak 和 Ron Chrisley 独立发表了对于量子神经计算的第一个想法,他们致力于量子思维实践,认为量子效应在认知性能中起作用。然而,量子神经网络的典型钻研波及将经典的人工神经网络模型(在机器学习中宽泛用于模式识别的重要工作)与量子信息的劣势相结合,以倒退更高效的算法。这些钻研的一个重要动机是经典神经网络难以训练,特地是在大数据利用中更是如此。心愿能够利用量子计算的个性,如量子并行性或干预和纠缠效应作为资源。

基于QuTrunk+AI框架构建量子神经网络的解决方案,与Mindspore及paddle联合实际曾经公布过相干实战的文章。而TensorFlow作为一个十分风行和重要的AI深度学习框架,QuTrunk也同样反对与之联合一起应用。本文次要介绍在AWS试验环境中应用QuTrunk联合TensorFlow来实现量子神经网络构建的试验。试验之前,咱们首先介绍下本示例中应用到的两个技术资源:AWS DLAMI和TensorFlow。

1、AWS DLAMI及TensorFlow简介

1.1 AWS DLAMI

AWS提供的Amazon Deep Learning AMI(缩写为DLAMI)能够帮忙用户疾速的部署部署好深度学习试验环境和疾速上手试验。它具备如下特点:

预装框架:DLAMI目前次要有2个次要的规格:DL Base AMI和DLAMI with conda和。DL Base AMI未装置框架,仅装置了NVIDIA CUDA和其余依赖项。DLAMI with conda则全副都蕴含,不仅齐全装备了TensorFlow、PyTorch、Apache MXNet机器学习框架,也事后配置了NVIDIA CUDA和NVIDIA cuDNN。它应用Conda环境来隔离每个框架,用户能够在它们之间随便切换,而不必放心它们的依赖关系抵触;
预装GPU软件:即便应用仅CPU的实例,DLAMI也将具备NVIDIA CUDA和NVIDIA cuDNN。无论实例类型如何,装置的软件都雷同。
模型服务和可视化:应用Conda的深度学习AMI预装了两种模型服务器,一种用于MXNet,另一种用于TensorFlow,以及TensorBoard,用于模型可视化。

1.2 TensorFlow2

TensorFlow是一个用于机器学习和人工智能的收费开源软件库。它能够用于一系列工作,但特地关注深度神经网络的训练和推理。 TensorFlow由谷歌大脑团队开发,用于谷歌外部钻研和生产。初始版本于2015年依据Apache License 2.0公布。Google于2019年9月公布了TensorFlow的更新版本,名为TensorFlow 2.0。TensorFlow可用于多种编程语言,包含Python、JavaScript、C++和Java。 这种灵活性实用于许多不同行业的一系列利用。

TensorFlow 2.0引入了许多变动,最重要的是TensorFlow eager,它将主动微分计划从动态计算图扭转为最后由Chainer和起初的PyTorch风行的“按运行定义”计划。其余次要变动包含删除旧库、不同版本TensorFlow上的训练模型之间的穿插兼容性以及GPU性能的显著改良。

2、试验环境搭建

2.1 启动AWS Deep Learning EC2实例

2.1.1、关上EC2 Dashborad

登录AWS的治理控制台,点击右上角Region下拉菜单切换到须要创立的资源的Region,本示例应用亚太新加坡站点的资源。而后从Services抉择EC2,关上EC2 Dashboard。

2.1.2、创立EC2拜访密钥对
顺次点击服务->计算->EC2关上EC2的主页面。首先创立好秘钥对便于前面登录到EC2,顺次点击左侧导航栏的网络与平安->密钥对->创立密钥对。

实现创立后主动下载秘钥,保留好秘钥文件备用。

2.1.3、AMI抉择
返回到EC2主页,抉择启动实例,关上实例配置页面,先设置实例名称设置为QNNDemo_Tensor,而后抉择镜像版本,搜寻框输出Deep Learning进行搜寻,关上镜像搜寻后果页面,显示如下:

疾速启动AMI中有8个搜寻后果,本示例应用的是TensorFlow2,抉择搜寻后果中:Deep Learning AMI GPU TensorFlow 2.11.0 (Ubuntu 20.04) 20221220这个镜像。

2.1.4、实例类型确定
选定镜像后再确定须要创立的实例类型。镜像的实例类型能够在实例上面的实例类型中查问,例如查问GPU是实例类型,依据条件过滤,能够看到有如下gpu实例类型:

AWS提供了大量的实例类型可供用户抉择,用户能够从经济和需要角度登程,抉择适合的镜像来创立实例。对于深度学习,AWS举荐是应用GPU实例P3,P4,G3,G4,G5和G5g。各GPU实例类型的配置如下:

  • P3具备 8 NVIDIA Tesla V100 GPUs
  • P4具备8 NVIDIA Tesla A100 GPUs
  • G3具备4 NVIDIA Tesla M60 GPUs
  • G4具备4 NVIDIA T4 GPUs
  • G5具备o 8 NVIDIA A10G GPU
  • G5g则有基于Arm的 AWS Graviton2 processors。

如果经济上受限或者对于性能要求不是十分高,AWS也提供了绝对经济的深度学习CPU实例和推理实例。深度学习举荐的CPU实例有三种:C5(不是所以的region都提供)、C4、C3等实例类型。

  • C5实例最多有72个Intel vCPU。C5实例善于迷信建模、批处理、分布式剖析、高性能计算(HPC)以及机器和深度学习推理。
  • C4实例最多有36个Intel vCPU。

AWS推理实例旨在为深度学习模型推理工作负载提供高性能和高老本效率。具体来说,Inf1实例类型应用AWS Infentia芯片和AWS Neuron SDK,后者与TensorFlow、PyTorch和MXNet等风行的机器学习框架集成。客户能够应用Inf1实例以最低的云老本运行大规模机器学习推理应用程序,如搜寻、举荐引擎、计算机视觉、语音辨认、自然语言解决、个性化和欺诈检测。Amazon EC2 Inf1实例具备多达16个AWS Infentia芯片和100 Gbps的网络吞吐量。

本示例只是用于简略深度学习试验,从节省成本思考,选用的实例类型是CPU类型,抉择的是一般是t2.medium。用户也能够依据须要抉择其余带GPU的实例。

2.1.5、创立和启动实例
实例类型确定后而后抉择密钥对、网络设置及存储。最初点击启动示例提交创立。其余配置如下:

提交后示例创立中,待状态转变为正在运行即可开始应用。

3、量子神经网络构建

应用量子+深度学习构建量子神经网络根本流程差不多一统一,次要流程如下:

为了便于学习和了解,咱们本示例程序同样采纳单量子比特来构建一个简略的神经网络,构建的神经模型架构如下:

本示例模型次要由3个局部组成:

  • 输出电路/数据点电路:后面3个门,别离为:
  • 模型电路:前面3个门,对应别离为:
  • 期望值电路:对线路执行PauliZ算符

3.1、环境筹备

3.1.1、登录EC2实例

EC2页面选中方才创立的这个示例,点击右键抉择连贯,抉择ssh客户端,显示如下:

依据秘钥文件保留的目录,应用如下命令即可拜访

ssh -i "qutrunk-asia.pem" ubuntu@18.141.145.32

3.1.2、QuTrunk装置
执行如下命令装置QuTrunk最新版本到EC2环境上:

ubuntu@ip-192-168-150-172:~$ pip3 install --upgrade pip  -i https://pypi.tuna.tsinghua.edu.cn/simpleubuntu@ip-192-168-150-172:~$ pip3 install qutrunk  -i https://pypi.tuna.tsinghua.edu.cn/simple

QuTrunk装置实现后,在python3命令行交互模式下,测试是否装置胜利:

ubuntu@ip-192-168-150-172:~$ python3Python 3.10.7 (main, Dec 20 2022, 07:32:05) [GCC 9.4.0] on linuxType "help", "copyright", "credits" or "license" for more information.>>> import qutrunk>>> qutrunk.run_check()============QuSL instruction:===========qreg q[2]creg c[2]H * q[0]MCX(1) * (q[0], q[1])Measure * q[0]Measure * q[1]===============Draw circuit=============      ┌───┐      ┌─┐q[0]: ┤ H ├──■───┤M├───      └───┘┌─┴──┐└╥┘┌─┐q[1]: ─────┤ CX ├─╫─┤M├           └────┘ ║ └╥┘ c: 2/════════════╩══╩═                  0  1==========circuit running result=========[{"0b00": 57}, {"0b11": 43}]===========circuit running info=========={"backend": "BackendLocal", "task_id": "7478c36b8ec941dbaed9b14f64a854a3", "status": "success", "arguments": {"shots": 100}}qutrunk v0.2.0 is installed successfully! You can use QuTrunk now.

3.1.3、Jupyter Notebook Server设置
为不便测试,本试验在JupyterNotebook环境下进行验证,DLAMI环境上曾经装置Jupyter Notebook,只需进行简略的配置和启动即可。

1、设置Jupyter server

首先设置首选明码:

ubuntu@ip-192-168-150-172:~$ jupyter notebook passwordEnter password:Verify password:[NotebookPasswordApp] Wrote hashed password to /home/ubuntu/.jupyter/jupyter_notebook_config.json

2、启动upyter notebook server

咱们能够通过如下命令开启一个反对近程拜访的jupyter notebook:

$ jupyter notebook --ip=0.0.0.0

而后咱们就能够在本地PC上拜访了,关上浏览器,输出EC2的公网IP:8888即可拜访,关上登录界面:

输出刚设置的明码登录到环境,点击新建按钮,而后抉择Python3

关上试验页面就能够开始基于QuTrunk的量子计算与深度学习框架联合的程序的开发了

3.2、程序实现

3.2.1 环境设置
装置实现后,设置程序应用的环境:

import randomimport numpy as npimport tensorflow as tffrom matplotlib import pyplot as pltfrom qutrunk.circuit import QCircuitfrom qutrunk.circuit.gates import Rx, Ry, Rz, PauliZ

3.2.2、定义量子线路相干函数
依据后面模型设计,次要蕴含3个神经网络组成部分的量子线路函数,还有一个量子线路合并函数

数据点电路函数如下:

def datapoint_circuit(rotations):    beta0, beta1, beta2 = [float(f) for f in rotations]    circuit = QCircuit()    qreg = circuit.allocate(1)    Rx(beta0) * qreg[0]    Ry(beta1) * qreg[0]    Rz(beta2) * qreg[0]    return circuit

模型电路函数定义:

def model_circuit():    circuit = QCircuit()    q = circuit.allocate(1)    angles = ["theta-1", "theta-2", "theta-3"]    params = circuit.create_parameters(angles)    Rz(params[0]) * q[0]    Ry(params[1]) * q[0]    Rx(params[2]) * q[0]    return circuit

期望值函数定义:

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

最初是电路组合函数定义:

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

3.2.3、定义梯度计算类
采纳梯度降落的算法训练量子神经网络,为了不便调用,本示例将梯度计算定义为一个类

class CustomGradientTape:    def __init__(self, inputs, exp_op, shift=np.pi / 2):        self.inputs = inputs        self.exp_op = exp_op        self.shift = shift    def gradient(self, loss, var_list):        params = [var.numpy() for var in var_list]        gradients = []        for i in range(len(params)):            shift_right = np.copy(params)            shift_right[i] += self.shift            shift_left = np.copy(params)            shift_left[i] -= self.shift            circuit = join_circuit(datapoint_circuit(self.inputs), model_circuit(), shift_right)            expectation_right = -1 * circuit.expval_pauli(self.exp_op)            circuit = join_circuit(datapoint_circuit(self.inputs), model_circuit(), shift_left)            expectation_left = -1 * circuit.expval_pauli(self.exp_op)            gradient = expectation_right - expectation_left            gradients.append(tf.convert_to_tensor(gradient, dtype=tf.float32))        return gradients

3.2.4、自定义层类
自定义层类蕴含了损失函数的定义,返回为迭代训练后的损失值

class ControlledPQC(tf.keras.layers.Layer):    def __init__(self, optimizer, exp_op, var_list, grad):        super(ControlledPQC, self).__init__()        self.optimizer = optimizer        self.exp_op = exp_op        self.var_list = var_list        self.grad = grad    def call(self, inputs):        params_list = [var.numpy() for var in self.var_list]        circuit = join_circuit(datapoint_circuit(inputs), model_circuit(), params_list)        loss = -1 * circuit.expval_pauli(self.exp_op)        self.optimizer.minimize(loss, self.var_list, self.grad)        return loss

3.2.5、模型设置及训练
首先根设置事后定义的参数,而后通过TensorFlow的Adam优化器优化下面的量子神经网络,,通过调整迭代次数ITR和学习率 LR从新计算以使得这两个值达到十分靠近。初始化设置如下:

ITR = 200LR = 0.02rand = random.Random()random_rotations = tf.convert_to_tensor(np.random.uniform(0, 2 * np.pi, 3))op = expectation()opt = tf.keras.optimizers.Adam(learning_rate=LR)

迭代循环计算和打印损失值。

control_params = [tf.Variable(rand.uniform(0, 2 * np.pi)) for _ in range(3)]model = ControlledPQC(opt, op, control_params, CustomGradientTape(random_rotations, op))loss_list = []for it in range(ITR):    ls = model(random_rotations)    loss_list.append(ls)    if it % 10 == 0:        print(f"{it}: {ls:.4f}")

运行后输入的后果如下:

0: -0.239910: -0.620320: -0.868930: -0.974640: -0.996950: -0.996760: -0.997370: -0.999180: -0.999990: -1.0000100: -1.0000110: -1.0000120: -1.0000130: -1.0000140: -1.0000150: -1.0000160: -1.0000170: -1.0000180: -1.0000190: -1.0000

从后果能够看到通过130次迭代之后损失值逐步收敛到-1。

3.2.6、后果展现
为了更形象的展现训练后果,咱们应用plot打印其曲线,实现形式如下:

plt.plot(loss_list)plt.title("Learning to Control a Qubit")plt.xlabel("Iterations")plt.ylabel("loss")

输入的后果如下:

4、总结

本文章具体展现了应用AWS的DLAMI疾速部署出深度学习的试验环境,并应用QuTrunk与AI框架TensorFlow联合实现构建量子神经网络的试验和输入测试后果,为量子计算+深度学习的开发者用户提供了一个简略的入门学习示例。

QuTrunk是启科量子公布的一个开源的、灵便方便使用的、能够与各种思考开源AI框架联合应用的量子编程框架。通过本文的展现,读者对量子编程+AI框架联合应用的办法有了根本理解,读者也能够拜访启科开发者社区,深刻理解QuTrunk的个性以便应用QuTrunk+AI的解决方案解决理论利用的中问题。更多的信息请点击QuSaaS:启科开发者平台

作者:

Keith Yan(丘秉宜)中国首位亚马逊云科技 Community Hero。

黄文,启科量子DEVOPS工程师

Marz Kuo(郭梦杰),启科量子资深研发工程师,量子计算开源框架保护人

浏览原文:https://dev.amazoncloud.cn/co...