一个非常简单的变分量子分类器 (VQC)

一、说明

        在之前的帖子(这里和这里)中,我已经开始谈论 QML,为什么以及如何学习,从现在开始,我将开始分享我的研究和发现,到目前为止,这些都是非常基本的。

二、实验概述

        今天,我将设计一个变分量子分类器 (VQC),它是一个混合计算分类器,如图 1 所示。

图 1 — 混合计算图

        在这里,量子计算机配置了一个可参数化的量子电路,这与我们在经典分类问题(例如逻辑回归、SVM 等)中用作模型的数学函数相似。经典计算机负责进行优化,因此它设置电路参数,运行量子计算机,收集结果并根据损失函数细化参数。因此,这里唯一的区别是,我们没有使用我们的日常分类算法,而是使用量子电路作为模型(又名ansatz)。

        然而,尽管看起来很简单,但围绕这种混合计算架构存在挑战。正如我在第一篇文章中提到的,经典计算和量子计算有不同的范式,所以我们的量子电路必须有一些阶段。

图 2 — 量子电路的各个阶段

        特征图是电路的第一阶段,其中经典数据必须编码为量子比特。有很多编码方法,因为特征图是从向量空间到另一个向量空间(希尔伯特空间)的数学转换。研究人员一直在研究如何为每个问题找到最佳映射,即将映射本身变成优化问题。这是相当有趣的,因为一个好的映射意味着不同类的数据之间的良好分离,这大大简化了分类问题。Pennylane在这里和这里有一些有趣和基本的阅读材料。不幸的是,Qiskit已经弃用了aqua,但他们在这里也有一些功能图。

        我也想潜入并阅读这篇文章。

        在第二阶段,我们设计一个量子电路,它将成为我们的模型,在这里我们可以随心所欲地发挥创造力,但我们必须考虑到同样的旧规则仍然很重要:不要对简单的问题使用太多参数以避免过度拟合,也不要使用太少的参数来避免偏见,正如我们已经知道的那样。但最重要的是:既然我们使用的是量子计算,就必须使用叠加和纠缠,以便从量子计算范式中汲取精华。

        量子电路在某种程度上既简单又棘手,因为它们是线性变换,但作为组件化电路进行分析,这需要注意。正如我在上一篇文章中提到的,Frank Zickert的书和博客是我阅读的了解量子电路的最佳参考资料。

三、要解决问题

        在对VQC有基本的了解之后,在这篇文章中,我们将设计一个基于Kaggle的泰坦尼克号数据集的分类器。在那里,我们有关于乘客的信息,以及他们是否幸存下来。

        此数据集中的变量包括:

  • 乘客识别
  • 乘客姓名
  • 头等舱(一、二、三)
  • 年龄
  • SibSP(兄弟姐妹和/或配偶)
  • 帕奇(父母或孩子在船上)
  • 票价
  • 已启程
  • 幸存

        在这里,我们正在构建一个分类器,根据乘客的特征预测乘客是否幸存下来。我不打算深入研究功能分析和选择,因为这不是本文的重点,所以我将跳到选定的变量:

  • is_child(如果年龄<12)
  • is_class1(如果人是头等舱)
  • is_class2
  • is_female

        基本上,头等舱的儿童和妇女的存活率更高。此外,第二类和第三类的存活率下降。这里所有的变量都是布尔值,这很好,因为这是一个非常简单的模型,这也将大大简化我们的特征图选择。

四、要素嵌入和映射

        我认为这篇Pennylane文章是对量子嵌入的一个非常好的介绍,因为它表明不同的方法有内在的优缺点。基嵌入可能是最简单的嵌入,但同时在量子比特方面可能代价高昂。振幅嵌入提供了重要的量子位节省,但它可能具有压缩的向量空间和类之间的不良分离。

        由于我们只使用四个变量,为了简单起见,我将使用基础嵌入,而无需进一步的映射电路。

        在这种情况下,我们只需将经典位转换为其等效量子比特。因此,如果我们的四个变量是 1010,这将转换为 |1010>。

