前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >下(应用篇)| 推荐几款较流行的量子算法

下(应用篇)| 推荐几款较流行的量子算法

作者头像
量子发烧友
发布于 2023-02-24 07:26:06
发布于 2023-02-24 07:26:06
2.2K00
代码可运行
举报
文章被收录于专栏:量子发烧友量子发烧友
运行总次数:0
代码可运行

1. 典型的量子算法

量子算法是量子计算机的必要软件支撑,同时量子算法的研究也是推动量子计算发展的强大动力。以下将对各个发展阶段的典型量子算法进行比较分析。

其中,探索阶段选择的量子算法是Simon算法;质变阶段选择的量子算法有两个,分别是Shor算法和Grover算法(量子算法中最著名的算法);繁荣发展阶段选择的量子算法是VQE变分量子特征值求解算法;AI探索阶段选择的量子算法是Google提出的Tensorflow Quantum(TFQ)框架。

1.1 Shor算法

Simon算法是由丹尼尔·西蒙20年前提出,认为这种算法能够挖掘量子计算机的加速潜力。Simon算法的目的,是为了解决量子黑箱问题,即将执行计算任务的一段程序或者一个公式看作黑箱,看黑箱是否对每一个可能的输入给出一个唯一的输出。

重要性:实现了从指数级复杂度到多项式加速。

主要应用:主要应用于硬件或软件条件受限(例如:芯片面积要求小、微处理器、低功耗等),同时对安全有一定需求的低端设备。

为了适应不同的场合,Simon提供了不同的方案

图:Simon密码族

图:Simon轮函数结构图

其中, block size : 明文块大小,比特位;

    key size : 初始密钥大小,比特位;

    word size : "字"大小,比特位;

    key words : 初始密钥包含"字"的个数;

    const seq : 计算轮密钥应该使用的z的值;

    rounds : 加解密的轮数。

以下是Simon算法流程:(以加解密轮函数和密钥编排算法为例)

轮加密

每一轮的操作如上图“Simon轮函数结构图”。明文被分成两个"字",每个"字"的二进制位数都为n(即word size),x_(i+1)和x_i分别表示高位部分和低位部分(个人认为,这个没有特别要求,x_(i+1)也可以表示低位、x_i表示高位部分,只要加解密按照同样的顺序即可。为了叙述统一,本文按照x_(i+1)表示高位、x_i表示低位)。

每轮的加密主要涉及到3种操作,分别是异或、按位与和循环左移(如果j是负数则表示循环右移)。每轮加解密的过程用公式表示,其中x对应x_(i+1)、y对应x_i、k为轮密钥。

Simon运算符号:

Simon轮加解密公式:

在C++实现中,按位异或和与都有直接的操作符,对于循环移位可以按照如下方法实现。将x循环左移i(i>=0)位,假设x对应的二进制位数为n,则可以表示为: (x<>(n-i))。当然,x应该是无符号的数,不然会出错。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 /   
   加密后的低32位是明文的高32/    
 tempCipherLower  = plainText[];    
 tempCipherHigher = plainText[] ^ keys[i] ^    
                 ( ((plainText[]<<)|(plainText[]>>(SIMON_WORD_SIZE-))) & ((plainText[]<<)|(plainText[]>>(SIMON_WORD_SIZE-))) ) ^    
                 ((plainText[]<<)|(plainText[]>>(SIMON_WORD_SIZE-)));    
 /   
   重新将加密的结果复制到plainText中   
  /    
 plainText[]     = tempCipherHigher;    
 plainText[]     = tempCipherLower;

密钥编排

密钥编排算法如下,其中m表示的是原始密钥中"字"的个数。

c为一个常数,它的二进制位数为n,最低两位为0,其余高位为1。

z是一个常数数组,值见下图,在每种情况下z的取值都是固定的,每轮加解密时只取一个比特位参与运算。

ki、ki+1、ki+2等都是轮密钥。

I表示不进行移位。

