当前位置: 首页 > news >正文

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量子机器学习速成(一)

声明:本篇笔记基于IBM Qiskit量子机器学习教程的第一节,中文版译文详见:https://blog.csdn.net/qq_33943772/article/details/129860346?spm1001.2014.3001.5501 概述 首先导入关键的包 from qiskit import QuantumCircuit from qiskit.u…...

音视频基础知识

图像(YUV RGB) ​​​​​​​​​​​​​​这个讲的比较好 RGB颜色编码 图像显示主要是由像素组成,每个像素点的颜色组成都是采用RGB格式,RGB就是红、绿、蓝,RGB分别取不同的值,展示不同的颜色。 YUV…...

ida81输入密码验证算法分析以及破解思路

本文分析了ida81对输入密码的验证流程,分别对输入密码到生成解密密钥、密码素材的生成过程以及文件数据的加密过程这三个流程进行分析,并尝试找一些可利用的破绽。很遗憾,由于水平有限,目前也只是有个思路未能完全实现&#xff0c…...

C语言——贪吃蛇

一. 游戏效果 贪吃蛇 二. 游戏背景 贪吃蛇是久负盛名的游戏,它也和俄罗斯⽅块,扫雷等游戏位列经典游戏的⾏列。 贪吃蛇起源于1977年的投币式墙壁游戏《Blockade》,后移植到各种平台上。具体如下: 起源。1977年,投币式…...

Android sqlite 使用简介

进行Android应用开发时经常会用到数据库。Android系统支持sqlite数据库,在app开发过程中很容易通过SQLiteOpenHelper使用数据库,SQLiteOpenHelper依赖于Context对象,但是基于uiatomator1.0和Java程序等无法获取Context的应用如何使用数据库呢…...

UE地形系统材质混合实现和Shader生成分析(UE5 5.2)

前言 随着电脑和手机硬件性能越来越高,游戏越来越追求大世界,而大世界非常核心的一环是地形系统,地形系统两大构成因素:高度和多材质混合,此篇文章介绍下UE4/UE5 地形的材质混合方案----基于WeightMap混合。 材质层 …...

Git分支与Git标签的介绍及其场景应用

目录 一、Git分支 1.1 定义 1.2 基本概念 1.3 特点与优势 1.4 Git分支操作命令 1.4.1 查看分支 1.4.2 创建分支 1.4.3 删除分支 1.4.4 切换分支 1.4.5 创建并切换到新建分支 1.5 场景应用 1.5.1 前期准备 1.5.2 具体操作 二、Git标签 2.1 定义 2.2 类型 2.3 标…...

Three.js——基于原生WebGL封装运行的三维引擎

文章目录 前言一、什么是WebGL?二、Three.js 特性 前言 Three.js中文官网 Three.js是基于原生WebGL封装运行的三维引擎,在所有WebGL引擎中,Three.js是国内文资料最多、使用最广泛的三维引擎。既然Threejs是一款WebGL三维引擎,那么…...

第八章认识Express框架

目录 Express模块化路由 基本概述 基本使用 基本构建 案例项目 Express接收请求参数 基本概述 基本类别 Express接收GET请求参数 Express接收POST请求参数 Express接收路由参数 Express模块化路由 基本概述 在Express中,路由是指确定应用程序如何响应对…...

【K8s集群离线安装-kubeadm】

1、kubeadm概述 kubeadm是官方社区推出的一个用于快速部署kubernetes集群的工具。这个工具能通过两条指令快速完成一个kubernetes集群的部署。 2、环境准备 2.1 软件环境 软件版本操作系统CentOS 7Docker19.03.13K8s1.23 2.2 服务器 最小硬件配置:2核CPU、2G内存…...

python工具CISCO ASA设备任意文件读取

