IBM Qiskit量子机器学习速成(一)

2023-11-11 22:01

本文主要是介绍IBM Qiskit量子机器学习速成(一),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

声明:本篇笔记基于IBM Qiskit量子机器学习教程的第一节,中文版译文详见:https://blog.csdn.net/qq_33943772/article/details/129860346?spm=1001.2014.3001.5501

概述

首先导入关键的包

from qiskit import QuantumCircuit
from qiskit.utils import algorithm_globals
from qiskit.circuit import Parameter, ParameterVector
from qiskit.quantum_info import SparsePauliOp
from qiskit_machine_learning.neural_networks import EstimatorQNN, SamplerQNN

尤其注意qiskit_machine_learning包需要额外安装(如果你是Anaconda用户,特别注意需要先激活相应虚拟环境),参考指令如下

pip install qiskit_machine_learning

另外,由于接下来的程序中涉及随机数,我们需要指定全局的随机数种子:

# qiskit_machine_learning需要另外安装
algorithm_globals.random_seed = 42

我们知道,机器学习的本质是确定问题本身的结构后对某些参数进行学习。例如,我们对人的身高和体重之间的关系很感兴趣,我们先假设二者之间存在线性关系 y = k x + b y=kx+b y=kx+b,也就是确定了二者之间的结构,从而对参数 k , b k,b k,b进行学习。而学习过程本身就是对参数的调节,使模型最大程度上符合问题的描述。

一般而言,参数化的量子电路分为三个部分:

  • 数据加载:input
  • 数据处理:weight
  • 测量结果

搭建神经网络

一般而言,我们会用到两种量子神经网络,分别是EstimatorQNN和SamplerQNN。顾名思义,EstimatorQNN是用来“估计”某个算符的期望值的,而SamplerQNN是用来计算量子态的。

例如,我们想估算某个力学量(比如说哈密顿量 H ^ \hat H H^)的期望值,我们就可以构建一个包含该哈密顿量 H ^ \hat H H^的EstimatorQNN。

当我们对量子态的分布更感兴趣时,也就是,我们更感兴趣初始态经过电路的操作后会变成哪几种量子态(最简单的情形是加一个哈达玛门,从而结果是 ∣ 0 > + ∣ 1 > 2 \dfrac{\left|0\right>+\left|1\right>}{\sqrt 2} 2 0+1)。

但是需要注意,在机器学习中,问题必须带有参数!我们可以这样理解SamplerQNN:通过调整电路中的某些参数,使得某些量子态的分布达到极大或极小。

EstimatorQNN的创建

EstimatorQNN创建时只需要以下几个部分:

  • 一个已经写好的参数化电路
  • 力学观测量(可选,如果不特别说明的话,其实计算的就是单位矩阵的期望值)
  • 输入参数(input_params)
  • 权重参数(weight_params)

例如,我们可以通过以下方式创建参数(或参数向量)和参数化电路

params1 = [Parameter("input1"), Parameter("weight1")]
qc1 = QuantumCircuit(1)
qc1.h(0)
qc1.ry(params1[0], 0)
qc1.rx(params1[1], 0)

随后,通过泡利矩阵构造力学量(或可观测量)

observable1 = SparsePauliOp.from_list([("Y" * qc1.num_qubits, 1)])

组合以上部分,直接写入参数,即可得到一个EstimatorQNN

estimator_qnn = EstimatorQNN(circuit=qc1,observables=observable1,input_params=[params1[0]],weight_params=[params1[1]]
)

SamplerQNN的创建

SamplerQNN创建时只需要以下几个参数:

  • 一个已经写好的参数化电路
  • 输入参数(input_params)
  • 权重参数(weight_params)

可以看出,SamplerQNN也需要参数化电路(毕竟机器学习就是调节参数),它直接从末态读取结果(二进制字符串或非负整数)。不同的是,SamplerQNN提供interpret方法,你可以重写这个方法,来对结果进行解释。例如,QAOA中将结果解释为划分的区域。但是一旦外部重写interpret方法,必须显式指定
output_shape,因为Qiskit无法自动推断结果。

首先,声明输入和权重参数,并创建参数化电路。

inputs2 = ParameterVector("input", 2)
weights2 = ParameterVector("weight", 4)qc2 = QuantumCircuit(2)
qc2.ry(inputs2[0], 0)
qc2.ry(inputs2[1], 1)
qc2.cx(0, 1)
qc2.ry(weights2[0], 0)
qc2.ry(weights2[1], 1)
qc2.cx(0, 1)
qc2.ry(weights2[2], 0)
qc2.ry(weights2[3], 1)

进而创建SamplerQNN:

sampler_qnn = SamplerQNN(circuit=qc2,input_params=inputs2,weight_params=weights2)

前向传播神经网络(运行神经网络)

神经网络示意图

当我们搭建好神经网络后,就需要执行神经网络了。一般来说,我们首先需要给定输入值和权重的初始值(注意,关键在于权重)。随后我们就可以获得运行的结果了。前向传播神经网络需要使用神经网络对象的forward方法

初始化参数

出于演示的目的,我们此处随机地设定输入值和权重值。

estimator_qnn_input = algorithm_globals.random.random(estimator_qnn.num_inputs)
estimator_qnn_weights = algorithm_globals.random.random(estimator_qnn.num_weights)
sampler_qnn_input = algorithm_globals.random.random(sampler_qnn.num_inputs)
sampler_qnn_weights = algorithm_globals.random.random(sampler_qnn.num_weights)