五、模特(安萨茨)

        ansatz是设计为我们模型的可参数化量子电路。正如我之前提到的,这个电路必须具有一定程度的叠加和纠缠,才能证明在我们的项目中使用量子器件是合理的。

        所选电路如图所示:

图 3 — 泰坦尼克号分类器的安萨茨

        这是我从Pennylane的例子中获取的常见电路。如果你没有研究过量子电路,它可能看起来很复杂,但这个想法相当简单。这是一个两层电路,因为核心结构重复了2次。首先,我们对每个量子比特围绕 Z、Y 和 Z 轴旋转,这里的想法是分别在每个量子比特上插入一定程度的叠加。这些旋转是参数化的,在算法的每次交互中,这些参数将由经典计算机更新。此外,我们谈论的是 Y 轴和 Z 轴上的旋转,因为量子比特的矢量空间是一个球体(布洛赫球体)。RZ 只会改变量子比特相位,RY 会影响量子比特与 |0> 和 |1> 的接近程度。

        之后,我们在每对量子比特之间有四个受控非(CNOT)状态,这是一个量子门,根据另一个量子比特的状态(分别为目标和控制)反转量子比特状态。因此,这个门纠缠了我们电路中的所有量子位,现在所有状态都被纠缠在一起。在第二层中,我们应用了一组新的旋转,这不仅仅是第一层的逻辑重复,因为现在所有状态都纠缠在一起,这意味着旋转第一个量子比特也会影响其他量子比特!最后,我们有一套新的 CNOT 门。

        这是对我们电路的一个非常简单的解释,但通过一些研究和实践,这些概念会对你来说很直观(我承认我仍然在这个学习过程中!

六、优化

        在这个项目中,我使用的是Pennylane的Adam Optimizer(在上一篇文章中,我说我正在使用Qiskit,但是我对已弃用的函数有一些问题,所以我回到了Pennylane)。我测试了学习率,直到找到一个平滑收敛到我们最佳水平的学习率。

七、代码和结果

        我使用带有量子比特模拟器的Pennylane实现了代码。我承认我从教程中获得了代码的大部分量子部分,并在优化器中进行了一些更改,因为原始代码使用了 Nesterov 动量优化器,并且我与 Adam 有更好的结果和收敛。

import pennylane as qml
from pennylane import numpy as np
from pennylane.optimize import AdamOptimizerfrom sklearn.model_selection import train_test_split
import pandas as pdfrom sklearn.metrics import accuracy_score
from sklearn.metrics import f1_score
from sklearn.metrics import precision_score
from sklearn.metrics import recall_scoreimport mathnum_qubits = 4
num_layers = 2dev = qml.device("default.qubit", wires=num_qubits)# quantum circuit functions
def statepreparation(x):qml.BasisEmbedding(x, wires=range(0, num_qubits))def layer(W):qml.Rot(W[0, 0], W[0, 1], W[0, 2], wires=0)qml.Rot(W[1, 0], W[1, 1], W[1, 2], wires=1)qml.Rot(W[2, 0], W[2, 1], W[2, 2], wires=2)qml.Rot(W[3, 0], W[3, 1], W[3, 2], wires=3)qml.CNOT(wires=[0, 1])qml.CNOT(wires=[1, 2])qml.CNOT(wires=[2, 3])qml.CNOT(wires=[3, 0])@qml.qnode(dev, interface="autograd")
def circuit(weights, x):statepreparation(x)for W in weights:layer(W)return qml.expval(qml.PauliZ(0))def variational_classifier(weights, bias, x):return circuit(weights, x) + biasdef square_loss(labels, predictions):loss = 0for l, p in zip(labels, predictions):loss = loss + (l - p) ** 2loss = loss / len(labels)return lossdef accuracy(labels, predictions):loss = 0for l, p in zip(labels, predictions):if abs(l - p) < 1e-5:loss = loss + 1loss = loss / len(labels)return lossdef cost(weights, bias, X, Y):predictions = [variational_classifier(weights, bias, x) for x in X]return square_loss(Y, predictions)# preparaing data
df_train = pd.read_csv('train.csv')df_train['Pclass'] = df_train['Pclass'].astype(str)df_train = pd.concat([df_train, pd.get_dummies(df_train[['Pclass', 'Sex', 'Embarked']])], axis=1)# I will fill missings with the median
df_train['Age'] = df_train['Age'].fillna(df_train['Age'].median())df_train['is_child'] = df_train['Age'].map(lambda x: 1 if x < 12 else 0)
cols_model = ['is_child', 'Pclass_1', 'Pclass_2', 'Sex_female']X_train, X_test, y_train, y_test = train_test_split(df_train[cols_model], df_train['Survived'], test_size=0.10, random_state=42, stratify=df_train['Survived'])X_train = np.array(X_train.values, requires_grad=False)
Y_train = np.array(y_train.values * 2 - np.ones(len(y_train)), requires_grad=False)# setting init params
np.random.seed(0)
weights_init = 0.01 * np.random.randn(num_layers, num_qubits, 3, requires_grad=True)
bias_init = np.array(0.0, requires_grad=True)opt = AdamOptimizer(0.125)
num_it = 70
batch_size = math.floor(len(X_train)/num_it)weights = weights_init
bias = bias_init
for it in range(num_it):# Update the weights by one optimizer stepbatch_index = np.random.randint(0, len(X_train), (batch_size,))X_batch = X_train[batch_index]Y_batch = Y_train[batch_index]weights, bias, _, _ = opt.step(cost, weights, bias, X_batch, Y_batch)# Compute accuracypredictions = [np.sign(variational_classifier(weights, bias, x)) for x in X_train]acc = accuracy(Y_train, predictions)print("Iter: {:5d} | Cost: {:0.7f} | Accuracy: {:0.7f} ".format(it + 1, cost(weights, bias, X_train, Y_train), acc))X_test = np.array(X_test.values, requires_grad=False)
Y_test = np.array(y_test.values * 2 - np.ones(len(y_test)), requires_grad=False)predictions = [np.sign(variational_classifier(weights, bias, x)) for x in X_test]accuracy_score(Y_test, predictions)
precision_score(Y_test, predictions)
recall_score(Y_test, predictions)
f1_score(Y_test, predictions, average='macro')

        我还做了一些测试,改变了我们的ansatz中的层数,似乎2层是我们在这里的最佳结果。对于一层,我们没有第二个旋转,这会产生纠缠的超位,这导致了偏差,因为我们的模型预测的结果总是相同的(不是存活的,大多数目标类),并且对于更多的层,我没有更好的结果,主要是因为我们的问题很简单,更多的参数会导致我们过度拟合。

        我们的模型有以下结果:

  •         准确度:78.89%
  •         精度: 76.67%
  •         召回率:65.71%
  •         F1: 77.12%

        这些都是可靠的结果,模型是预测而不是猜测大多数结果。但是我们可以将我们的VQC与经典算法进行比较,所以我训练了一个逻辑回归,并得到了以下结果:

  •         准确度:75.56%
    •         精度: 69.70%
      •         召回率:65.71%
        •         F1: 74.00%

        我们的VQC性能略好于逻辑回归模型!好吧,这并不意味着 VQC 一定更好,只是这个具有特定优化过程的特定模型表现得更好。但这篇文章的主要思想是表明构建量子分类器很简单,尽管这没什么了不起的,但这是对 QML 的简单有效的使用。马修斯·卡马罗萨诺·伊达尔戈

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【C++设计模式之命令模式:行为型】分析及示例

简介 命令模式是一种行为型设计模式&#xff0c;它将请求封装成一个对象&#xff0c;从而使不同的请求可以被参数化、队列化或记录化。这种模式允许请求的发送者和接收者进行解耦&#xff0c;同时提供更高的灵活性和可扩展性。 描述 命令模式的核心思想是通过命令对象来封装…

Mysql内置函数、复合查询和内外连笔记

目录 一、mysql内置函数 1.1.日期函数 1.2.字符串函数 1.3.数学函数 1.4.其他函数 二、复合查询 2.2 自连接 2.3 子查询 2.3.1单行自查询 2.3.2 多行子查询 2.3.3 多列子查询 2.3.4在from子句中使用子查询 2.3.5合并查询 三、表的内连和外连 3.1内连接 3.2外连接…

LabVIEW利用以太网开发智能液位检测仪

LabVIEW利用以太网开发智能液位检测仪 目前&#xff0c;工业以太网接口在国内外的发展已经达到了相当深入的程度&#xff0c;特别是在自动化控制和工业控制领域有着非常广泛的应用。在工业生产过程中&#xff0c;钢厂的连铸机是前后的连接环节&#xff0c;其中钢水从大钢包进入…

【云笔记篇】Microsoft OneNote笔记分区数据删除方法

【云笔记篇】Microsoft OneNote笔记分区数据删除方法 Microsoft OneNote删除分区数据需要在网页端操作才能彻底删除—【蘇小沐】 1、实验 系统版本Windows 11 专业工作站版22H2&#xff08;22621.1485&#xff09;&#xff1b;OneNoteOneNote 2016(版本 2303 Build 16.0.162…

苹果系统_安装matplotlib__pygame,以pycharm导入模块

为了更便捷、连贯的进行python编程学习&#xff0c;尽量在开始安装python软件时&#xff0c;将编辑器、模块一并安装好&#xff0c;这样能避免以后版本冲突的问题。小白在开始安装pycharm、pip、matplotlib往往会遇到一些问题&#xff0c;文中列示其中部分bug&#xff0c;供大家…

BLIP2模型加载在不同设备上

背景 现在大语言模型越来越大&#xff0c;占用的内存越来越多&#xff0c;这导致内存较小的设备无法体验大模型的效果。transformer提供了将一个大模型分别加载在gpu和cpu上的方法。 加载方法 以多模态模型BLIP2为例&#xff0c;将其语言模型放在gpu上&#xff0c;其余部分放…

C++ day2

自己封装一个矩形类(Rect)&#xff0c;拥有私有属性:宽度(width)、高度(height)&#xff0c; 定义公有成员函数: 初始化函数:void init(int w, int h) 更改宽度的函数:set_w(int w) 更改高度的函数:set_h(int h) 输出该矩形的周长和面积函数:void show() #include <ios…

创作2周年?浅记一下~

前言&#xff1a; 最近确实有点缺乏去更新博客的动力&#xff0c;一晃两年过去了&#xff0c;其实也是我新入职公司的两年&#xff0c;两年虽然不长&#xff0c;但是确实发生了太多事情值得去记录下来... 机缘 说是机缘也不是算是&#xff0c;第一次写博客是刚好在CSDN里面查资…

MyBatisPlus(十一)包含查询:in

说明 包含查询&#xff0c;对应SQL语句中的 in 语句&#xff0c;查询参数包含在入参列表之内的数据。 in Testvoid inNonEmptyList() {// 非空列表&#xff0c;作为参数List<Integer> ages Stream.of(18, 20, 22).collect(Collectors.toList());in(ages);}Testvoid in…

四位十进制频率计VHDL,DE1开发板验证,仿真和源码

名称&#xff1a;四位十进制频率计VHDL&#xff0c;DE1开发板验证 软件&#xff1a;Quartus 语言&#xff1a;VHDL 要求&#xff1a; 数字频率计设计要求 1、四位十进制数字显示的数学式频率计,其频率测量范围为10~9999khz,测量单位为kHz。 2、要求量程能够转换。即测几十…

网工内推 | IT高级运维工程师,周末双休,包吃包住,14-20k

01 深圳朗特智能控制股份有限公司 招聘岗位&#xff1a;IT高级运维工程师 职责描述&#xff1a; 1、对集团网络基础架构的建设、运维、安全制定相关标准和准则&#xff1b; 2、负责集团数据中心、核心设备、信息安全的管理和运维&#xff1b; 3、执行网络、服务器、核心交换机…

HTML开篇之安装VSvode(用记事本编辑HTML)

文章目录 前端开篇开篇知识点讲解1.HTML 结构1.1认识 HTML 标签1.2HTML 文件基本结构1.3标签层次结构1.4快速生成代码框架1.5用记事本写HTML1.6前端开发工具1.7下载vscode 及使用教学 大家好&#xff0c;我是晓星航。今天为大家带来的是 HTML 相关的讲解&#xff01;&#x1f6…