量子机器学习--学习笔记


量子计算和机器学习

量子机器学习是量子信息(quantum information)领域内的新兴的子领域,其将量子计算的速度和机器学习所提供的学习和适应能力结合到了一起。


关于量子机器学习的分类

机器学习与量子物理结合主要分为两类,一个是机器学习算法被用来探索量子多体物理中许多难于解析分析的问题;另一个是利用量子状态的叠加和量子算法的加速,来解决当前数据科学中数据量巨大,训练过程缓慢的困难。但从经典–量子的二元概念出发,可以将机器学习问题按照数据和算法类型的不同分为4类,如下表:

简称算法类型数据类型应用举例
C – C经典经典传统机器学习
C – Q经典量子用机器学习解决量子多体物理问题; 量子优化控制
Q – C量子经典量子支持向量机等
Q – Q量子量子量子反馈控制

量子系统控制中的一个基本问题是对控制对象的建模,即对系统的哈密顿量以及确定扰动,噪声等参数特征进行辨识,这些问题都属于C–Q的范畴。例如,研究人员提出使用贝叶斯推断中的似然函数对量子系统的哈密顿量进行学习,并进行了实验验证,结果表明学习算法具有一定的鲁棒性,即使假设模型结构中有缺项,学习结果仍是实际模型的最佳近似。
基于一定量的量子测量数据出发判断和确定其未知量子态的性质,例如如何判别一个量子态是分离还是纠缠的,也可以看作一类机器学习问题。研究人员提出用监督式学习的方法对量子态做分类,容易理解,直接使用量子模型,量子数据的全量子方式,其分类正确率比使用经典模型和经过量子随机存储器 (quantum random access memory, QRAM) 调用转换的量子数据的半经典方式更高。其后,他们提出不需要使用QRAM的量子态分类方法,且算法所需的经典存储器规模仅随训练比特数以对数速度增长。此外,他们还专门研究了光子相干态的分类问题,发现对训练样本和反射信号进行联合全局测量,比先对训练集进行基于高斯测量的幅值估计,再对反射信号进行状态判别的识别率要高。对于量子系统演化所对应的酉变换,如何从有限样本集中进行辨识学习,也是一个重要的问题。该问题可以归结为一个双重优化问题,同时需要最优输入态和最优测量。近年来,也有学者开始着手于研究用机器学习方法获取量子系统的属性和统计参数,如相变点,期望值等。该思想也可用于量子多体系统的模拟问题。
利用量子理论改进机器学习(Q–C)的方法大致可以分为两种:1) 通过量子算法使某些在经典计算机上不可计算的问题变为可计算的,从而大幅降低机器学习算法的计算复杂度,如量子退火(quantum annealing, QA)算法、Gibbs采样等;2) 量子理论的并行性等加速特点直接与某些机器学习算法深度结合,催生出一批全新的量子机器学习模型,如张量网络、概率图模型(probabilistic graphical model, PGM)等。


预备知识


量子比特

比特是经典计算和经典信息的基本概念,而量子计算和量子信息建立在量子比特的基础上。

经典比特量子比特
0 ∣ 0 ⟩ \rvert0\rangle 0
1 ∣ 1 ⟩ \rvert1\rangle 1

一般规定 ∣ 0 ⟩ = [ 1 0 ] \rvert0\rangle=\begin{bmatrix}1\\0 \end{bmatrix} 0=[10] ∣ 1 ⟩ = [ 0 1 ] \rvert1\rangle=\begin{bmatrix}0\\1 \end{bmatrix} 1=[01],它们构成一组标准正交基,量子计算中通常称作计算基。任意量子态 ∣ ψ ⟩ \rvert\psi\rangle ψ和可表示为 ∣ 0 ⟩ \rvert0\rangle 0 ∣ 1 ⟩ \rvert1\rangle 1的线性组合,即 ∣ ψ ⟩ = α ∣ 0 ⟩ + β ∣ 1 ⟩ = [ α β ] \rvert\psi\rangle=\alpha\rvert0\rangle+\beta\rvert1\rangle=\begin{bmatrix}\alpha\\\beta \end{bmatrix} ψ=α0+β1=[αβ],其中系数 α \alpha α β \beta β为复数, ∣ α ∣ 2 |\alpha|^2 α2表示量子比特观测 ∣ 0 ⟩ \rvert0\rangle 0时的概率, ∣ β ∣ 2 |\beta|^2 β2表示量子比特观测 ∣ 1 ⟩ \rvert1\rangle 1时的概率,并且有 ∣ α ∣ 2 + ∣ β ∣ 2 = 1 |\alpha|^2+|\beta|^2=1 α2+β2=1

量子态 ∣ ψ ⟩ \rvert\psi\rangle ψ被称为一个量子比特或量子位。量子态具有叠加性质,即 ∣ ψ ⟩ \rvert\psi\rangle ψ处于 ∣ 0 ⟩ \rvert0\rangle 0 ∣ 1 ⟩ \rvert1\rangle 1任意的叠加态,而一个经典比特只能是0或者1 。

量子比特的几何图像