​python漏洞利用 构造payload: /CSCOT/translation-table?typemst&textdomain/%2bCSCOE%2b/portal_inc.lua&default-language&lang../漏洞证明: 文笔生疏,措辞浅薄,望各位大佬不吝赐教,万分感谢。 免…...

TCP关闭的两种方法概述

一个TCP需要经过四次挥手才可以关闭连接&#xff0c;能够开启四次挥手的函数有两个&#xff1a; int close(int sockfd) int shutdown(int sockfd,int howto) 接下来就分别讲解一下这两个函数。 close()函数 函数原型 #include<unistd.h> int close(int sockfd)这个函…...

Git的Hooks机制

参考文章&#xff1a;详解如何在项目中使用git Hooks&#xff08;husky、yorkie&#xff09; git hooks钩子 git hooks是一些自定义的脚本&#xff0c;用于控制git工作的流程&#xff0c;分为客户端钩子和服务端钩子。  ~/work/step-time/ [master*] ll .git/hooks total…...

代码随想录算法训练营第四十九天|121. 买卖股票的最佳时机、122. 买卖股票的最佳时机 II

第九章 动态规划part10 121. 买卖股票的最佳时机 给定一个数组 prices &#xff0c;它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格。 你只能选择 某一天 买入这只股票&#xff0c;并选择在 未来的某一个不同的日子 卖出该股票。设计一个算法来计算你所能获取的最…...

Rust教程6:并发编程和线程通信

文章目录 线程初步join方法线程通信 Rust系列&#xff1a;初步⚙所有权⚙结构体和枚举类⚙函数进阶⚙泛型和特征 线程初步 在Rust中&#xff0c;开启多线程进行并发编程&#xff0c;只需调用thread::spawn&#xff0c;但这里有一个坑点&#xff0c;即spawn函数只有一个传入参…...

JVM在线分析-监控工具(jps, jstat, jstatd)

参考官方文档&#xff08;jdk11&#xff09; https://docs.oracle.com/en/java/javase/11/tools/troubleshooting-tools-and-commands.html#GUID-CB44BFBA-E5F9-4D80-8EE8-28E9F16BC451 1. 监控工具(jps, jstat, jstatd) jps -q Suppresses the output of the class name, J…...

Console LDAP 配置解密

之前通过短视频向大家介绍了 Console 如何集成 LDAP&#xff0c;但很多小伙伴反映按照视频里的配置后不成功。今天就结合小伙伴们反映的问题来跟大家详细介绍一下。 Console LDAP 完整的配置参数如下&#xff1a; 名称类型说明hoststringLDAP 服务器地址portintLDAP 服务器端口…...

node插件MongoDB(三)—— 库mongoose 的使用和数据类型(一)

前言 提示&#xff1a;使用mongoose 的前提是你安装了node和 MongoDB。 mongoose 官网文档&#xff1a;http://mongoosejs.net/docs/index.html 文章目录 前言一、安装二、基本使用1. 打开bin目录的mongod.exe文件2. 基本使用的代码&#xff08;连接mongodb 服务&#xff09;3.…...

基础(二)

基础&#xff08;二&#xff09; 字符串型 C风格&#xff1a;char 变量名[] “字符串值”&#xff1b; C风格&#xff1a;string 变量名 “字符串值” #include <iostream> using namespace std; #include <string>int main() {// C风格char str1[] "h…...

思维模型 目标效应

本系列文章 主要是 分享 思维模型&#xff0c;涉及各个领域&#xff0c;重在提升认知。明确目标&#xff0c;激发内在动机。 1 目标效应的应用 1.1 目标效应在教育领域的应用-棉花糖实验 美国斯坦福大学心理学系的教授米歇尔&#xff08;Walter Mischel&#xff09;曾经进行了…...

include-media插件生态:8个实用插件提升开发效率

include-media插件生态&#xff1a;8个实用插件提升开发效率 【免费下载链接】include-media &#x1f4d0; Simple, elegant and maintainable media queries in Sass 项目地址: https://gitcode.com/gh_mirrors/in/include-media include-media是一个功能强大的Sass媒…...

