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

news2024/11/26 13:43:54

声明:本篇笔记基于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)

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

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

相关文章

暴力递归转动态规划(十四)

题目 arr是面值数组,其中的值都是正数且没有重复。再给定一个正数aim。 每个值都认为是一种面值,且认为张数是无限的。 返回组成aim的最少货币数 暴力递归 依然是面值张数的问题,暴力递归尝试的过程是从数组arr index 0位置出发&#xff0c…

mongodb导出聚合查询的数据

❗️❗️❗️在正文之前先要讲一个坑,就是mongoexport这个命令工具不支持导出聚合查询的数据,比如通过某某字段来分组 我查了一天关于mongoexport怎么来导出聚合查询的结果集,最终还是gpt给了我答案 😭 既然mongoexport不支持&…

Postgresql数据类型-布尔类型

前面介绍了PostgreSQL支持的数字类型、字符类型、时间日期类型,这些数据类型是关系型数据库的常规数据类型,此外PostgreSQL还支持很多非常规数据类型,比如布尔类型、网络地址类型、数组类型、范围类型、json/jsonb类型等,从这一节…

微信的通讯录联系人,有没有什么办法导出来做备份

6-10 这是可以做到的,并且很简单,对于需要把微信通讯录备份出来,或者离职交接的人来说,本文非常适合阅读,只是一个简单的方法,即可快速地把微信的通讯录搞出来,本质其实就是使用正确的工具就行…

Capacitor 插件 实现本地通知 Local Notification @capacitor/local-notifications

Capacitor 插件 实现本地通知 Local Notification capacitor/local-notifications 在前一个文章中使用 Capacitor 和 H5 应用构建了一个 Android 应用,这个 h5 是通过 uniapp 生成的。 https://blog.csdn.net/KimBing/article/details/134093769 这个应用的构成是这…

微机原理3