已知概率幅 α \alpha α β \beta β为复数,设 α = a 1 + a 2 i \alpha=a_{1}+a_{2}i α=a1+a2i β = b 1 + b 2 i \beta=b_{1}+b_{2}i β=b1+b2i,设 a 0 a_{0} a0 b 0 b_{0} b0分别为 α \alpha α β \beta β的模长,对应的幅角分别为 ϕ a \phi_{a} ϕa ϕ b \phi_{b} ϕb
则有 a 0 = a 1 2 + a 2 2 a_{0}=\sqrt{a_{1}^2+a_{2}^2} a0=a12+a22 b 0 = b 1 2 + b 2 2 b_{0}=\sqrt{b_{1}^2+b_{2}^2} b0=b12+b22 ,且 a 0 2 + b 0 2 = 1 a_{0}^2+b_{0}^2=1 a02+b02=1
∣ ψ ⟩ = a 0 e i ϕ a ∣ 0 ⟩ + b 0 e i ϕ b ∣ 1 ⟩ \rvert\psi\rangle=a_{0}e^{i\phi_{a}}\rvert0\rangle+b_{0}e^{i\phi_{b}}\rvert1\rangle ψ=a0eiϕa0+b0eiϕb1 = e i ϕ a ( a 0 ∣ 0 ⟩ + b 0 e i ( ϕ b − ϕ a ) ∣ 1 ⟩ ) =e^{i\phi_{a}}(a_{0}\rvert0\rangle+b_{0}e^{i(\phi_{b}-\phi_{a})}\rvert1\rangle) =eiϕa(a00+b0ei(ϕbϕa)1)
ϕ = ϕ b − ϕ a \phi=\phi_{b}-\phi_{a} ϕ=ϕbϕa,并忽略整体相位因子 e i ϕ a e^{i\phi_{a}} eiϕa,因为它不能引起任何可观测的效应,因此可以写出其等效形式:
∣ ψ ⟩ = a 0 ∣ 0 ⟩ + b 0 e i ϕ ∣ 1 ⟩ \rvert\psi\rangle=a_{0}\rvert0\rangle+b_{0}e^{i\phi}\rvert1\rangle ψ=a00+b0eiϕ1
a 0 2 + b 0 2 = 1 a_{0}^2+b_{0}^2=1 a02+b02=1,令 a 0 = cos ⁡ θ 2 a_{0}=\cos\frac{ \theta}{2} a0=cos2θ b 0 = sin ⁡ θ 2 b_{0}=\sin\frac{ \theta}{2} b0=sin2θ,则
∣ ψ ⟩ = cos ⁡ θ 2 ∣ 0 ⟩ + e i ϕ sin ⁡ θ 2 ∣ 1 ⟩ \rvert\psi\rangle=\cos\frac{ \theta}{2}\rvert0\rangle+e^{i\phi}\sin\frac{ \theta}{2}\rvert1\rangle ψ=cos2θ0+eiϕsin2θ1
∣ ψ ⟩ = [ cos ⁡ θ 2 e i ϕ sin ⁡ θ 2 ] \rvert\psi\rangle=\begin{bmatrix}\cos\frac{ \theta}{2}\\e^{i\phi}\sin\frac{ \theta}{2} \end{bmatrix} ψ=[cos2θeiϕsin2θ]

量子比特的几何图像的代码实现

使用Qiskit库来实现Bloch球的可视化,由于Qiskit没有提供将 ( θ , ϕ ) (\theta,\phi) (θ,ϕ)直接转化成Bloch球的方法,所以需要转化成对应的球坐标

import numpy as np
from qiskit.visualization import plot_bloch_vector

def sph2cart(theta, phi):
    # theta: polar angle
    # phi : azimuthal angle
    x = np.sin(theta)*np.cos(phi)
    y = np.sin(theta)*np.sin(phi)
    z = np.cos(theta)
    return x,y,z

θ = π 2 \theta=\frac{ \pi}{2} θ=2π ϕ = π \phi=\pi ϕ=π

theta = np.pi/2
phi = np.pi
x,y,z = sph2cart(theta, phi)

请添加图片描述

同样,在 θ = 0 \theta=0 θ=0 ϕ = 0 \phi=0 ϕ=0 时,得到
请添加图片描述


逻辑门

介绍几个典型的单量子和多量子比特门

Paul-X

类似经典电路中的非门,当 X X X 门作用于矢态为 ∣ 0 ⟩ \rvert0\rangle 0的量子比特时,如下:

X ∣ 0 ⟩ = ∣ 1 ⟩ X\rvert0\rangle=\rvert1\rangle X0=1

其中 X X X 门可以用矩阵表示:

X = [ 0 1 1 0 ] X=\begin{bmatrix}0 & 1 \\1& 0 \end{bmatrix} X=[0110]

需要特别说明,表示单量子门的矩阵 U U U 需要满足酉性条件,即 U † U = I U^\dagger U=I UU=I,其中 U † U^\dagger U U U U的共轭转置(取 U U U的转置,再取复共轭)

Paul-Z

Z Z Z 门作用于矢态 ∣ 0 ⟩ \rvert0\rangle 0时,保持不变;作用于 ∣ 1 ⟩ \rvert1\rangle 1时,翻转 ∣ 1 ⟩ \rvert1\rangle 1的符号变为- ∣ 1 ⟩ \rvert1\rangle 1,如下:

Z ∣ 0 ⟩ = ∣ 0 ⟩ Z\rvert0\rangle=\rvert0\rangle Z0=0

Z ∣ 1 ⟩ = − ∣ 1 ⟩ Z\rvert1\rangle=-\rvert1\rangle Z1=1

其中 Z Z Z 门可以用矩阵表示:

Z = [ 1 0 0 − 1 ] Z=\begin{bmatrix}1 & 0 \\0& -1 \end{bmatrix} Z=[1001]

Hadamard gate (H)

Hadamard门,使量子比特状态转化为叠加态,例如当前量子比特的矢态为 ∣ 0 ⟩ \rvert0\rangle 0,通过 H H H 门操作后,如下:

H ∣ 0 ⟩ = 1 2 ∣ 0 ⟩ + 1 2 ∣ 1 ⟩ H\rvert0\rangle=\frac{1}{\sqrt{2}}\rvert0\rangle+\frac{1}{\sqrt{2}}\rvert1\rangle H0=2 10+2 11

其中 H H H 门可以用矩阵表示:

H = 1 2 [ 1 1 1 − 1 ] H=\frac{1}{\sqrt{2}}\begin{bmatrix}1 &1 \\1& -1 \end{bmatrix} H=2 1[1111]

H ∣ 0 ⟩ = 1 2 [ 1 1 1 − 1 ] [ 1 0 ] = [ 1 2 0 ] + [ 0 1 2 ] = [ 1 2 1 2 ] = 1 2 ∣ 0 ⟩ + 1 2 ∣ 1 ⟩ H\rvert0\rangle=\frac{1}{\sqrt{2}}\begin{bmatrix}1 &1 \\1& -1 \end{bmatrix}\begin{bmatrix}1 \\0 \end{bmatrix}=\begin{bmatrix}\frac{1}{\sqrt{2}} \\0 \end{bmatrix}+\begin{bmatrix}0 \\\frac{1}{\sqrt{2}} \end{bmatrix}=\begin{bmatrix}\frac{1}{\sqrt{2}} \\\frac{1}{\sqrt{2}} \end{bmatrix}=\frac{1}{\sqrt{2}}\rvert0\rangle+\frac{1}{\sqrt{2}}\rvert1\rangle H0=2 1[1111][10]=[2 10]+[02 1]=[2 12 1]=2 10+2 11

