\u200E
量子计算遇见深度学习(下篇)
发布日期:2021-07-29T09:59:00.000+0000 浏览量:2360次

在上篇教程中,我们介绍了量子计算的基本原理和一些基础概念,其中包括量子比特、常见的量子逻辑门、量子电路和量子测量等等。最终通过量桨运行了量子计算中的“hello world”程序——制备和测量量子纠缠态。相信对于很多读者来说,量子计算和量子编程已经不再是一个完全陌生的概念了。

量桨(Paddle Quantum)是基于百度飞桨(PaddlePaddle)开发的量子机器学习工具集,支持量子神经网络的搭建与训练,提供易用的量子机器学习开发套件与量子优化、量子化学等前沿量子应用工具集,也让飞桨成为了国内最先支持量子机器学习的深度学习平台。在这篇教程中,我们会介绍量子机器学习(Quantum Machine Learning,QML)的相关知识并通过量桨完成QML领域的“hello world”程序——变分量子本征求解器(VQE)[1]。

近期,量子计算领域中一个热门的课题是如何有效地结合量子计算和人工智能技术两者的潜能。量子机器学习QML便是这样一门结合了量子计算与机器学习的交叉学科,一方面研究者们希望利用量子计算的信息处理优势去促进人工智能的发展,另一方面也存在可能性去利用现有的人工智能的技术突破量子计算的研发瓶颈。关于量子机器学习的更多资料可以参考 [2-4]。

图1 经典神经网络与量子神经网络对比图



量子神经网络的基础知识




总的来说,我们要做的是用参数化量子电路(Parametrized Quantum Circuit, PQC)取代传统的神经网络来完成机器学习任务。任务处理的对象可以是经典数据(需要额外的数据加载过程)也可以是量子数据。接着,我们需要设计一个可调节参数的量子电路(PQC),也被称作量子神经网络(Quantum Neural Network, QNN)或者拟设电路(Ansatz),里面的参数是可调节的(大多数情况下是旋转门的角度 )。

如果再加上一个精心设计的损失函数,我们就可以将一个计算问题转化为寻找损失函数的最值问题。然后不断调节电路中的参数直到损失函数下降至收敛(此时损失函数达到最优值或次优值),我们就完成了优化。这样一种在量子设备上估值损失函数然后在经典设备上进行优化的框架被称为量子-经典混合算法,或者变分量子算法(Variational Quantum Algorithm, VQA)。




示例: 如何通过量桨创建量子神经网络 QNN?


QNN 通常可以表示为一些单量子比特旋转门和双比特门的组合。其中一个可以高效利用硬件的架构是只包含 这四种量子门的模板,它们很容易在近期的超导量子设备上实现。以下图为例:

图2组成的简单量子神经网络,共计6个参数

在如上电路图表示中,每条线代表一个量子比特。我们把图最上端的认为是第一个量子比特 ,依次往下。从左到右代表我们施加门的时间顺序,先施加最左边的单比特参数化旋转门。接下来,我们来看看如何在量桨上建造这个简单的三比特量子神经网络:

# 引入必要的包
import numpy as np
import paddle
from paddle_quantum.circuit import UAnsatz
# 随机初始化参数
theta = np.random.rand(6)   

# 我们需要将 Numpy array 转换成飞桨中的 Tensor
theta = paddle.to_tensor(theta)

# 初始化量子电路
num_qubits = 3
cir = UAnsatz(num_qubits)

# 添加单比特旋转门
cir.ry(theta[0], 0)
cir.ry(theta[1], 1)
cir.ry(theta[2], 2)

# 添加两比特门
cir.cnot([01])
cir.cnot([12])

# 添加单比特旋转门
cir.ry(theta[3], 0)
cir.ry(theta[4], 1)
cir.ry(theta[5], 2)

print('图中量子神经网络结构和参数为:')
print(cir) 

这样就得到了一个 构成的组合电路,并可以通过有限个这样的电路的组合,来近似各种不同而复杂的门电路。这里有点像乐高积木,我们可以在积木堆里加入各种各样的小积木然后去拼出一个目标大积木。关于量子门的近似,总体上是一个困难的问题,感兴趣的读者可以参考AI Studio常规赛中的量子电路合成赛题:

链接地址如下:
https://aistudio.baidu.com/aistudio/competition/detail/70

以及量桨官方关于量子神经网络的介绍:
https://qml.baidu.com/quick-start/quantum-neural-network.html



量子机器学习案例