数据的输入分为非分批输入(non-batched input)和分批输入(batched input)

非分批输入

非分批输入即直接输入全部参数,属于最简单、最直接的输入方式。当然,在数据集过大的情况下,这种输入方式不利于神经网络的训练。

estimator_qnn_forward = estimator_qnn.forward(estimator_qnn_input, estimator_qnn_weights)
print(f"Forward pass result for EstimatorQNN: {estimator_qnn_forward}. \nShape: {estimator_qnn_forward.shape}"
)sampler_qnn_forward = sampler_qnn.forward(sampler_qnn_input, sampler_qnn_weights)
print(f"Forward pass result for SamplerQNN: {sampler_qnn_forward}.  \nShape: {sampler_qnn_forward.shape}"
)
分批输入

分批输入即将数据集先裁剪成适当大小(例如6x6、32x32大小的数据矩阵),再输入神经网络。

estimator_qnn_forward_batched = estimator_qnn.forward([estimator_qnn_input, estimator_qnn_input], estimator_qnn_weights
)
print(f"Forward pass result for EstimatorQNN: {estimator_qnn_forward_batched}.  \nShape: {estimator_qnn_forward_batched.shape}"
)sampler_qnn_forward_batched = sampler_qnn.forward([sampler_qnn_input, sampler_qnn_input], sampler_qnn_weights
)
print(f"Forward pass result for SamplerQNN: {sampler_qnn_forward_batched}.  \nShape: {sampler_qnn_forward_batched.shape}"
)

反向传递(优化神经网络/训练神经网络)

反向传递会根据神经网络前向传播的结果,来优化权重参数。反向传递需要使用神经网络对象的backward方法

estimator_qnn_input_grad, estimator_qnn_weight_grad = estimator_qnn.backward(estimator_qnn_input, estimator_qnn_weights
)
print(f"Input gradients for EstimatorQNN: {estimator_qnn_input_grad}.  \nShape: {estimator_qnn_input_grad}"
)
print(f"Weight gradients for EstimatorQNN: {estimator_qnn_weight_grad}.  \nShape: {estimator_qnn_weight_grad.shape}"
)sampler_qnn_input_grad, sampler_qnn_weight_grad = sampler_qnn.backward(sampler_qnn_input, sampler_qnn_weights
)
print(f"Input gradients for SamplerQNN: {sampler_qnn_input_grad}.  \nShape: {sampler_qnn_input_grad}"
)
print(f"Weight gradients for SamplerQNN: {sampler_qnn_weight_grad}.  \nShape: {sampler_qnn_weight_grad.shape}"
)

总结

  • 声明参数(Parameter或ParameterVector)并创建参数化电路
  • 传入EstimatorQNN或SamplerQNN,一般格式:xxxQNN(circuit, inputs, weights)
    (Estimator可能需要额外导入力学量矩阵)
  • 前向传递:xxxQNN.forward(inputs, weights) 分为无批次或有批次(有批次时直接将inputs换为多个数据组的列表,[input_list1, input_list2…])
  • 反向传播:xxxQNN.backward(inputs, weights)

这篇关于IBM Qiskit量子机器学习速成(一)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/393099

相关文章

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

学习hash总结

2014/1/29/   最近刚开始学hash,名字很陌生,但是hash的思想却很熟悉,以前早就做过此类的题,但是不知道这就是hash思想而已,说白了hash就是一个映射,往往灵活利用数组的下标来实现算法,hash的作用:1、判重;2、统计次数;

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss

【学习笔记】 陈强-机器学习-Python-Ch15 人工神经网络(1)sklearn

系列文章目录 监督学习:参数方法 【学习笔记】 陈强-机器学习-Python-Ch4 线性回归 【学习笔记】 陈强-机器学习-Python-Ch5 逻辑回归 【课后题练习】 陈强-机器学习-Python-Ch5 逻辑回归(SAheart.csv) 【学习笔记】 陈强-机器学习-Python-Ch6 多项逻辑回归 【学习笔记 及 课后题练习】 陈强-机器学习-Python-Ch7 判别分析 【学

系统架构师考试学习笔记第三篇——架构设计高级知识(20)通信系统架构设计理论与实践

本章知识考点:         第20课时主要学习通信系统架构设计的理论和工作中的实践。根据新版考试大纲,本课时知识点会涉及案例分析题(25分),而在历年考试中,案例题对该部分内容的考查并不多,虽在综合知识选择题目中经常考查,但分值也不高。本课时内容侧重于对知识点的记忆和理解,按照以往的出题规律,通信系统架构设计基础知识点多来源于教材内的基础网络设备、网络架构和教材外最新时事热点技术。本课时知识

线性代数|机器学习-P36在图中找聚类

文章目录 1. 常见图结构2. 谱聚类 感觉后面几节课的内容跨越太大,需要补充太多的知识点,教授讲得内容跨越较大,一般一节课的内容是书本上的一章节内容,所以看视频比较吃力,需要先预习课本内容后才能够很好的理解教授讲解的知识点。 1. 常见图结构 假设我们有如下图结构: Adjacency Matrix:行和列表示的是节点的位置,A[i,j]表示的第 i 个节点和第 j 个