其中 ∣ 0 ⟩ \rvert0\rangle 0通过 H H H 门后状态为 ∣ 0 ⟩ \rvert0\rangle 0 ∣ 1 ⟩ \rvert1\rangle 1的叠加,且理论上取 ∣ 0 ⟩ \rvert0\rangle 0 ∣ 1 ⟩ \rvert1\rangle 1的概率相等。

Controlled Not gate (CNOT)

受控非门, C N O T ∣ q 0 q 1 ⟩ CNOT\rvert q_{0}q_{1}\rangle CNOTq0q1中, q 0 q_{0} q0称为控制位。 q 1 q_{1} q1称为目标位,若 q 0 q_{0} q0 ∣ 0 ⟩ \rvert0\rangle 0时, q 1 q_{1} q1不变;若 q 0 q_{0} q0 ∣ 1 ⟩ \rvert1\rangle 1时, q 1 q_{1} q1取反。
例如:
C N O T ∣ 01 ⟩ = ∣ 01 ⟩ CNOT\rvert 01\rangle=\rvert 01\rangle CNOT01=01
C N O T ∣ 11 ⟩ = ∣ 10 ⟩ CNOT\rvert 11\rangle=\rvert 10\rangle CNOT11=10

其中 C N O T CNOT CNOT的矩阵形式可以表示为:

C N O T = [ 1 0 0 0 0 0 0 1 0 0 1 0 0 1 0 0 ] CNOT=\begin{bmatrix}1 &0 &0&0\\0&0&0&1\\0&0&1&0\\0&1&0&0\end{bmatrix} CNOT=1000000100100100

C N O T CNOT CNOT 门可以使两个量子比特之间相位纠缠(两个量子比特之间存在相关性),无论两个量子比特之间距离多远,如果知道其中一个量子比特的状态,另外一个量子比特的状态也可以通过量子电路推理出来。

另外,任何多量子比特逻辑门可以由受控非门和单量子门组成。


量子电路

量子电路的代码实现

H H H 门为例,构建量子电路并观测它的结果

from qiskit import QuantumRegister, ClassicalRegister, QuantumCircuit, execute, IBMQ

# 第一种方式
#初始化一个1量子位寄存器和1位经典寄存器
q = QuantumRegister(1)
c = ClassicalRegister(1)
#创建量子电路
circ = QuantumCircuit(q,c)
# 应用 hadamard gate 到所有的量子比特上
circ.h(q) 
# 观测所有的量子比特
circ.measure(q,c) 

# 第二种方式
# 创建包含1个量子比特的量子电路
circ = QuantumCircuit(1,1)
# 在qubit0上添加一个H门,使量子位形成叠加态
circ.h(0)
# 通过测量,将量子比特映射到经典比特上
circ.measure(range(1),range(1))

得到的量子电路如下:
请添加图片描述
接下来对量子电路结果进行观测

IBMQ.enable_account('Insert API token here')
provider = IBMQ.get_provider(hub='ibm-q')

backend = provider.get_backend('ibmq_qasm_simulator')

# 在qasm模拟器上执行电路
# 将电路重复执行次数设置为1024,也是默认值
job = execute(circ, backend, shots=1024)
# 从job中获取结果
result = job.result()
# 一旦有了结果对象后,就可以通过函数get_counts()获取次数,将会得到提交电路的聚合二元结果。
counts = result.get_counts(circ)

将观测结果在直方图上展示,如下:
请添加图片描述

由此可见,量子比特通过 H H H 门后状态为 ∣ 0 ⟩ \rvert0\rangle 0 ∣ 1 ⟩ \rvert1\rangle 1的叠加,在理论上取 ∣ 0 ⟩ \rvert0\rangle 0 ∣ 1 ⟩ \rvert1\rangle 1的概率相等,但在现实机器测量中,也会因为各种因素的干扰会导致 ∣ 0 ⟩ \rvert0\rangle 0 ∣ 1 ⟩ \rvert1\rangle 1出现的概率不相等。

量子程序的编译

量子程序一般是通过量子电路来实现的,所以一定程度上,两者可以看作是等价的。

  1. 构建量子电路并生成有向无环图(DAG)
    DAG图能够很好的表示量子门的执行顺序,并且很好的体现多个量子门之间是否存在先后的依赖关系。

  2. 初始化量子比特映射(Layout)
    通常一个好的量子比特初始化映射,可以减少之后交换操作的使用,提高整体的保真度。
    常见的方法,例如IBM的TrivialLayout、DenseLayout、NoiseAdaptiveLayout、CustomLayout;另外还可以利用量子电路的可逆性,两次映射得到较好的量子初始映射。

  3. 量子比特映射位置的交换(Swap Mapping/Routing)
    例如Qiskit中的三种算法:BasicSwap、LookaheadSwap、StochasticSwap

  4. 量子线路的优化(Consolidate Block)
    例如将使用的量子门替换为目标硬件支持的量子门;将几个可以合并的量子门进行合并成一个Block;用运行效率高的量子门替换运行效率低的量子门等。当量子程序规模加大时,对于量子电路的优化就会愈加重要。


数据的量子化表示

量子机器学习的训练数据必须以某种可以为量子计算机识别的格式载入,经过量子机器学习算法处理以后形成输出,而此时的输出结果是量子格式的,需要经过测量读出最终结果。

量子态制备
量子算法
测量读出
经典数据样本
量子数据输入
量子数据输出
经典数据结果

因此,量子机器学习的复杂度与这3个过程都有关系。一般来说,基于量子相位估计的学习算法可以实现算法的指数加速,但是对数据的载入和完整结果的读出要求很高,而基于量子搜索的算法相对较复杂,但是数据的读入读出则相对比较容易。

数据的量子化表示一般分为数字型和模拟型:

对数字型而言,由于数字计算机中的所有数据都是有限字长,假设某训练数据向量为 x ⃗ = [ x 1 ⋅ ⋅ ⋅ x n ] \vec{x}=[x_{1} ··· x_{n}] x =[x1xn],若每个元素都用长度为 m m m的二进制数据表示,则整个向量需要 n ⋅ m n·m nm个比特,在量子计算机中对应于 N = n ⋅ m N=n·m N=nm个量子位。每个数据向量都对应于输入希尔伯特空间中的一个基矢 ∣ x ⃗ ⟩ \rvert\vec{x}\rangle x (量子化的过程),类似的,输出数据向量 y ⃗ = [ y 1 ⋅ ⋅ ⋅ y n ] \vec{y}=[y_{1} ··· y_{n}] y =[y1yn]也可以用适当长度的二进制数表示,并通过量子化对应于输出态希尔伯特空间的一个基矢,这种表示通过冯诺伊曼投影测量即可进行读出。

对于模拟型而言,训练数据用半模拟的方式编码在量子态上。某训练数据向量 x ⃗ = [ x 1 ⋅ ⋅ ⋅ x n ] \vec{x}=[x_{1} ··· x_{n}] x =[x1xn]已经归一化,则可以用 l o g ( n ) log(n) log(n)个比特,其中数据分量对应于用叠加态 x ⃗ = ∑ k = 1 n x k ∣ k ⟩ \vec{x}=\displaystyle\sum\limits_{k=1}^n x_{k}\rvert k\rangle x =k=1nxkk中各基矢的概率幅系数。

量子数据集的转换

从经典数据到量子数据的转换,需要通过存储器来实现。

对于数字型数据,其实对应于一个量子化的数字逻辑电路,即一个量子子程序,通过执行该子程序将寄存器的状态制备到训练数据对应的状态。这个子程序是模块化的,由于在机器学习中会经常随机抽取或者检索该数据集中的数据,因此它的功能可以类似于数据库供Grover算法调用,而调用的次数则成为衡量机器学习算法复杂度的重要指标之一。这类存储器具有专用名称—量子关联存储器(quantum associative memory,QAM)。

对于模拟型量子数据,虽然是最节省资源的存储方式,但是从物理实现的角度上,需要对量子寄存器进行精确地状态制备和存储,利用所谓的QRAM调用。

冯诺伊曼投影测量


量子计算的加速方法

相位估计

假设酉算子 U U U对应于特征向量 ∣ u ⟩ \rvert u\rangle u的特征值为 e 2 π i φ e^{2\pi i\varphi} e2πiφ,其中 φ \varphi φ是未知的,相位估计算法的目标就是估计 φ \varphi φ的值。在进行估计时,我们假设一个可用的黑盒,可以制备态 ∣ u ⟩ \rvert u\rangle u及执行受控 U 2 j U^{2^j} U2j操作(其中 j j j是非负整数)。黑盒的使用表明相位估计过程本身不是一个完整的量子算法,而是一种和其他子程序结合后,可以完成计算任务的子程序或者模块。
量子傅里叶变换:
相位估计中的关键部分是量子傅里叶变换。离散傅立叶变换是把一组长度为 N N N的复向量 [ x 0 ⋅ ⋅ ⋅ x N − 1 ] [x_{0} ··· x_{N-1}] [x0xN1]变换为 [ y 0 ⋅ ⋅ ⋅ y N − 1 ] [y_{0} ··· y_{N-1}] [y0yN1],其中
y k = 1 N ∑ j = 0 N − 1 x j e 2 π i j k / N y_{k}=\frac{1}{\sqrt{N}}\displaystyle\sum\limits_{j=0}^{N-1} x_{j}e^{2\pi ijk/N} yk=N 1j=0N1xje2πijk/N

类似地,量子傅里叶变换是一个线性的酉变换,即定义在一组标准正交基 ∣ 0 ⟩ , ⋅ ⋅ ⋅ , ∣ N − 1 ⟩ \rvert 0\rangle,···,\rvert N-1\rangle 0N1上的一个线性算子,它在基矢态上的作用为:
∣ j ⟩ → 1 N ∑ k = 0 N − 1 e 2 π i j k / N ∣ k ⟩ \rvert j\rangle \rightarrow\frac{1}{\sqrt{N}}\displaystyle\sum\limits_{k=0}^{N-1} e^{2\pi ijk/N}\rvert k\rangle jN 1k=0N1e2πijk/Nk

等价的,对任意态的作用可以写成
∑ j = 0 N − 1 x j ∣ j ⟩ → ∑ k = 0 N − 1 y k ∣ k ⟩ \displaystyle\sum\limits_{j=0}^{N-1}x_{j}\rvert j\rangle \rightarrow\displaystyle\sum\limits_{k=0}^{N-1} y_{k}\rvert k\rangle j=0N1xjjk=0N1ykk
其中,振幅 y k y_{k} yk是振幅 x j x_{j} xj进行离散傅立叶变换后的值。
请添加图片描述

量子相位估计:
利用量子傅里叶变换,相位估计算法可以将待估计的相位转化到由 t t t个量子比特编码的数字量上,其中估计精度为 2 − t 2^{−t} 2t,这样就将 φ φ φ以模拟信息的形式编码到辅助比特上,最后经过反傅里叶变换就得到了 φ φ φ。量子相位估计被广泛运用的根本原因是由于它数字型和模拟型数据的桥梁。

对量子相位估计算法总结如下:

输入:(1) 进行受控 U j U^{j} Uj操作的黑盒,其中 j j j为整数(2) U U U的一个具有特征值为 e 2 π i φ u e^{2\pi iφ_{u}} e2πiφu的本征态 ∣ u ⟩ \rvert u\rangle u(3)初始化为 ∣ 0 ⟩ \rvert 0\rangle 0 t = n + [ l o g ( 2 + 1 2 ϵ ) ] t=n+[log(2+\frac{1}{2\epsilon})] t=n+[log(2+2ϵ1)]个量子比特。
输出: 对 φ u φ_{u} φu n n n比特近似 φ u ~ \widetilde{φ_{u}} φu
运行时间 O ( t 2 ) O(t^2) O(t2)次操作和一个受控 U j U^{j} Uj的黑盒,成功概率至少是 1 − ϵ 1-\epsilon 1ϵ
过程

  1. 初态: ∣ 0 ⟩ ∣ u ⟩ \rvert 0\rangle\rvert u\rangle 0u
  2. 产生叠加: → 1 2 t ∑ j = 0 2 t − 1 ∣ j ⟩ ∣ u ⟩ \rightarrow\frac{1}{\sqrt{2^t}}\displaystyle\sum\limits_{j=0}^{2^t-1} \rvert j\rangle\rvert u\rangle 2t 1j=02t1ju
  3. 作用黑盒: → 1 2 t ∑ j = 0 2 t − 1 ∣ j ⟩ U j ∣ u ⟩ = 1 2 t ∑ j = 0 2 t − 1 e 2 π i j φ u ∣ j ⟩ ∣ u ⟩ \rightarrow\frac{1}{\sqrt{2^t}}\displaystyle\sum\limits_{j=0}^{2^t-1} \rvert j\rangle U^j\rvert u\rangle=\frac{1}{\sqrt{2^t}}\displaystyle\sum\limits_{j=0}^{2^t-1}e^{2\pi ijφ_{u}} \rvert j\rangle \rvert u\rangle 2t 1j=02t1jUju=2t 1j=02t1e2πijφuju
  4. 作用逆傅立叶变换: → ∣ φ u ~ ⟩ ∣ u ⟩ \rightarrow\rvert \widetilde{φ_{u}}\rangle\rvert u\rangle φu u
  5. 测量第一寄存器: φ u ~ \widetilde{φ_{u}} φu

Grover搜索

很多数据处理算法都有遍历或搜索数据的需求,比如要找到 N N N个数据中的最小值,在经典计算机上,这需要 O ( N ) O(N) O(N)次操作才能找到,而Grover提出的量子搜索算法只需要 O ( N ) \sqrt{O(N)} O(N) 次操作。

Grover算法的思路是将所有的数据以相干叠加在一起,并设计量子线路(Grover oracle)使目标数据对应的概率幅反相,然后将所有态的幅值以平均态为轴进行翻转。如此迭代这两个酉操作,正确解的幅值就慢慢放大,并在 N \sqrt{N} N 次左右达到最大,这样如果对量子态进行测量,就可以以接近1的概率得到目标解。如果一个问题的搜索空间是 N N N,正确解的个数是 K K K,则Grover算法需 π N / K 4 \frac{π\sqrt{N/K}}{4} 4πN/K 次迭代可以以最大概率给出正解。如果不知道正确解的个数,则算法最多需要 π ( 2 + 2 ) N 4 \frac{π(2+\sqrt{2})\sqrt{N}}{4} 4π(2+2 )N 次迭代。

具体过程如下:
首先需要对解进行标记,这个过程需要通过Oracle操作(Oracle黑盒),借用书中的描述:
请添加图片描述
简单总结为,对于输入 ∣ x ⟩ ∣ − ⟩ \rvert x\rangle\rvert-\rangle x并且 x x x满足 f ( x ) = 1 f(x)=1 f(x)=1可以实现相位变换,转换成 − ∣ x ⟩ ∣ − ⟩ -\rvert x\rangle\rvert-\rangle x
接下来开始制备所有地址的叠加态,通过调用Qracle把目标和非目标以相位进行区分开,通过相位取反把目标标记出来,然后将目标元素进行幅度放大。
请添加图片描述
接下来是测出解的过程:

  1. 制备 ∣ 0 ⟩ ⨂ n \rvert 0\rangle^{ \bigotimes n} 0n
  2. 执行 H ⨂ n H^{ \bigotimes n} Hn,得
    ∣ ψ ⟩ = ∑ x = 0 N − 1 ∣ x ⟩ N = N − M N ∑ f ( x ) = 0 ∣ x ⟩ N − M + M N ∑ f ( x ) = 1 ∣ x ⟩ M = c o s ( θ ) ∣ ψ 0 ⟩ + s i n ( θ ) ∣ ψ 1 ⟩ \rvert ψ\rangle=\displaystyle\sum\limits_{x=0}^{N-1}\frac{\rvert x\rangle}{\sqrt{N}}= \sqrt{\frac{N-M}{N}}\frac{\sum_{f(x)=0}\rvert x\rangle}{\sqrt{N-M}} + \sqrt{\frac{M}{N}}\frac{\sum_{f(x)=1}\rvert x\rangle}{\sqrt{M}}=cos(\theta)\rvert ψ_{0}\rangle+sin(\theta)\rvert ψ_{1}\rangle ψ=x=0N1N x=NNM NM f(x)=0x+NM M f(x)=1x=cos(θ)ψ0+sin(θ)ψ1
  3. 执行Oracle O O O,得 c o s ( θ ) ∣ ψ 0 ⟩ − s i n ( θ ) ∣ ψ 1 ⟩ cos(\theta)\rvert ψ_{0}\rangle-sin(\theta)\rvert ψ_{1}\rangle cos(θ)ψ0sin(θ)ψ1
  4. 执行酉操作 2 ∣ ψ ⟩ ⟨ ψ ∣ − I 2\rvert ψ\rangle\langle ψ\lvert-I 2ψψI,得 c o s ( 3 θ ) ∣ ψ 0 ⟩ + s i n ( 3 θ ) ∣ ψ 1 ⟩ cos(3\theta)\rvert ψ_{0}\rangle+sin(3\theta)\rvert ψ_{1}\rangle cos(3θ)ψ0+sin(3θ)ψ1
  5. 重复执行3-4步 k = [ π 4 θ ] ≈ [ π 4 N M ] k=[\frac{\pi}{4\theta}]\approx[\frac{\pi}{4}\sqrt{\frac{N}{M}}] k=[4θπ][4πMN ]次,得到接近于 ∣ ψ 1 ⟩ \rvert ψ_{1}\rangle ψ1的态
  6. 测量,并验证结果,算法以接近1的概率得到其中的一个目标元

关于 2 ∣ ψ ⟩ ⟨ ψ ∣ − I 2\rvert ψ\rangle\langle ψ\lvert-I 2ψψI为什么是酉操作推导:
请添加图片描述

Grover搜索的算法实现