在上一部分,我们介绍了如何构建简单的量子神经网络QNN。但如同经典神经网络一样,网络架构(包括深度、宽度和层连接方式)可以是多种多样的。在最近QNN的研究中,也有和经典的神经架构搜索(Neural Architecture Search,NAS)类似提出通过算法去优化QNN架构的有趣想法。当然除了网络之外,想要完成一个量子机器学习算法,我们还需要一个针对具体问题的损失函数来引导QNN中参数(或者结构)的优化方向。

例如用经典的神经网络进行图片多分类时,我们会选取交叉熵损失函数。接下来我们来看看一个具体案例,用于处理量子化学问题的变分量子本征求解器 (Variational Quantum Eigensolver,VQE)[1]。



用 VQE求解氢分子的基态能量


求解给定分子的基态和基态能量是量子化学中的一个重要问题,这些信息可以帮助预测化学反应速率和分子的稳定结构等等[5]。当分子的构成较为复杂时,经典的计算方法可能无法有效的处理这类量子数据。但在量子计算机上,由于其架构本身带来的存储和运算上的优势可以高效地处理量子问题。在VQE中我们把量子态(波函数)关于分子哈密顿量的期望值作为损失函数并通过优化方法求解其最小值,优化完成后即可得到对分子基态能量的估计:
其中U(θ)为QNN的酉矩阵表示(θ 类似于经典神经网络中的权重),H是分子的哈密顿量,不熟悉相关物理的读者可以将其简单看作是一个维度很大包含了分子信息的稀疏矩阵。这里我们以氢分子(最简单的分子系统)的哈密顿量为例:


上述结构通常被称为泡利字符串(Pauli string)的形式,其中{X, Y, Z}是泡利矩阵,I表示单位矩阵,符号表示张量积(一般会默认在字符串中省略张量积符号)。量桨对这类分子哈密顿量数据格式提供了原生的支持。接下来我们就一起过一遍完整的代码!

# 导入相关库
import numpy as np
import paddle
from paddle_quantum.circuit import UAnsatz
from paddle_quantum.utils import pauli_str_to_matrix
from paddle_quantum.VQE.chemistrysub import H2_generator

# 读取内置好的泡利字符串形式的氢分子哈密顿量
Hamiltonian, N = H2_generator()    # N 表示量子比特个数,这里为4

# 超参数设置
ITR = 80     # 设置训练的总迭代次数
LR = 0.4     # 设置学习率
D = 2        # 设置量子神经网络中重复计算模块的深度 Depth   

# 把记录的关于哈密顿量的转化为矩阵表示
H_matrix = pauli_str_to_matrix(Hamiltonian, N)

对于QNN的构造,我们这里选取和图2中类似的由 组成的模块化QNN。可以重复同一模块加深QNN的表达能力,这点和增加经典神经网络的深度是异曲同工的。注意这里我们直接调用了在量桨中内置好的网络模板 `real_entangled_layer`。读者可以在量桨API中找到更为详细的说明。

API地址:
https://qml.baidu.com/api/paddle_quantum.circuit.uansatz.html#paddle_quantum.circuit.UAnsatz.real_entangled_layer

# 构造量子神经网路
def U_theta(theta, Hamiltonian, N, D):
    """
    Quantum Neural Network
    """


    # 按照量子比特数量/网络宽度初始化量子神经网络
    cir = UAnsatz(N)

    # 内置的 {R_y + CNOT} 电路模板
    cir.real_entangled_layer(theta[:D], D)

    # 量子神经网络作用在默认的初始态 |0000>上
    cir.run_state_vector()

    # 计算给定哈密顿量的期望值,也就是损失函数
    loss = cir.expecval(Hamiltonian)

    return loss, cir

class vqeNet(paddle.nn.Layer):
    def __init__(self, shape, dtype="float64"):
        super(vqeNet, self).__init__()

        # 初始化 theta 参数列表,并用 [0, 2*pi] 的均匀分布来填充初始值
        self.theta = self.create_parameter(shape=shape, 
                                           default_initializer=paddle.nn.initializer.Uniform(low=0.0, high=2*np.pi),
                                           dtype=dtype, is_bias=False)

    # 定义损失函数和前向传播机制
    def forward(self, N, D):

        # 计算损失函数/期望值
        loss, cir = U_theta(self.theta, Hamiltonian, N, D)

        return loss, cir

# 确定网络的参数维度
net = vqeNet(shape=[D, N, 1])

# 我们利用Adam优化器来获得相对好的收敛
opt = paddle.optimizer.Adam(learning_rate=LR, parameters=net.parameters())