一、单项选择题(本大题共15小题,每小题3分,共45分。在每小题给出的四个备选项中,选出一个正确的答案。 1. 在机器数中,零的表示形式唯一的编码是() A. 原码 B. 补码 C.移码 D. 反码 2,用于定义常数、变量的内存空间分配和定位的是()。 A. 伪指令 B.机器指令…

(C++17) variant的使用与union对比

文章目录 前言与需求union内存映射图C11的union 使用ref示例构造普通构造置空emplacemonostate 访问std::get<>std::holds_alternative<>获取指针std::get_if<>获取可选数量个数std::variant_size END 前言与需求 联合体&#xff0c;是在C语言时代就存在的概…

『亚马逊云科技产品测评』活动征文|AWS 云服务器实例类型及其适用场景详细说明

授权声明&#xff1a;本篇文章授权活动官方亚马逊云科技文章转发、改写权&#xff0c;包括不限于在 Developer Centre, 知乎&#xff0c;自媒体平台&#xff0c;第三方开发者媒体等亚马逊云科技官方渠道 目录 一、AWS 定价计算器 &#xff08;1&#xff09;定价计算器官网 &…

Linux环境配置(云服务器)

目录 1.第一步&#xff1a;购买云服务器 2.第二步&#xff1a;下载Xshell 7 3.第三步&#xff1a;打开Xshell&#xff0c;登录云服务器 4.第四步&#xff1a;更加便捷的云服务器登录方式 1.第一步&#xff1a;购买云服务器 &#xff08;推荐&#xff1a;阿里云、华为云、腾…

机器视觉工程师注意,没有经历过公司倒闭看下文章,机器视觉公司即将要倒闭的征兆是什么?

很多机器视觉工程师没有经历过公司倒闭&#xff0c;谁也不想自己的公司倒闭&#xff0c;毕竟我们是打工人&#xff0c;拿固定工资的。 机器视觉公司即将要倒闭的征兆有哪些迹象​&#xff1f;​ 1、PM&#xff0c;机器视觉工程师频繁开会&#xff0c;甚至周末强制开会。 2.停…

P6入门:项目初始化1-项目详情介绍

前言 使用项目详细信息查看和编辑有关所选项目的详细信息&#xff0c;在项目创建完成后&#xff0c;初始化项目是一项非常重要的工作&#xff0c;涉及需要设置的内容包括项目名&#xff0c;ID,责任人&#xff0c;日历&#xff0c;预算&#xff0c;资金&#xff0c;分类码等等&…

Zigbee—网络层地址分配机制

&#x1f3ac;慕斯主页&#xff1a;修仙—别有洞天 ♈️今日夜电波&#xff1a;孤雏 0:21━━━━━━️&#x1f49f;──────── 4:14 &#x1f504; ◀️ ⏸ ▶️ ☰ &#x1f497;关注…

进行 “最佳价格查询器” 的开发

前置条件 public class Shop {private final String name;private final Random random;public Shop(String name) {this.name name;random new Random(name.charAt(0) * name.charAt(1) * name.charAt(2));}public double getPrice(String product) {return calculatePrice…

『 C++类与对象 』多继承与虚继承

文章目录 ⌨️多继承的概念语法 &#x1f5b1;️ ⌨️棱形继承⌨️虚继承虚继承是如何解决数据冗余和二义性的(不谈虚表概念)?&#x1f5b1;️ ⌨️多继承的概念 多继承指的是一个派生类是由多个基类继承而来的; 而在生活当中也有类似的例子:番茄既可以是水果,也可以是蔬菜;…

[100天算法】-面试题 17.11.单词距离(day 68)

题目描述 有个内含单词的超大文本文件&#xff0c;给定任意两个单词&#xff0c;找出在这个文件中这两个单词的最短距离(相隔单词数)。如果寻找过程在这个文件中会重复多次&#xff0c;而每次寻找的单词不同&#xff0c;你能对此优化吗?示例&#xff1a;输入&#xff1a;word…

华为Auth-Http Serve任意文件读取

1.漏洞描述 华为Auth-Http Server 1.0任意文件读取&#xff0c;攻击者可通过该漏洞读取任意文件。 2.网络资产查找 FOFA&#xff1a;server”Huawei Auth-Http Server 1.0” 2、部分界面如下 3、Poc /umweb/shadow 4、Poc批量验证 id: huanwei-auth-http-server-filereadi…

商业模式思维导图

一、什么是商业模式&#xff1f;简单的说&#xff0c;商业模式就是公司通过什么途径或方式来赚钱&#xff1f; 商业模式的核心是 创造价值-获取价值-传递价值。 它有3个重要的环节&#xff0c;创造价值是基于客户需求&#xff0c;提供解决方案&#xff0c;传递价值是通过资源配…

5个写自定义函数小练习

计算列表平均值、素数判定、反转字符串&#xff0c;查找整数列表最大最小值、统计字符串中元音字母个数(大小写字不敏感)。 (笔记模板由python脚本于2023年11月09日 21:50:35创建&#xff0c;本篇笔记适合熟悉Python函数及基本数据类型的coder翻阅) 【学习的细节是欢悦的历程】…

Python克隆单个网页

网上所有代码都无法完全克隆单个网页&#xff0c;不是Css&#xff0c;Js下载不下来就是下载下来也不能正常显示&#xff0c;只能自己写了&#xff0c;记得点赞~ 效果如图&#xff1a; 源码与所需的依赖&#xff1a; pip install requests pip install requests beautifulsoup4…

ThreadLocal原理以及内存泄露问题

1、ThreadLocal实现原理 1、每个线程中有一个ThreadLocalsMap&#xff0c;这是一个哈希表的结构里面有很多entry(也就是k-v)&#xff0c;当我们使用ThreadLocal进行set值的时候,会将这个threadLocal设置为key,然后值设置为value放入ThreadLocalsMap&#xff0c;key为弱引用&am…