N = 4 N= 4 N=4时,该算法是用2个量子位实现的。在这种情况下,只需一次旋转即可将初始状态 ∣ ψ ⟩ |ψ\rangle ψ 旋转到 ∣ ψ 1 ⟩ |ψ_{1}\rangle ψ1,当 ∣ ψ 1 ⟩ = ∣ 11 ⟩ |ψ_{1}\rangle=|11\rangle ψ1=11时构造量子电路

#初始化
import matplotlib.pyplot as plt
import numpy as np

# 导入Qiskit
from qiskit import IBMQ, Aer, assemble, transpile
from qiskit import QuantumCircuit, ClassicalRegister, QuantumRegister
from qiskit.providers.ibmq import least_busy

from qiskit.visualization import plot_histogram


# 构造两个量子比特的量子电路:
n = 2
grover_circuit = QuantumCircuit(n)


# 应用 hadamard gate 到所有的量子比特上
def initialize_s(qc, qubits):
    for q in qubits:
        qc.h(q)
    return qc

grover_circuit = initialize_s(grover_circuit, [0,1])

grover_circuit.cz(0,1) # 构建Oracle

# 构建 Diffusion operator
grover_circuit.h([0,1])
grover_circuit.z([0,1])
grover_circuit.cz(0,1)
grover_circuit.h([0,1])

得到的量子电路如下:
请添加图片描述
接下来对电路进行仿真

sim = Aer.get_backend('aer_simulator')

# 导出末态的矢量表达式

# 创建拷贝
grover_circuit_sim = grover_circuit.copy()

# 保存状态
grover_circuit_sim.save_statevector()

qobj = assemble(grover_circuit_sim)
result = sim.run(qobj).result()
# 保留3位小数
statevec = result.get_statevector(grover_circuit, decimals=3)

打印结果,可以看到

print(statevec)
Statevector([-0.+0.j,  0.+0.j,  0.+0.j,  1.-0.j],
            dims=(2, 2))

我没有安装 qiskit_textbook,如安装了这个包可以使用以下代码完整查看整个矢量:

from qiskit_textbook.tools import vector2latex
vector2latex(statevec, pretext="|\\psi\\rangle =")

在结果统计柱状图上也可以看到观测概率

grover_circuit.measure_all()

aer_sim = Aer.get_backend('aer_simulator')
qobj = assemble(grover_circuit)
result = aer_sim.run(qobj).result()
counts = result.get_counts()
plot_histogram(counts)

请添加图片描述


内积运算

求取向量内积是很多机器学习算法中的基本运算,例如支持向量机中核函数的运算。针对模拟型数据,量子算法可以通过引入幅值比特和测量,将计算复杂度降到 O ( 1 ) O(1) O(1),但其缺点是测量可能会破坏数据,因此该算法通常在算法的最后读出时使用。针对数字型数据,可以用 m m m个量子比特编码,通过量子傅里叶加法器和量子傅里叶乘法器来得到内积的结果,那么内积运算所用的门复杂度是 O ( m 3 ) O(m3) O(m3),相比于经典运算能实现指数加速。在量子SVM算法中,这两种内积的运算都发挥作用,其中数字型内积运算加速核函数的实现,而模拟型内积运算用于读出最后的判别结果,极大降低了运算复杂度。


论文阅读笔记及代码复现

这个系列将会一直更新与量子机器学习相关论文的学习和复现。

QuantumNAS论文学习

先附上论文和代码。
论文: QuantumNAS: Noise-Adaptive Search for Robust Quantum Circuits
代码:https://github.com/mit-han-lab/torchquantum/tree/master/artifact

QuantumNAS 的目标是提高参数化量子电路的鲁棒性,使得他们在量子计算机上运行时可以更少的受到噪声影响。对于参数化量子电路来说,实现同样的目标,可以有很多种不同架构的电路,用到不同数量和位置的量子门,QuantumNAS 可以找到最适合目标机器的量子电路架构,以及对应的量子比特映射 (Qubit mapping)。


介绍

问题: 量子噪声是嘈杂中型量子 (NISQ)计算机中的最主要的挑战。之前用于减轻噪声的工作主要集中于门级或脉冲级噪声的自适应编译。然而,关于对量子电路本身适应噪声的高水准优化的研究却是有限的。

作者提出: 一个用于变分电路(具有参数化量子门的可训练电路)和量子比特映射的噪声自适应协同搜索的综合框架。本文主要的贡献在于提出了一个基于超级电路的高效搜索流程;引入了迭代的量子剪枝方法;全面真实的量子计算评估;开源了量子计算库(TorchQuantum:基于Pytorch的可以进行GPU加速)。


算法概述

在这里插入图片描述
该算法借鉴了经典深度学习中的神经网络搜索 (NAS) 的思路,主要分为如下5个步骤:

  1. 首先构建一个包含很多种架构的量子电路 SuperCircuit,在训练这个 SuperCircuit 时,每一步会采样一个全部量子门的子集(SubCircuit),然后只更新这个 SubCircuit 中的参数,通过训练很多步,我们可以得到一个训练好的 SuperCircuit 并且可以用它来估计在设计空间里所有的 Subcircuit 的性能。
  2. 该研究会在设计空间里进行搜索,并且将真机的噪声信息考虑在内。研究者使用的搜索算法是遗传算法(无梯度优化),搜索目标是 SubCircuit 的架构和它的量子比特映射。在验证 SubCircuit 的性能时,可以使用某个真机运行,或者噪声仿真器来得到有噪声影响下的目标电路的性能,在很多个搜索的 iteration 之后,会得到一个在目标真机上最优的 SubCircuit 的架构。
  3. 将搜索得到的 SubCircuit 从头训练。
  4. 对训练得到的 SubCircuit 进行剪枝(Pruning),去掉那些参数很小的量子门。因为他们对最终结果的影响很小。
  5. 最后,将搜索、训练、剪枝后的 SubCircuit 在真机上进行部署,得到实验结果。

算法的具体实现