如何用Draw.io ECE库快速绘制专业电路图:免费电子工程绘图终极指南

如何用Draw.io ECE库快速绘制专业电路图&#xff1a;免费电子工程绘图终极指南 【免费下载链接】Draw-io-ECE Custom-made draw.io-shapes - in the form of an importable library - for drawing circuits and conceptual drawings in draw.io. 项目地址: https://gitcode.c…...

终极IDM永久激活解决方案:3种方法彻底解决试用期弹窗问题

终极IDM永久激活解决方案&#xff1a;3种方法彻底解决试用期弹窗问题 【免费下载链接】IDM-Activation-Script IDM Activation & Trail Reset Script 项目地址: https://gitcode.com/gh_mirrors/id/IDM-Activation-Script Internet Download Manager&#xff08;IDM…...

Loom响应式不是银弹:当Reactor延迟突增300ms,我们用Arthas+VirtualThread Dump定位到第7层CallStack的栈帧膨胀漏洞

第一章&#xff1a;Loom响应式不是银弹&#xff1a;当Reactor延迟突增300ms&#xff0c;我们用ArthasVirtualThread Dump定位到第7层CallStack的栈帧膨胀漏洞在一次灰度发布后&#xff0c;订单履约服务的P99延迟从85ms骤升至382ms&#xff0c;而CPU使用率仅维持在42%左右——典…...

Node.js 最佳实践终极指南:102个技巧助你构建高性能应用

Node.js 最佳实践终极指南&#xff1a;102个技巧助你构建高性能应用 【免费下载链接】nodebestpractices :white_check_mark: The Node.js best practices list (July 2024) 项目地址: https://gitcode.com/GitHub_Trending/no/nodebestpractices 前言&#xff1a;在Nod…...

3步破解限速难题:Mac版百度网盘极速方案深度解析

3步破解限速难题&#xff1a;Mac版百度网盘极速方案深度解析 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为Mac版百度网盘的龟速下载而苦恼&…...

Linux平台哔哩哔哩客户端终极指南:开源移植与完整功能体验

Linux平台哔哩哔哩客户端终极指南&#xff1a;开源移植与完整功能体验 【免费下载链接】bilibili-linux 基于哔哩哔哩官方客户端移植的Linux版本 支持漫游 项目地址: https://gitcode.com/gh_mirrors/bi/bilibili-linux 想在Linux系统上获得与Windows/macOS相同的哔哩哔…...

免费获取全球900+语言支持的Noto字体库:设计师与开发者的终极解决方案

免费获取全球900语言支持的Noto字体库&#xff1a;设计师与开发者的终极解决方案 【免费下载链接】noto-fonts Noto fonts, except for CJK and emoji 项目地址: https://gitcode.com/gh_mirrors/no/noto-fonts Noto字体库是谷歌开发的开源字体项目&#xff0c;旨在为全…...

3分钟搞定游戏手柄兼容性:用ViGEmBus让所有手柄在Windows上畅玩

3分钟搞定游戏手柄兼容性&#xff1a;用ViGEmBus让所有手柄在Windows上畅玩 【免费下载链接】ViGEmBus Windows kernel-mode driver emulating well-known USB game controllers. 项目地址: https://gitcode.com/gh_mirrors/vi/ViGEmBus 还在为心爱的手柄无法在Windows游…...

Pi0具身智能v1在仓储物流中的应用:一套代码实现自动分拣

Pi0具身智能v1在仓储物流中的应用&#xff1a;一套代码实现自动分拣 1. 物流分拣的现状与挑战 走进任何一家现代物流仓库&#xff0c;你都会看到相似的场景&#xff1a;传送带上的包裹川流不息&#xff0c;工人们快速分拣着各种形状和大小的物品。这种传统分拣方式虽然成熟&a…...