C++代码实现如下(只包含block size为64,key size为96和128的两种情况):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  / 
   Simon:计算密钥,字大小为32
   inputKey:初始的密钥 
   keys:计算后得到的每轮密钥 
  /   
 void setSimonKeys32 ( unsigned int * inputKey, unsigned int * keys ) {   
   
     / 
       算法中的常数c,大小为2^n - 4,其中n是字的长度,即SIMON_WORD_SIZE 
       转化为二进制,即最低两位为0,其它位全为1 
      /   
     unsigned int c = 0xfffffffc;   
   
     int i;   
     ; i < SIMON_KEY_WORDS; i++ )  {   
         keys[i] = inputKey[i];   
     }   
   
     /*
       求解后面轮的密钥 
       先求其它的异或,最后求Zji,如果为1则对最低位进行修改,否则不变 
      /   
      ) {   
         ; i < SIMON_ROUNDS-SIMON_KEY_WORDS; i++ ) {   
             keys[i+SIMON_KEY_WORDS] = c ^ keys[i] ^   
                             ((keys[i+]>>) | (keys[i+]<<(SIMON_WORD_SIZE-))) ^   
                             ((keys[i+]>>) | (keys[i+]<<(SIMON_WORD_SIZE-)));   
             // SIMON_WORD_SIZE为32时,无论SIMON_KEY_WORDS为3还是4,周期都是62   
             ] ==  ) {   
                 keys[i+SIMON_KEY_WORDS] ^=  0x1;   
             }   
         }   
     }  ) {   
         // int cycle = (SIMON_SEQUENCE_NUMBER == 0 || SIMON_SEQUENCE_NUMBER == 1)?31:62;   
         unsigned int temp = 0x00000000;   
         ; i < SIMON_ROUNDS-SIMON_KEY_WORDS; i++ ) {   
             temp = ((keys[i+]>>) | (keys[i+]<<(SIMON_WORD_SIZE-))) ^ keys[i+];   
             keys[i+SIMON_KEY_WORDS] = c ^ keys[i] ^ temp ^ ((temp>>) | (temp<<(SIMON_WORD_SIZE-)));   
             ] ==  ) {   
                 keys[i+SIMON_KEY_WORDS] ^=  0x00000001;   
             }   
         }   
     }   
    
 }  

参考:

[1] Beaulieu R, Shors D, Smith J, et al. The SIMON and SPECK Families of Lightweight Block Ciphers[J]. IACR Cryptology ePrint Archive, 2013, 2013: 404.

[2] bbsmax网站《Simon简介》,原文链接:https://www.bbsmax.com/A/pRdBoA69zn/

1.2 Shor算法

shor算法也称秀尔算法,以数学家彼得·秀尔命名,是一个在1994年提出的一种大数质因子分解的量子多项式算法。Shor量子计算将NP问题变为了P问题,和用数论中的一些定理将大数因子分解转化为求某个函数的周期,由于在量子环境下可以提高效率实现量子傅立叶变换,从而可以对大数质因子进行化简。

在一个量子计算机上面,要分解整数N,shor算法的运作需要多项式时间,质因数分解问题可以使用量子计算机以多项式时间解出,因此在复杂度类BQP里面,比起传统已知最快的因数分解算法(普通数域筛选法)还要快了一个指数的差异。

重要性:Shor算法利用了量子力学的多种特性显示出在RSA加密技术破解方面的优势。它代表使用量子计算机的话可以用来破解已被广泛使用的公开密钥加密方法(RSA加密算法)。

主要应用: 在量子密码学、量子通信方面、shor算法后续研究、模拟实现的参考具有一定辅助作用。

大数质因子分解问题为:N为已知大奇数,N = pq,求 p和q。

(1)随机抽取正整数y,y < N,且与N互质,即gcd(y,N)=1 。

(2)定义f(x)= y^xmod < N,可看出f(x)是一个周期函数,若周期是r,则:

故:

(3)求p和q。

用辗转相除法求y^(r/2)+1 和N的最大公约数,设为p。

上面各步中的主要计算是辗转相除、计算f(x)和求f(x)的周期。辗转相除的时间复杂度为O(n^2)。计算f(x)时间复杂度为O(n^2 (lgn)(lglgn))。求f(x)的周期需要进行傅立叶变换,量子傅立叶变换的时间复杂度为O(lgn),所以,shor量子算法的时间复杂度为O(n^2 (lgn)(lglgn))。

Shor算法的关键之处是利用量子傅立叶变换求f(x)的周期。

量子傅立叶变换QFT(Quantum Fourier Transform)的定义:

可以看出QFT是么正变换,QFT可由两种量子门实现,所用的门的数量为m(m+1)/2。这两种门是H门,另一种是2个量子位的相移门,其算符如下:

S_jk是幺正矩阵。

参考:彭卫丰,江南大学信息学院,孙力,江南大学网络教育学院,Shor量子算法的优化及应用研究。

1.3 Grover算法

Grover算法(Quantum Search Algorithm)是量子计算领域的主要算法之一,由Grover于1996年提出的平方根加速的随机数据库量子搜索算法,旨在利用量子计算机进行比经典计算机更快的数据搜索。在数据库足够混乱且没有具体的数据结构限定的条件下,Grover算法可以快速解决从N个未分类的客体中寻找出某个特定个体的问题。除搜索时间远短于经典计算外,其强大之处还在于Grover算法的公式可适用于很多问题,比如:密码学、矩阵和图形问题、优化以及量子机器学习等。

Grover算法搜寻目标对象的逻辑大致为在无序的数据集合中寻找X,首先制备全部量子态的叠加态,然后循环进行操作使得目标态的符号反向(Oracle算符)且态的符号也反向(Grover算符);在执行次操作后,量子态被旋转至目标态;最后测量所得结果概率发现X出现的概率趋近于1,此时即可通过Grover算法找到目标X。一般地,如果想要在N个信息找到对应信息,进行4/pie*√N次操作,进行测量得到的概率趋于1。因此,Grover算法进行无序搜索主要步骤有三个:制备量子态、G迭代、测量。

重要性:Grover算法的重要性,一是因为Grover算法解决的无序数据库搜索问题就是一个很重要的问题;二是因为,Grover量子算法的提出,和Shor质因子分解算法提出一样,给了研究者们用量子算法解决经典算法无法有效解决的问题的希望,极大提高了人们对于量子算法研究的热情;三是,从Grover算法衍生出了一系列利用了幅度放大思想的算法,是现今量子算法研究中的一个重要部分。

Grover算法步骤

Grover算法总体分为三大步骤:制备量子态、标记目标进行相位翻转并放大概率振幅、测量。Grover算法利用量子特性将目标值与其余值进行区分,采用验证是否符合条件的方式而不是线性查找的方式逼近正确答案。

复杂度:Grover搜索算法需要O(√N)次查询,其中N表示搜索空间元素的个数,相较于经典搜索 O(N) 具有多项式量级的加速。

量子线路

为了便于分析,定义两个量子态

“Good”态

“Bad”态

其中 t就是满足x_i=1的个数。

算法步骤如下:

1.设置初始量子态

2.令ε=t/N,应用k=O(1/ε)次如下变换:

3.测量寄存器的状态,并检查测量结果i是否是解。

其中,算法第2步理解如下:

量子态从状态∣U⟩出发,通过不断的“反射+反射”,不断向目标态∣G⟩靠近。而目标态∣G⟩就是满足∣i⟩的叠加态。

QuTrunk Grover算法部分代码示例

QuTrunk基于python提供量子编程API,对量子编程涉及到的基本概念做了代码层面的抽象封装和实现。QuTrunk通过接入启科自主研发的量子计算后端设备QuBox可实现量子算法运行。以下为QuTrunk实现Grover算法部分代码示例:

步骤1:首先在QuIDE中导入随机数模块和QuTrunk中的部分模块

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 import math   
 import random   
    
 from numpy import pi   
    
 from QuTrunk.core.circuit import QCircuit, InitState   
 from QuTrunk.core.gates import H, X, C, Z   
 from QuTrunk.core.calculator import Calculator   9. from QuTrunk.core.counter import Counter  

步骤2: 调用Oracle门和Diffuser函数,将量子态进行相位翻转和放大(部分代码省略)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def apply_oracle(qr, num_qubits, sol_elem)...   
   
 def apply_diffuser(qr, num_qubits)...  

步骤3:运行Grover算法,不断进行G迭代直至搜索出目标值

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def run_grover():   
 num_qubits = 15   
 num_elems = 2 ** num_qubits   
 num_reps = math.ceil(pi / 4 * math.sqrt(num_elems))   
 print("num_qubits:", num_qubits, "num_elems:", num_elems, "num_reps:", num_reps)

步骤4:输出运行结果

从结果中可观察到搜索的量子比特数为15Qubit、量子门数为11726个、总的运行时间为10.8659s(其中QuBox运行时间为10.6309s,QuTrunk运行时间仅为0.2350s)。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 Counter(quit=15)   
     qubits = 15   
     quantum_gates = 11726   
     total_time = 10.865945100784302   
     qubox_time = 10.630940914154053   
     qutrunk_time = 0.23500418663024902  

以上Grover算法中生成随机数目标为17560,最终搜索结果概率峰值为0.999986接近于1。在搜索过程中,当此概率出现峰值且第一次下降时即停止搜索,认为已经找到目标值即为17560。

1.4 VQE变分量子特征值求解算法

变分量子本征求解器(variational quantum eigensolver, VQE)指利用经典优化器训练一个含参量子线路,用于求解矩阵本征值和本征矢的算法。VQE 是第一种被提出来的 VQA,目标是寻找一个哈密顿量H的基态和低激发态。下文以基态为例介绍。

对于基态,损失函数就是能量的期望

在经典计算机上我们可以将|ψ(θ)〉表示出来(一个 quantum circuit 直接对应一个 tensor network),然后测出能量,但是它消耗的存储容量随着需要计算的物理系统大小指数增长。

而对于一台量子计算机,我们只需要重复地将|ψ(θ)〉制备出来,测量取平均得到哈密顿量中相加的每一项的期望值。后者消耗的计算资源随需要计算的物理系统大小呈多项式增长,于此体现出相较于纯经典算法的优越性。

以求基态为例,VQE 的整体流程如下:

1.选定一个含参的试探波函数(trial wave function)以及初始参数θ_0;

2.利用量子计算机测量出|ψ(θ)〉的能量期望C(θ)= <ψ(θ)|H|ψ(θ)〉;

3.为不断降低能量,利用经典优化器更新参数θ_0 〖→θ〗_1,返回第 2 步,直至收敛。

以下将通过量桨的量子化学工具包(基于 psi4 和 openfermion)为例,寻找氢分子H2基态能量。

构造电子哈密顿量

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  import paddle   
 import paddle_quantum.qchem as qchem   
 from paddle_quantum.loss import ExpecVal   
 from paddle_quantum import Hamiltonian   
 from paddle_quantum.state import zero_state, State   
 from paddle_quantum.ansatz import Circuit   
 from paddle_quantum.linalg import dagger   
 from paddle_quantum import Backend   
    
 import os   
 import matplotlib.pyplot as plt   
    
 import numpy   
 from numpy import pi as PI   
 from numpy import savez, zeros   
    
 # 无视警告   
 import warnings   
 warnings.filterwarnings("ignore")  

通过量桨的量子化学工具包将分子的哈密顿量提取出来并储存为 paddle quantum 的 Hamiltonian 类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 geo = qchem.geometry(structure=[['H', [-0., 0., 0.0]], ['H', [-0., 0., 0.74]]])   
 # geo = qchem.geometry(file='h2.xyz')   
    
 # 将分子信息存储在 molecule 里,包括单体积分(one-body integrations),双体积分(two-body integrations),分子的哈密顿量等   
 molecule = qchem.get_molecular_data(   
     geometry=geo,   
     basis='sto-3g',   
     charge=0,   
     multiplicity=1,   
     method="fci",   
     if_save=True,   
     if_print=True   
 )   
 # 提取哈密顿量   
 molecular_hamiltonian = qchem.spin_hamiltonian(molecule=molecule,   
                                                filename=None,   
                                                multiplicity=1,    
                                                mapping_method='jordan_wigner',)   
 # 打印结果   
 print("\nThe generated h2 Hamiltonian is \n", molecular_hamiltonian)  

设计量子神经网络QNN(也可以理解为参数化量子电路)来准备试探波函数 |Ψ(θ)⟩。

根据上图中的电路设计,通过 Paddle Quantum 的 Circuit 类和内置的 real_entangled_layer() 电路模板来高效搭建量子神经网络。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  def U_theta(num_qubits: int, depth: int) -> Circuit:   
     """  
     Quantum Neural Network  
     """   
        
     # 按照量子比特数量/网络宽度初始化量子神经网络   
     cir = Circuit(num_qubits)   
        
     # 内置的 {R_y + CNOT} 电路模板   
     cir.real_entangled_layer(depth = depth)   
        
     # 铺上最后一列 R_y 旋转门   
     cir.ry()   
            
     return cir  

进一步定义训练参数、模型和损失函数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
  class StateNet(paddle.nn.Layer):   
     """ 
     Construct the model net 
     """   
   
     def __init__(self, num_qubits: int, depth: int):   
         super(StateNet, self).__init__()   
           
         self.depth = depth   
         self.num_qubits = num_qubits   
         self.cir = U_theta(self.num_qubits, self.depth)   
           
     # 定义损失函数和前向传播机制   
     def forward(self):   
           
         # 运行电路   
         state = self.cir(init_state)   
         # 计算损失函数   
         loss = loss_func(state)        
    
         return loss, self.cir

进行一些训练的参数设置,主要是学习速率(LR, learning rate)、迭代次数(ITR, iteration)和量子神经网络计算模块的深度(D, Depth)。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 ITR = 80  # 设置训练的总迭代次数   
 LR = 0.4   # 设置学习速率   
 D = 2      # 设置量子神经网络中重复计算模块的深度 Depth   
 N = molecular_hamiltonian.n_qubits # 设置参与计算的量子比特数

将数据转化为 Paddle 中的张量,进而进行量子神经网络的训练。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 # 确定网络的参数维度   
 net = StateNet(N, D)   
   
 # 一般来说,利用Adam优化器来获得相对好的收敛,   
 opt = paddle.optimizer.Adam(learning_rate=LR, parameters=net.parameters())   
   
 # 定义初始态   
 init_state = zero_state(N)   
   
 # 定义损失函数   
 loss_func = ExpecVal(molecular_hamiltonian)   
   
 # 记录优化结果   
 summary_iter, summary_loss = [], []   
   
 # 优化循环   
 for itr in range(1, ITR + 1):   
   
     # 前向传播计算损失函数   
     loss, cir = net()   
   
     # 在动态图机制下,反向传播极小化损失函数   
     loss.backward()   
     opt.minimize(loss)   
     opt.clear_grad()   
   
     # 更新优化结果   
     summary_loss.append(loss.numpy())   
     summary_iter.append(itr)   
   
     # 打印结果   
     if itr % 20 == 0:   
         print("iter:", itr, "loss:", "%.4f" % loss.numpy())   
         print("iter:", itr, "Ground state energy:", "%.4f Ha"   
                                             % loss.numpy())   
     if itr == ITR:   
         print("\n训练后的电路:")   
         print(cir)   
   
 # 储存训练结果到 output 文件夹   
 os.makedirs("output", exist_ok=True)   
 savez("./output/summary_data", iter = summary_iter,   
                                energy=summary_loss)

通过 VQE 得到的基态能量的估计值

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
result = numpy.load('./output/summary_data.npz')  
   
 eig_val, eig_state = numpy.linalg.eig(   
                      molecular_hamiltonian.construct_h_matrix())   
 min_eig_H = numpy.min(eig_val.real)   
 min_loss = numpy.ones([len(result['iter'])]) * min_eig_H   
   
 plt.figure(1)   
 func1, = plt.plot(result['iter'], result['energy'],   
                   alpha=0.7, marker='', linestyle="-", color='r')   
 func_min, = plt.plot(result['iter'], min_loss,   
                   alpha=0.7, marker='', linestyle=":", color='b')   
 plt.xlabel('Number of iteration')   
 plt.ylabel('Energy (Ha)')   
   
 plt.legend(handles=[   
     func1,   
     func_min   
 ],   
     labels=[   
         r'$\left\langle {\psi \left( {\theta } \right)} '   
         r'\right|H\left| {\psi \left( {\theta } \right)} \right\rangle $',   
         'Ground-state energy',   
     ], loc='best')   
 plt.text(-15.5, -1.145, f'{min_eig_H:.5f}', fontsize=10, color='b')   
 #plt.savefig("vqe.png", bbox_inches='tight', dpi=300)   
 plt.show()  

1.5 Tensorflow Quantum(TFQ)框架

TensorFlow Quantum (TFQ) 是一个用于混合量子经典机器学习的 Python 框架,主要为解决NISQ时代的量子机器学习问题而设计。它将量子计算基元(如构建量子电路)引入 TensorFlow 生态系统。使用 TensorFlow 构建的模型和运算使用这些基元来创建功能强大的量子经典混合系统。其允许量子算法研究员和 ML 应用研究员在 TensorFlow 内充分利用 Google 的量子计算框架。

TensorFlow Quantum 实现了将 TensorFlow 与量子计算硬件集成所需的组件。为此,TensorFlow Quantum 引入了两个数据类型基元:

(1)量子电路 - 表示 TensorFlow 中 Cirq 定义的量子电路。创建大小不同的电路批次,类似于不同的实值数据点的批次。

(2)Pauli 和 - 表示 Cirq 中定义的 Pauli 算子张量积的线性组合。像电路一样,创建大小不同的算子批次。

利用这些基元来表示量子电路,TensorFlow Quantum 提供以下运算:

(1)从电路批次的输出分布中采样。

(2)基于电路批次计算 Pauli 和批次的期望值。TFQ 实现了与反向传播兼容的梯度计算。

(3)模拟电路和状态批次。虽然在现实世界中直接检查整个量子电路的所有量子态振幅的效率极低,但状态模拟可以帮助研究员了解量子电路如何将状态映射到接近精确的精度水平。

以上是TensorFlow Quantum 的软件堆栈图,它展示了 TensorFlow 和 Cirq 之间的交互。

TensorFlow Quantum 在 TensorFlow 的基础上增加了处理量子数据的能力。这些量子数据包括量子线路和量子算符。

TensorFlow Quantum 的核心原则是与 TensorFlow,特别是 Keras 模型和优化器的集成,因此,TF Keras Models 横跨了堆栈图的左右。

第三层包含 TensorFlow Quantum 的量子层和微分器,当和经典张量流连接时,可以实现混合量子经典的自动微分。

Ops 层实现了张量流图的实例化。

量子线路可以通过调用 qsim 或 Cirq 模拟运行,或最终在 QPU 上运行。

其操作流程如下:

(1)制备量子数据集:一般而言,量子数据集应当由一个黑盒产生。然而,由于当前的量子计算机无法从外部源导入量子数据,用户需要构造生成数据的量子线路。

(2)量子模型估计:参数化量子模型通过量子计算,来提取量子数据集中隐藏在量子子空间或子系统中的信息。

(3)采样或求平均值:量子态的测量从经典随机变量中以样本的形式提取经典信息。这个随机变量的值的分布通常取决于量子态本身和被测的可观测值。许多变分算法依赖于测量值的平均值,TFQ提供了对前两个步骤的多个运行结果求平均值的方法。

(4)经典模型估计:经典信息被提取出来后,可以进一步做经典后处理,以提取测量期望值之间的关联信息。这一过程可以通过经典深度神经网络实现。

(5)代价函数 (cost function) 估计:得到经典后处理结果后,需要对代价函数进行估计。例如估计监督分类的准确度。

(6)梯度估计和参数更新:完成代价函数的估计之后,整个模型中的自由参数应当向代价降低的方向更新。比较常见的是梯度下降更新。

以下为如何使用 TensorFlow Quantum 构建一个混合的量子经典神经网络。

准备工作:

设置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pip install tensorflow==2.7.0

安装TensorFlow Quantum

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
pip install tensorflow-quantum

导入 TensorFlow 和模块依赖项

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 import tensorflow as tf   
 import tensorflow_quantum as tfq   
   
 import cirq   
 import sympy   
 import numpy as np   
   
 # visualization tools   
 %matplotlib inline   
 import matplotlib.pyplot as plt   
 from cirq.contrib.svg 
 import SVGCircuit

使用 TensorFlow Quantum 构建一个混合的量子经典神经网络。以下为其架构图:

架构分为 3 个部分:

(1)输入电路或数据点电路:前三个大门。

(2)控制电路:其他三个大门。

(3)控制器:设置受控电路参数的经典神经网络。

操作流程:

步骤1:定义一个可学习的单比特旋转

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 # Parameters that the classical NN will feed values into.   
 control_params = sympy.symbols('theta_1 theta_2 theta_3')   
   
 # Create the parameterized circuit.   
 qubit = cirq.GridQubit(0, 0)   
 model_circuit = cirq.Circuit(   
     cirq.rz(control_params[0])(qubit),   
     cirq.ry(control_params[1])(qubit),   
     cirq.rx(control_params[2])(qubit))   
   
 SVGCircuit(model_circuit)  

步骤2: 定义控制器网络

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 # The classical neural network layers.   
 controller = tf.keras.Sequential([   
     tf.keras.layers.Dense(10, activation='elu'),   
     tf.keras.layers.Dense(3)   
 ])  
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
controller(tf.constant([[0.0],[1.0]])).numpy()

步骤3: 将控制器连接到受控电路

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 # This input is the simulated miscalibration that the model will learn to correct.   
 circuits_input = tf.keras.Input(shape=(),   
                                 # The circuit-tensor has dtype `tf.string`   
                                 dtype=tf.string,   
                                 name='circuits_input')   
   
 # Commands will be either `0` or `1`, specifying the state to set the qubit to.   
 commands_input = tf.keras.Input(shape=(1,),   
                                 dtype=tf.dtypes.float32,   
                                 name='commands_input')

步骤4: 对这些输入应用操作,以定义计算

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 dense_2 = controller(commands_input)   
   
 # TFQ layer for classically controlled circuits.   
 expectation_layer = tfq.layers.ControlledPQC(model_circuit,   
                                              # Observe Z   
                                              operators = cirq.Z(qubit))   
 expectation = expectation_layer([circuits_input, dense_2])

步骤5: 将此计算打包为tf.keras.Model

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 # The full Keras model is built from our layers.   
 model = tf.keras.Model(inputs=[circuits_input, commands_input],   
                        outputs=expectation)  

步骤6: 将模型图与架构图进行比较以验证正确性。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
tf.keras.utils.plot_model(model, show_shapes=True, dpi=70)

步骤7:该模型试图输出正确的正确测量值对于每个命令。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 # The command input values to the classical NN.   
 commands = np.array([[0], [1]], dtype=np.float32)   
   
 # The desired Z expectation value at output of quantum circuit.   
 expected_outputs = np.array([[1], [-1]], dtype=np.float32)  

步骤8: 输入电路定义模型将学习纠正的随机错误校准

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
random_rotations = np.random.uniform(0, 2 * np.pi, 3)   
 noisy_preparation = cirq.Circuit(   
   cirq.rx(random_rotations[0])(qubit),   
   cirq.ry(random_rotations[1])(qubit),   
   cirq.rz(random_rotations[2])(qubit)   
 )   
 datapoint_circuits = tfq.convert_to_tensor([   
   noisy_preparation   
 ] * 2)  # Make two copied of this circuit  

步骤9:测试运行tfq模型

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
model([datapoint_circuits, commands]).numpy()

步骤10: 运行一个标准训练过程,将这些值调整为expected_outputs

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
optimizer = tf.keras.optimizers.Adam(learning_rate=0.05)   
 loss = tf.keras.losses.MeanSquaredError()   
 model.compile(optimizer=optimizer, loss=loss)   4. history = model.fit(x=[datapoint_circuits, commands],   
                     y=expected_outputs,   
                     epochs=30,   
                     verbose=0)  
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 plt.plot(history.history['loss'])   
 plt.title("Learning to Control a Qubit")   
 plt.xlabel("Iterations")   
 plt.ylabel("Error in Control")   
 plt.show()  

步骤11: 使用经过训练的模型来纠正量子比特校准错误。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def check_error(command_values, desired_values):   
 """Based on the value in `command_value` see how well you could prepare 
 the full circuit to have `desired_value` when taking expectation w.r.t. Z."""   
   params_to_prepare_output = controller(command_values).numpy()   
   full_circuit = noisy_preparation + model_circuit  
    
   # Test how well you can prepare a state to get expectation the expectation   
   # value in `desired_values`   
   for index in [0, 1]:   
     state = cirq_simulator.simulate(   
         full_circuit,   
         {s:v for (s,v) in zip(control_params, params_to_prepare_output[index])}   
     ).final_state_vector   
     expt = cirq.Z(qubit).expectation_from_state_vector(state, {qubit: 0}).real   
     print(f'For a desired output (expectation) of {desired_values[index]} with'   
           f' noisy preparation, the controller\nnetwork found the following '   
           f'values for theta: {params_to_prepare_output[index]}\nWhich gives an'   
           f' actual expectation of: {expt}\n')   
    
    
 check_error(commands, expected_outputs)  
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-08-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 量子发烧友 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
量子算法与实践--变分量子态对角化算法
变分混合量子—经典算法是近期在量子计算机上有希望实现的一种候选算法。在这些算法中,量子计算机评估一个门序列所耗费的成本与经典的成本评估相比较低,速度上也会更快一些。通过量子计算机评估的门序列信息,最终也可用于经典计算机调整门序列的参数。
量子发烧友
2023/02/24
7660
量子算法与实践--变分量子态对角化算法
QuTrunk与MindSpore量子神经网络初探
QuTrunk 是启科量子开发和已经开源的一款量子编程框架软件产品,关于QuTrunk的详细介绍,用户可以访问启科的开发者社区站点详细了解,也可以进入github上此项目下进行查询。
量子发烧友
2023/03/08
7880
QuTrunk与MindSpore量子神经网络初探
量子算法框架 Cirq 与 NISQ 新时代
量子计算机能够高效运行 Shor 因子分解算法,能够解决对于经典计算机来说不可行的因子分解问题,但我们需要数量非常庞大的量子位——可能需要数百万个。虽然代价巨大,但这项开销却是必须的,但目前大多数量子算法对噪声的影响都非常敏感。
量子发烧友
2023/02/24
7180
量子算法框架 Cirq 与 NISQ 新时代
利用TFQ纠正量子位校准误差
TensorFlow Quantum(TFQ)是谷歌在 2020 年 3 月 9 日宣布推出一个用于量子机器学习的 Python 框架,它能够将机器学习和量子计算结合在一起。这个框架可以构造量子数据集,原型混合量子模型和经典机器学习模型,支持量子电路模拟以及训练判别与生成量子模型等操作。
量子发烧友
2023/02/24
1.2K0
利用TFQ纠正量子位校准误差
量子近似优化算法及其应用
量子近似优化算法(QAOA)是一种经典和量子的混合算法,是一种在基于门的量子计算机上求解组合优化问题的变分方法。一般而言,组合优化的任务就是从有限的对象中寻找使成本最小化的目标对象,在实际生活中的主要应用包括降低供应链成本、车辆路径、作业分配等。
量子发烧友
2023/03/08
1.4K0
量子近似优化算法及其应用
量子+AI:量子计算加速机器学习
量子计算和机器学习都是当前最炙手可热的研究领域。在量子计算方面,理论和硬件的一个个突破性进展让人们看到大规模通用量子计算机的脚步越来越近。在机器学习方面,具备机器学习能力的人工智能在某些方面的能力远超人类。
量子发烧友
2023/02/24
1.4K0
量子+AI:量子计算加速机器学习
Qutrunk与Paddle结合实践--VQA算法示例
QuTrunk 是启科量子开发和已经开源的一款量子编程框架软件产品,它使用 Python 作为宿主语言,利用Python 的语法特性实现针对量子程序的 DSL(领域专用语言),所有支持 Python 编程的 IDE 均可安装使用 QuTrunk。QuTrunk 基于量子逻辑门、量子线路等概念提供量子编程所需的各类API。这些 API 分别由相应的模块实现,比如 QCircuit 实现量子线路功能,Qubit 实现量子比特,Qureg 实现量子寄存器,Command 对应每个量子门操作的指令, Backend 代表运行量子线路的后端模块,gate 模块实现了各类基础量子门操作。同时 QuTrunk 还可以作为其他上层量子计算应用的基础,比如:量子算法、量子可视化编程、量子机器学习等。
量子发烧友
2023/02/24
5260
Qutrunk与Paddle结合实践--VQA算法示例
AI框架分析与介绍
AI 框架是 AI 算法模型设计、训练和验证的一套标准接口、特性库和工具包,集成了算法的封装、数据的调用以及计算资源的使用,同时面向开发者提供了开发界面和高效的执行平台,是现阶段 AI 算法开发的必备工具。
量子发烧友
2023/02/24
4.8K0
AI框架分析与介绍
混合量子-经典体系对量子数据的分类问题
经典计算机中可以利用比特位和逻辑门进行二进制运算,在物理硬件方面,二进制运算主要通过半导体的特殊电性质实现。在量子计算机中,主要利用量子的纠缠和叠加特性通过量子比特位和量子逻辑门来实现运算。量子计算对算力的加速优势也在量子计算机不断发展中得到证实。但关于量子计算机与经典计算机的存在性问题,并非取而代之这么简单。目前,在物理硬件设备基础和量子技术的发展方面,依然无法制造出可以超越经典计算的通用量子计算机。
量子发烧友
2023/03/08
4760
混合量子-经典体系对量子数据的分类问题
量子线性系统算法及实践——以Cirq为例
求解线性方程组是科学计算中的一个基础问题,也可利用线性方程组构造复杂的算法,如数值计算中的插值与拟合、大数据中的线性回归、主成分分析等。而正是由于线性求解问题在学科中的基础性作用,其在科学、工程、金融、经济应用、计算机科学等领域也应用广泛,如常见的天气预报,需要通过建立并求解包含百万变量的线性方程组实现对大气中类似温度、气压、湿度等的模拟和预测;如销量预测,需要采用线性回归方式的时序预测方法进行预测。
量子发烧友
2023/03/08
1.1K0
量子线性系统算法及实践——以Cirq为例
一文概览量子机器学习!
【导读】大家好,我是泳鱼。一个乐于探索和分享AI知识的码农!熟话说,“遇事不决 量子力学!”。当两股科技顶流——量子计算 + 人工智能 相遇,会产生怎么样的火花呢?
算法进阶
2023/08/28
1.2K0
一文概览量子机器学习!
量子算法与实践——Grover算法
量子计算机的算力可体现为量子计算机可实现并行计算, Grover算法(Quantum Search Algorithm)是量子计算领域的主要算法之一。Grover算法是由Grover于1996年提出的平方根加速的随机数据库量子搜索算法,旨在利用量子计算机进行比经典计算机更快的数据搜索。在数据库足够混乱且没有具体的数据结构限定的条件下,Grover算法可以快速解决从N个未分类的客体中寻找出某个特定个体的问题。除搜索时间远短于经典计算外,其强大之处还在于Grover算法的公式可适用于很多问题,比如:密码学、矩阵和图形问题、优化以及量子机器学习等。本文将从Grover算法的实现原理、应用与实践等方面介绍Grover算法。
薛大叔的量子猫
2022/11/07
5K0
实践|量子编程初试
导读 QuBranch与QuTrunk项目是启科量子发起的量子编程软件工具开发项目。QuBranch是以VS Code庞大的生态群为基础,专为量子编程开发的一种编程工具,支持Windows、Mac、Linux等操作系统和编辑、调试、量子模拟执行等功能,可为量子编程提供集成开发环境。QuTrunk是启科量子自主研发的量子编程框架,基于python提供量子编程API,对量子编程涉及到的基本概念做了代码层面的抽象封装和实现,主要为量子编程提供底层服务。为加速量子软件开发与实践进程,本文将简要介绍QuBranch与QuTrunk,并通过软件已开发功能进行量子算法运行演示。
量子发烧友
2023/02/24
6720
实践|量子编程初试
谷歌重磅发布TensorFlow Quantum:首个用于训练量子ML模型的框架
去年 10 月,谷歌宣布首次实现「量子优越性」,用一台 54 量子比特的量子计算机实现了传统架构计算机无法完成的任务。谷歌称,在世界第一超算需要计算 1 万年的实验中,量子计算机只用了 3 分 20 秒。这被视为量子计算领域的里程碑事件,并登上了《自然》杂志 150 周年版的封面。
机器之心
2020/03/11
7150
实践|Bernstein-Vazirani算法及实践
本文将主要介绍Bernstein-Vazirani算法的基本概念、Bernstein-Vazirani问题以及该问提的经典与量子解决方式。本文对Bernstein-Vazirani算法的实现将主要使用启科量子的配套产品量子编程框架QuTrunk、可视化量子编程软件QuBranch以及启科量子自研的量子后端设备QuBox。
量子发烧友
2023/03/08
7090
实践|Bernstein-Vazirani算法及实践
使用Python实现量子计算应用:走进量子世界的大门
量子计算作为一种全新的计算范式,正在逐步改变我们的计算方式。与经典计算机依赖比特(bits)进行信息处理不同,量子计算机使用量子比特(qubits)进行计算,这使得量子计算在处理某些复杂问题上具有巨大的潜力。Python作为一种功能强大且易用的编程语言,为量子计算应用提供了丰富的库和工具。本文将详细介绍如何使用Python实现量子计算应用,涵盖基础知识、环境配置、量子算法实现、代码示例和应用前景等内容。
Echo_Wish
2024/12/24
2860
量子机器学习Variational Quantum Classifier (VQC)简介
变分量子分类器(Variational Quantum Classifier,简称VQC)是一种利用量子计算技术进行分类任务的机器学习算法。它属于量子机器学习算法家族,旨在利用量子计算机的计算能力,潜在地提升经典机器学习方法的性能。
deephub
2023/08/30
5610
量子机器学习Variational Quantum Classifier (VQC)简介
开放量子汇编语言—OpenQASM
OpenQASM(open quantum assembly language),即开放量子汇编语言,是一种命令式编程语言,它的特性类似于硬件描述语言(hardware description language),由 IBM 于 2017 年 7 月在其量子计算平台推出,它能够使用电路模型、基于测量的模型和近期量子计算实验来描述通用的量子计算,也是目前适用范围较广的量子汇编语言,目前已更新至 3.0 版本。
量子发烧友
2023/02/24
1.1K0
开放量子汇编语言—OpenQASM
使用Python实现量子算法优化:探索量子计算的无限可能
量子计算作为一种颠覆性技术,因其在处理复杂问题上的巨大潜力而备受关注。量子算法的优化不仅能提高计算效率,还能拓展量子计算的应用领域。Python作为一种高效且易用的编程语言,为量子算法优化提供了丰富的库和工具。本文将详细介绍如何使用Python实现量子算法优化,涵盖环境配置、依赖安装、量子算法构建、优化与测量和实际应用案例等内容。
Echo_Wish
2024/12/28
2620
量子计算与人工智能
量子计算是一种遵循量子力学规律调控量子信息单元进行计算的新型计算模式,它的处理效率要大大快于传统的通用计算机。那么什么是人工智能,人工智能的发展历程,以及人工智能如何跟量子计算的结合和应用。本篇文章就为大家做个简单分享。
量子发烧友
2023/02/24
1.1K0
量子计算与人工智能
相关推荐
量子算法与实践--变分量子态对角化算法
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验