SuperCircuit 的构建与训练:
SuperCircuit指的是设计空间中门数最多的电路,例如构建一个最多第一层包含4个 U 1 U_{1} U1门,第二层包含4个 C U 1 CU_{1} CU1门的设计空间,则该设计空间的SuperCircuit指的是:请添加图片描述
SubCircuit可以看作是SuperCircuit的子集,该SuperCircuit所包含的SubCircuit一共有 2 8 = 256 2^8=256 28=256个,例如:
请添加图片描述
以上三个电路都是该SuperCircuit 的 SubCircuit。
作者提出SuperCircuit的原因主要依靠两点,一个是它可以高效地搜索候选的电路架构,而无需对每个候选进行单独训练;另一个是候选子电路(SubCircuit)可以直接从SuperCircuit继承参数,并且该子电路的效果被认为和经过单独训练的一样。

接下来是SuperCircuit训练过程,该训练过程主要有三个步骤:

  1. 对超级电路的门子集进行采样(包括前采样和限制采样)
    在前采样中,只有靠前的block和门会被采样,例如在一个子集中包含三个blocks,则block0,1,2会被采样;在被采样的block中,如果第一层只有两个门,则只有在量子位0和1上的门会被采样。在下图中,最左侧的block中,只有前两个 U 1 U_{1} U1门和前三个 C U 1 CU_{1} CU1被采样,在这个步骤中,只有这五个参数进行了更新。
    在这里插入图片描述
    在限制采样中,指的是限制两个连续步骤的子电路之间的差异,例如最多限制为4层时:
    请添加图片描述
    如上图所示,改变5层是不被允许的,改变两层或者三层的时候是被允许的。

  2. 仅使用子集执行任务并更新子集中的参数

  3. 参数更新是通过步骤累积的