# 优化循环
for itr in range(1, ITR + 1):

    # 前向传播计算损失函数
    loss, cir = net(N, D)

    # 在动态图机制下,反向传播极小化损失函数
    loss.backward()
    opt.minimize(loss)
    opt.clear_grad()

    # 打印结果
    if itr % 20 == 0:
        print("循环:", itr, "VQE估计出的基态能量:""%.4f Ha" 
                                            % loss.numpy())
    if itr == ITR:
        print("和真实基态能量的误差为:"100*np.abs(loss.numpy()+1.136189454065923)/(1.136189454065923), "%")
        print("\n训练后的QNN:"
        print(cir)

循环:20 VQE估计出的基态能量:-1.0521 Ha
循环:40 VQE估计出的基态能量:-1.1233 Ha
循环:60 VQE估计出的基态能量:-1.1358 Ha
循环:80 VQE估计出的基态能量:-1.1361 Ha
和真实基态能量的误差为:0.00850696%

训练后的QNN:
--Ry(4.709)----*--------------X----Ry(1.573)----*--------------X--
            |           |              |          |  
--Ry(4.712)----X----*---------|----Ry(1.366)----X----*---------|--
                |       |                  |      |  
--Ry(1.560)---------X----*----|----Ry(1.576)---------X----*----|--
                    |   |                     |   |  
--Ry(1.561)--------------X----*----Ry(-1.58)--------------X----*--

感兴趣的读者可以移步至量桨官方VQE教程:
https://qml.baidu.com/tutorials/quantum-simulation/variational-quantum-eigensolver.html

可以看到,经过80个iteration的优化循环之后计算得到的基态能量就收敛到跟真实的基态能量差不多的情况(<0.01%),同时使用print(cir)命令即可把参数化量子电路图画出来。感兴趣的读者可以进一步移步到量桨教程官网,尝试分析更多化学分子。上面还有其他很多好玩的,比如量子生成对抗网络(QGAN)、量子分类器(Quantum Classifier)、量子核方法(Quantum Kernel Method)等等。期待好学的朋友们进入神奇的量子世界尽情探索!

量桨教程:
https://qml.baidu.com/tutorials/overview.html

百度量子计算研究所所长段润尧教授介绍迈向量子人工智能的演讲:
http://mbd.baidu.com/webpage?type=live&action=liveshow&source=h5pre&room_id=4108954503



结束语




至此,相关内容已经阐述完毕,更深入的学习还需要大家自行探索。让我们荡起双桨,在AI的海洋乘风破浪!因为水平有限,难免有不足之处,还请大家多多帮助。

上篇链接:
量子计算遇见深度学习(上篇)

量桨官网:
https://qml.baidu.com




参考文献


[1] [Peruzzo, A. et al. A variational eigenvalue solver on a photonic quantum processor. Nat. Commun. 5, 4213 (2014).](https://www.nature.com/articles/ncomms5213)

[2] Biamonte, J. et al. Quantum machine learning. [Nature 549, 195–202 (2017).](https://www.nature.com/articles/nature23474)

[3] Schuld, M., Sinayskiy, I. & Petruccione, F. An introduction to quantum machine learning. [Contemp. Phys. 56, 172–185 (2015).](https://www.tandfonline.com/doi/abs/10.1080/00107514.2014.964942)

[4] Benedetti, M., Lloyd, E., Sack, S. & Fiorentini, M. Parameterized quantum circuits as machine learning models. [Quantum Sci. Technol. 4, 043001 (2019).](https://iopscience.iop.org/article/10.1088/2058-9565/ab4eb5)

[5] Helgaker, Trygve, Poul Jorgensen, and Jeppe Olsen. Molecular electronic-structure theory. John Wiley & Sons, 2014.


如有飞桨相关技术有问题,欢迎在飞桨论坛中提问交流:
http://discuss.paddlepaddle.org.cn/

欢迎加入官方QQ群获取最新活动资讯:793866180

如果您想详细了解更多飞桨的相关内容,请参阅以下文档。

·飞桨官网地址·
https://www.paddlepaddle.org.cn/

·飞桨开源框架项目地址·
GitHub: https://github.com/PaddlePaddle/Paddle 
Gitee: https://gitee.com/paddlepaddle/Paddle

长按上方二维码立即star!


飞桨(PaddlePaddle)以百度多年的深度学习技术研究和业务应用为基础,集深度学习核心训练和推理框架、基础模型库、端到端开发套件和丰富的工具组件于一体,是中国首个自主研发、功能丰富、开源开放的产业级深度学习平台。飞桨企业版针对企业级需求增强了相应特性,包含零门槛AI开发平台EasyDL和全功能AI开发平台BML。EasyDL主要面向中小企业,提供零门槛、预置丰富网络和模型、便捷高效的开发平台;BML是为大型企业提供的功能全面、可灵活定制和被深度集成的开发平台。


END