SubCircuit 和量子映射的协同搜索:
这里采用无梯度优化(derivative-free optmization)来搜索电路和量子比特映射的联合空间。其中用基因向量将电路和量子映射进行编码,电路子基因中的每个元素表示层中的电路宽度(#gates),一个另外的基因设置电路深度(#blocks),这里也用到了前采样。量子映射子基因将逻辑量子位和物理量子位之间的映射进行编码,最后将电路和量子映射的子基因连接成基因对。
具体的如下图,将子电路和量子映射基因对作为输入搜索高性能的基因对。在每次迭代中,通过查询性能评估器对所有的基因对进行评估,并选择具有最高性能的多个对作为父种群,然后进行编译和交叉去生成新的种群。
在这里插入图片描述
关于变异和交叉:
突变操作:用预先设置的概率随机改变几个基因;交叉操作:首先从母种群(parent population)中选择两个母体样本(parent sample),然后生成新的样本,该新的样本的每个基因是从两个亲本样本之一中随机选择的。如果量子映射子基因包含重复的量子位,我们将用开始未使用的量子位替换重复的量子位。新种群是亲代种群、突变和交叉的集合,接下来对新种群进行分类,选择性能最高的种群作为父代(parents)并进入下一次迭代。最开始迭代的种群来自随机抽样, 整个迭代过程中种群大小保持不变。对于QML,我们使用验证集损失作为指标,验证损失越低,最终准确度越高。
在这里插入图片描述

SubCircuit 的训练:

迭代量子剪枝:
这里借鉴了神经网络中的剪枝操作,通过去除冗余的量子门来减少噪声。主要有三个好处,首先是通过减少门的数量,在进化搜索的次优性阶段为进一步优化搜索电路留下了空间;其次是即使使用相同的电路,也存在多个参数集来实现类似的无噪声性能,一些集合包含更多幅度接近于零的参数,这些参数可以通过迭代修剪和微调安全地删除;第三点是部分删除一些参数可以带来优化,例如 U 3 U_{3} U3门, U 3 ( θ , ϕ , λ ) U_{3}(\theta,\phi,\lambda) U3(θϕλ) U 3 ( 0 , ϕ , λ ) U_{3}(0,\phi,\lambda) U3(0ϕλ) U 3 ( θ , ϕ , 0 ) U_{3}(\theta,\phi,0) U3(θϕ0) U 3 ( θ , 0 , λ ) U_{3}(\theta,0,\lambda) U3(θ0λ) U 3 ( θ , 0 , 0 ) U_{3}(\theta,0,0) U3(θ00) U 3 ( 0 , ϕ , 0 ) U_{3}(0,\phi,0) U3(0ϕ0) U 3 ( 0 , 0 , λ ) U_{3}(0,0,\lambda) U3(00λ)编译后分别为5, 1, 4, 4, 4, 1, 1。因此,对基本门集( C N O T , S X , R Z CNOT,SX,RZ CNOTSXRZ)来说,在 U 3 U_{3} U3门中将一个或两个参数设置为零可以减少高达80%的门编译。

请添加图片描述
具体的,首先将搜索到的电路从零开始训练到收敛,并对所有归一化的旋转角 ( θ , ϕ , λ ) ∈ [ − π , π ) (\theta,\phi,\lambda)\in[-\pi,\pi) (θϕλ)[π,π)进行排序,并去掉最接近 0 ◦ 0^{◦ } 0的角,然后微调剩余的参数来恢复精度。通过迭代增加剪枝率并微调电路参数,直至达到所需的比率。本文采用的是多项式剪枝衰减比率(polynomial
pruning ratio decay
): r n o w = r f i n a l + ( r i n i t i a l − r f i n a l ) ( 1 − s n o w − s b e g i n s e n d − s b e g i n ) r_{now}=r_{final}+(r_{initial}-r_{final})(1-\frac{s_{now}-s_{begin}}{s_{end}-s_{begin}}) rnow=rfinal+(rinitialrfinal)(1sendsbeginsnowsbegin) 其中 r r r是剪枝比率, s s s是训练步长,在确保与未剪枝电路相比无噪声仿真性能不会降低的基础上确定最终剪枝比率。因此,由于更少的量子门和更少的噪声源,电路的精度在编译后可以进一步提高9%。


评估

Benchmarks:
QML 分类任务: MNIST 10-class, 4-class, 2-class, Fashion 4-class, 2-class, Vowel 4-class
VQE task molecules: H 2 H_{2} H2, H 2 O H_{2}O H2O, L i H LiH LiH, C H 4 CH_{4} CH4, B e H 2 BeH_{2} BeH2
在这里插入图片描述
MNIST and Fashion数据集中分别使用95%的图像作为训练集,5%的图像作为验证集。由于有限的真实量子计算资源,我们从“测试” 中随机抽取300个图像作为我们的测试集,最终在四个电路上对比精度,即全部测试集的精度/300样本的精度分别是:0.505/0.497, 0.284/0.283, 0.564/0.547, 0.272/0.287。在Vowel-4数据集上(990张图片),按照6:1:3分为训练集,验证集和测试集,并对其特征进行主成分分析(PCA),并得到10个重要维度。为了读数,在Pauli-Z的基础上测量期望值,并从每 个量子位获得一个值[-1,1]。对于2分类,分别对量子位0,1,2和3求和得到两个值,将所得的值通过softmax得到对应的概率。对于4类和10类,我们在期望值上使用softmax来获得对应的概率。
对于VQE,目标是通过重复测量分子哈密顿量的期望值来找到目标分子的低能特征值。在经典机器上搜索和训练电路后,部署在真实量子计算机上以获得特征值。

量子设备: IBMQ、#Qubits: 5 to 65、Quantum Volume: 8 to 128
通过Qiskit API 使用IBMQ的量子计算机

Baselines:

  1. 无噪音搜索:使用无噪声仿真搜索SubCircuits,不涉及噪声信息。
  2. 随机生成:使用相同的门集,我们生成随机电路,并将其 #parameters 约束为与QuantumNAS搜索电路相同,以进行公平比较。(生成三个不同的电路,取其中最好的)
  3. Human design:我们也确保相同的 #parameters,对于U3+CU3, RXYZ+U1+CU3和IBMQ基本空间,Human design在几个前块中具有全宽度;对于ZZ+RY、RXYZ和ZX+XX空间,我们堆叠了原论文中介绍的多个块。Human design的最后一层没有全宽度,以确保参数总数相同。
  4. Human design+自适应噪声映射:电路具有与QuantumNAS相同的 #parameters,映射使用自适应噪声映射进行优化。
  5. Human design+Sabre 映射:电路具有与QuantumNAS相同的 #parameters,使用Sabre 对量子映射进行优化。
  6. Human design(1/2 #Param)+Sabre 映射:电路使用一半的 #parameters,使用Sabre 对量子映射进行优化。
  7. UCCSD baseline for VQE

实验结果与分析

4分类和2分类结果:
在这里插入图片描述
上图显示了QuantumNAS和6个baselines在6个不同设计空间中的5个QML任务在 IBMQ-Yorktown(5Q)上的测量精度。可以看出除了在ZZ+RY空间中的Vowel-4任务和 ZX+XX空间中的 MNIST-4任务,QuantumNAS在4分类和2分类任务上都有着优异的表现。此外,剪枝为4分类任务带来平均2%的提升,为2分类任务带来平均1%的提升。当搜索的电路仅包含少量参数时,例如包含7个参数的Vowel-4 ZZ+RY空间,移除任何参数将损害准确性。对于具有更多参数的电路, 例如包含36个参数的MNIST-4 U3+CU3空间,剪裁比可以达到50%,同时精度提高4%。
在这里插入图片描述
在上表中,剪枝去除了14个参数,深度减少了11个,但由于修剪电路具有相同的无噪声精度的同时,有更少的门,噪声更小, 因此精度提高了3%。对于IBMQ基,虽然其空间比U3+CU3大,但精度有时较低。因此,由于较高的搜索难度,较大的设计空间不一定带来较好的最终性能。

不同量子设备和噪音上的结果:
在这里插入图片描述
上图显示QuantumNAS在各种设备上的性能。对于每个任务,使用相同的SuperCircuit搜索每个设备的QuantumNAS 子电路,但为每个设备使用特定的噪声模型。对于具有最小噪声的机器IBMQ-Santiago,尽管baseline方法实现了比Melbourne和 Guadalupe更高的精度,但QuantumNAS仍然可以达到平均高5%的精度。此外,我们显示了QuantumNAS在搜索后3周的测试的准确性,略低于立即测试的准确性,但仍远高于baseline。其中一个原因是,IBMQ每天至少对机器进行一次校准,因此噪音离校准点不远。因此,即使机器上的噪声特性在校准间隔内发生变化,QuantumNAS电路仍然具有噪声自适应。
在这里插入图片描述
上表显示在不同设备上搜索和运行的电路性能。可以看到当两个器件相同时,可以实现最佳性能,这表明了特定器件电路的必要性。

VQE任务的结果:
在这里插入图片描述
上图显示了在IBMQ-Yorktown上测量的不同空间中 H 2 H_{2} H2的VQE性能,理论最佳值为-1.85。可以看出,通过QuantumNAS获得的特征值始终低于任何其他基线,而UCCSD模拟baseline因为不适应硬件噪声远离最佳值。剪枝去除了所有五个电路设计空间的50%的参数,并且可以稳定地减少特征值。因此,与QML电路相比,VQE电路具有更高的冗余度,这使得它们更易于修剪。
在这里插入图片描述
上图进一步显示了QuantumNAS 和 UCCSD 在不同机器上关于 L i H ( 6 Q ) LiH (6Q) LiH(6Q) H 2 O ( 6 Q ) H_{2}O (6Q) H2O(6Q) C H 4 ( 6 Q ) CH_{4}(6Q) CH4(6Q) ( 10 Q ) (10Q) (10Q) B e H 2 ( 15 Q ) BeH_{2}(15Q) BeH2(15Q)的比较结果。除了实现较低的测量期望值,QuantumNAS还可以减少理论训练值。对于 H 2 O H_{2}O H2O,UCCSD无噪声训练期望值为-49.6,而QuantumNAS为-52.4,表明QuantumNAS同时适用于设备和分子。对于 C H 4 ( 10 Q ) CH_{4}(10Q) CH4(10Q),我们还使用IBMQ-Montreal噪声模拟器模拟完整的原电路(7164门),得到期望值为-12.86;同样我们还得到 B e H 2 ( 15 Q ) BeH_{2}(15Q) BeH2(15Q)(30851门)的期望值 -9.81。尽管电路大得多,但结果却更差,因为较大数量的门会引入更多的噪声。


代码运行结果

train_supercircuit:
请添加图片描述
请添加图片描述
search:
请添加图片描述

train_subcircuit:
请添加图片描述

prune: 请添加图片描述

eval:
请添加图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值