01、关于昇思MindSpore项目介绍
1.项目名称
基于昇思MindSpore Quantum,实现量子虚时演化算法
2.项目链接
https://summer-ospp.ac.cn/#/org/prodetail/221cb0176
3.项目描述
在本次项目中,我们将运用MindSpore Quantum框架在量子线路上完成虚时演化算法的实现,并运用算法程序解决一些量子多体系统的基态能求解问题。
02、项目开发理论描述
1.项目名称
摘要
虚时演化方法是研究量子体系的非常强大的一个工具。不仅在含时演化问题中常常用到,并且还可以用来计算多体系统Hamiltonian的基态问题即虚时演化算法。尽管在经典计算机上实现这一算法来求解多体系统的基态能是可行的,但是由于随着体系尺寸的扩大内存和计算时间的需求会指数级增长。
而由于量子计算的特性,量子计算机可以很高效的模拟量子体系,但是如何在量子线路上模拟这种非幺正的虚时演化是一个问题。所以在本次2022开源之夏活动中,我们将聚焦这一问题,思考能否在量子计算机中,用量子线路的方式实现这种量子虚时演化算法来解决一些分子体系的基态能问题。
事实上,近些年来在这个问题上已经有一些显著的研究。比喻说,在这篇文章中[Motta, Mario, et al.Nature Physics 16.2 (2020): 205-210]【1】,作者提出一种QITE(Quantum Imaginary Time Evolution)算法,指出在量子线路中实现非幺正的演化算符是有可能的。
除此之外,在另一篇文章中[McArdle, Sam, et al.npj Quantum Information 5.1 (2019): 1-6.]【2】也提出了一种实现方式。不同于前者,McArdle et al. 指出一种基于变分算法来实现虚时演化的途径,称之为VITE(Variational Quantum Imaginary Time Evolution)算法。并且在文中向读者展示了这一算法针对分子体系的基态能求解问题的有效性。除此之外,我们还发现这一基于变分途径实现的算法非常适合在量子线路上实现。
又由于[MindSpore Quantum]【3】恰好给我们提供了简洁又高效的工具来搭建量子线路,实现文中提出来的算法。于是在本次开源之夏项目中,我们将基于MindSpore Quantum其强大的功能,在验证VITE算法有效性的基础上,思考其针对更大的分子体系的可能以及最后我们还将探究线路噪声对算法的影响。
理论详解
对于一个量子体系,我们常常可以用一个多体Hamiltonian $H$。如果给定一个任意初始态 $| \psi \rangle$,那么其虚时演化可以定义为:
$$
| \psi (\tau) \rangle = A(\tau) e^{-H \tau} | \psi (0) \rangle
$$
其中$A(\tau) = 1/ \sqrt{\langle \psi(0)| e^{-2H\tau}| \psi(0) \rangle}$是归一化系数。而如果初始态与基态有一个非零的overlap,那么在 $\tau \to \infty$ 时演化的末态将趋于$H$的基态。正是由于这一特性,我们可以通过选取合适的初始态,通过模拟其虚时演化的过程来求解体系的基态波函数和能量。
而在量子线路中,我们可以运用含参的量子态$| \phi (\vec{\theta}(\tau)) \rangle$来近似得到演化态,其中:
$\vec{\theta}(\tau) = ( \theta_1(\tau), \theta_2(\tau),\ldots, \theta_N(\tau) )$
而这样一来,我们就可以运用量子门在量子线路上制备这一含参态。具体做法是,我们可以将一系列的量子门:
$$ V(\vec{\theta}) = U_N(\theta_N) \ldots U_k(\theta_k) \ldots U_1(\theta_1) $$
作用在初始态零态$|\bar{0} \rangle$上即可 i.e. $|\phi(\vec{\theta}) \rangle = V(\vec{\theta}) | \bar{0} \rangle$。这里的$V(\vec{\theta})$将其称之为我们的Ansatz线路。
而如果我们对含参的演化态运用麦克阿兰变分原理(McLachlan's variational principle),可以得到:
$$
\delta || \left( \partial/\partial \tau + H - E_{\tau} \right) | \psi(\tau) \rangle || = 0
$$
其中:
$|| \rho || = Tr \left[ \sqrt{\rho \rho^{\dagger}} \right]$,$E_{\tau} = \langle \psi{\tau} | H | \psi{\tau} \rangle$
所以我们可以基于变分原理,将$| \psi (\tau) \rangle$ 替换为 $| \phi (\tau) \rangle = | \phi (\vec{\theta}(\tau))$。这样一来,我们就有了:
$$
\begin{align}
|| \partial/ \partial \tau + H - E_{\tau} | \psi(\tau) \rangle ||
& =
\left( (\partial/\partial \tau + H - E_{\tau}) | \psi(\tau) \rangle \right)^{\dagger}
\left( (\partial/\partial \tau + H - E_{\tau}) | \psi(\tau) \rangle \right) \\
& =
\sum_{i,j} \frac{\partial \langle \phi (\tau) |}{\partial \theta_i} \frac{\partial | \phi (\tau) \rangle}{\partial \theta_j} \dot{\theta_i} \dot{\theta_j} + \sum_{i} \frac{\partial \langle \phi(\tau)|}{\partial \theta_i} \left( H - E_{\tau} \right) | \phi(\tau)\rangle \dot{\theta_i} \\
& =
\sum_{i} \langle \phi(\tau)| (H - E_\tau) \frac{\partial | \phi (\tau)\rangle}{\partial \theta_i} \dot{\theta_i}
+ \langle \phi(\tau)| \left( H - E_\tau \right)^2 | \phi(\tau)\rangle.
\end{align}
$$
对于 $\dot{\theta_i}$,我们有:
$$\begin{align}
\frac{(\partial || \partial / \partial \tau + H - E_\tau ) | \phi(\tau) \rangle||}{\partial \dot{\theta_i}}
& = \sum_{j} \left( \frac{\partial \langle \phi(\tau)|}{\partial \theta_i} \frac{\partial | \phi (\tau) \rangle}{\partial \theta_j} + \frac{\partial \langle \phi (\tau)|}{\partial \theta_j} \frac{\partial | \phi (\tau) \rangle}{\partial \theta_i} \right) \dot{\theta_j} \\
& + \frac{\partial \langle \phi (\tau)|}{\partial \theta_i} (H - E_\tau)|\phi(\tau) \rangle + \langle \phi (\tau) | (H - E_\tau) \frac{\partial \phi (\tau) \rangle}{\partial \theta_i}
\end{align}
$$
考虑到演化态 $| \phi (\tau) \rangle$的归一化条件:
$$ \langle \phi(\tau)| \phi(\tau) \rangle = 1,$$
于是我们有:
$$
E_\tau \frac{\partial \langle \phi(\tau)|\phi(\tau)\rangle}{\partial \theta_i}
= E_\tau \left( \frac{\partial \langle \phi (\tau) |}{\partial \theta_i} | \phi(\tau) \rangle
+ \langle \phi(\tau)| \frac{\partial | \phi (\tau) \rangle}{\partial \theta_i} \right) = 0
$$
我们将其带回到偏导式中,可以化简为:
$$
\frac{\partial || (\partial / \partial \tau + H - E_\tau) | \phi (\tau) \rangle ||}{\partial \dot{\theta_i}}
= \sum_{j} A_{ij} \dot{\theta}_j - C_i.
$$
其中:
$$
A_{ij} = \Re \left( \frac{\partial \phi(\tau)|}{\partial \theta_i} \frac{\partial | \phi (\tau) \rangle}{\partial \theta_j}\right),
$$
$$
C_i = - \Re \left( \frac{\partial \langle \phi (\tau)|}{\partial \theta_i} H | \phi (\tau) \rangle \right).
$$
而麦克阿兰变分原理要求:
$$
\frac{\partial || (\partial / \partial \tau + H - E_\tau)| \phi(\tau) \rangle||}{\partial \dot{\theta}_j} = 0,
$$
那这就等价于:
$$
\sum_j A_{ij} \dot{\theta}_j = C_i
$$
至此,我们运用参数化的Ansatz线路来得到含参的演化态,借助麦克阿兰变分原理将虚时演化的过程转化为一个在量子线路上实现的一个演化过程,并且其给出了我们Ansatz线路的参数更新的要满足的要求。
算法初步实现-基于MindSpore Quantum
通过以上理论推导,不难发现若对于一个给定的量子多体体系,我们要实现VITE算法,可以将其分解成三个问题:
(1)量子体系的Hamiltonian的表达
(2)合适的Ansatz线路的选择
(3)$A_{ij}$ 矩阵和 $C_i$ 向量的计算以及参数的更新。
前两个问题和具体要处理的量子体系有关,虽也有很多细节但并不是本次开源之夏项目重点,如若有疑问可以观看我之前关于这部分内容的线上分享[2022量子计算Hackthon大赛分享]【4】。而本节我将针对第三个问题,简单解释如何基于MindSpore Quantum解决这一问题。幸运的是在0.7.0及以上版本的MindSpore Quantum库里,更新了Quantum Fisher Information板块,其中的函数`mindquantum.core.circuit.partial_psi_partial_psi(circuit, backend)`给了一种很好的方式去计算$A_{ij}$ 矩阵。其具体原理是:对于一个初始态$|\bar{0} \rangle$,如果我们对其演化一系列的幺正量子门。
$$ V(\vec{\theta}) = U_N(\theta_N) \ldots U_k(\theta_k) \ldots U_1(\theta_1) $$
得到末态:
$|\psi(\vec{\theta}) \rangle = V(\vec{\theta}) | \bar{0} \rangle$
那么有:
$$A_{ij} = \partial \langle \psi | \partial \psi \rangle =
\begin{pmatrix}
\langle \bar{0} | \partial U_1^{\dagger} \partial U_1 | \bar{0} \rangle &
\langle \bar{0} | \partial U_1^{\dagger} U_2^{\dagger} \partial U_2 U_1 | \bar{0} \rangle &
\cdots &
\langle \bar{0} | \partial U_1^{\dagger} \ldots U_k^{\dagger} \partial U_k \ldots U_1| \bar{0} \rangle \\
\vdots & \vdots & \ddots & \vdots \\
\langle \bar{0} | U_1^{\dagger} \ldots \partial U_k^{\dagger} U_k \ldots \partial U_1| \bar{0} \rangle &
\langle \bar{0} | U_1^{\dagger} \ldots \partial U_k^{\dagger} U_k \ldots \partial U_2 U_1| \bar{0} \rangle &
\cdots &
\langle \bar{0} | U_1^{\dagger} \ldots \partial U_k^{\dagger} \partial U_k \ldots U_2 U_1| \bar{0} \rangle\\
\end{pmatrix}$$
然而在真实的MindSpore Quantum含参的量子线路中,其情况将更加复杂,这时每个量子门有可能为$U_i(y(\vec{\theta_i}))$。我们运用链式法则,可以将末态表达为:
$|\psi(\vec{y}) \rangle = V(\vec{y}) | \bar{0} \rangle$
而这时有:
$$
A_{\theta_i, \theta_j} = \left( \sum_k \partial_{\theta_i} y_k \partial_{y_k} \langle \psi | \right)
\left( \sum_l \partial_{\theta_j} y_l \partial_{y_l} | \psi \rangle \right)
= \sum_{k,l} \frac{\partial y_k}{\partial x_i} \frac{\partial y_l}{\partial x_j} A_{y_k, y_l}
$$
其中:
$A_{\theta_i, \theta_j} = \partial_{x_i} \langle \psi | \partial_{x_j} | \psi \rangle$
若引入雅可比矩阵:
$$
J = \frac{\partial (y_1, y_2, \ldots y_m)}{\partial (\theta_1, \theta_2, \ldots \theta_n)} =
\begin{pmatrix}
\frac{\partial y_1}{\partial \theta_1} & \cdots & \frac{\partial y_1}{\partial \theta_n}\\
\vdots & \ddots & \vdots \\
\frac{\partial y_m}{\partial \theta_1} & \cdots & \frac{\partial y_m}{\partial \theta_n}
\end{pmatrix}
$$
则有:
$A_{\theta} =J^{\dagger} A_y J$
有了以上理论推导,借助`mindspore.simulator.apply_gate(gate, pr=None, diff=False)`端口即可完成$A_{ij}$ 矩阵的计算。而用同样的思想也可以得到$C_i$,对应在项目内的`get_ci_matrix(circuit, backend='projectq')`函数。
这样借助`partial_psi_partial_psi(circuit, backend)`和`get_ci_matrix(circuit, backend='projectq')`我们就可以得到$A_{ij}$ 矩阵和 $C_i$ 向量。然而由第二节的算法推导告诉我们,还需要计算参数所满足的线性方程。然而由于$A_{ij}$ 矩阵的特性,其不一定是可逆矩阵,所以这里可以采取SVD分解来近似求解线性方程组的解。
初步验证算法有效性
首先我们在简单分子体系中来验证算法实现的正确性和有效性。我们选取了氢分子来完成这项工作。在做了一些近似之后,可以将氢分子的Hamiltonian表达为:
$$
H = g_0 I + g_1 Z_0 + g_2 Z_1 + g_3 Z_0Z_1 + g_4 Y_0Y_1 + g_5X_0X_1
$$
在这里我们选取所谓的universal ansatz,调用前面完成的端口来实现VITE算法。
这里给出算法的结果:
从结果中我们算法每一步变分迭代得到的能量和精确能量的对比中可以看到,我们的算法实现确实验证的VITE这一算法。并且从结果分析,对于氢分子这样简单的量子体系我们基于MindSpore Quantum的算法实现可以非常高效的得到其基态能量,在经过几步的迭代就可以快速收敛到精确能量。
进一步运用在更复杂的分子体系上
在验证得到算法的有效性之后,我们思考能否将VITE算法运用到更加复杂的分子体系中呢?这里我们进一步将算法运用到LiH分子体系的基态能求解问题上。下图是我们的结果:
可以看到在经过20次左右的迭代之后,其能量依然可以很好的收敛到FCI能量。但是我们也可以发现其收敛结果比起氢分子体系要差一些,并且收敛时间也要长很多。这里由于计算资源的限制,我们无法将VITE算法拓展到更大的分子体系之中,但是我们将算法封装成`VQEoptimizer`类,其中包含着丰富的端口,其算法的实现并不需要随着分子的改变而改变。如读者需要,以及计算资源足够,可以很快的借助`VQEoptimizer`类的`imag_time_evolution(operator=None, circuit=None)`函数即可完成VITE的算法实现。
进一步分析噪声对算法带来的影响
到此,我们已经完成了VITE算法的初步实现和扩展,完成了项目的基本需求。但是我们并没有止步于此,我们进一步思考针对这样一种算法,是否可以探究量子线路噪声对算法带来的影响。因为在现阶段NISQ时代的量子线路的实际实验实现,将不可避免的引入噪声。那么探究噪声的影响将对于这一算法的实际实现至关重要。
而要探究这一课题,我们首先面临的问题即如何在MindSpore Quantum的框架下来引入量子噪声。量子噪声分为两种类型:相干噪声和非相干噪声。相干噪声一般来源于门操作中参数的噪声化,因此是幺正演化并且易于模拟;非相干噪声则来源于系统与环境的相互作用,因此通常是非幺正演化,会使量子系统从纯态变为混态,这个过程也被称为量子信道(Quantum channel)。比喻说最典型的泡利信道(Pauli Channel)即当进行了某种量子操作后,线路有概率额外受到一个泡利门的影响。泡利信道中有一类$X,Y,Z$三个门平分概率的情况,称为去极化信道,其数学表达为:
$$
\epsilon_{DF}(\rho) = (1-p)\rho + \frac{p}{3}(X\rho X + Y\rho Y + Z\rho Z)
$$
这里的$p$即线路收到噪声影响的概率。
在MindSpore Quantum已经有一些量子信道的噪声模拟端口,比如说`mindquantum.core.gates.DepolarizingChannel`。但是我们发现,这些已有的端口只能运用在没有梯度计算的线路上,也就是说在我们的算法不可以直接调用MindSpore Quantum的函数来模拟这一过程。这就需要我们在实现的VITE算法Ansatz线路上设计算法,来模拟量子信道的噪声影响。在程序中我们运用蒙特卡洛方法,其中每一个量子门会以一定概率引入去极化信道,通过对线路的多次采样,可以得到含噪声量子线路的模拟运行结果。其算法实现在`sampling_aij(circ, param, shots, p)`,`noise_VITE(circ, shots, p)`,`noise_circ(circ, p)`1函数中。而后我们运用之前的`VQEoptimizer`类和我们的noise板块函数在前面我们模拟过的氢分子和LiH体系重新运用含噪声的VITE算法,以下是结果:
可以从图中看到,对于不管是对于氢分子还是LiH分子,当引入量子噪声之后其算法的收敛性将会受到影响,而且会随着噪声的增大其收敛性会越来越差。其次在两个分子体系中的对比也可以看出随着分子体系的复杂度提升,其算法的对于噪声鲁棒性也会降低。可以看到这些结论都符合我们之前的猜想以及物理的直觉。这也说明我们噪声模拟算法的实现是有效的。
我们还可以看到,从我们的结果可以看到,在一定范围的噪声影响下,我们实现的VITE算法依然可以收敛到可接受的能量值,并且更重要的是可以从我们的程序中得到具体的算法失效对应的噪声值,这将给算法的实际实现提供一个参考区间,而这也是我们探究这一问题之余带来的收获。同样由于计算资源和项目时间的限制,我们并未探究更多种量子噪声带来的影响,但是我们考虑到这些需求,读者只需要自行设计改动`noise_circ(circ, p)`到需要的不同噪声种类,依然可以完成这一问题的探究。
2.遇到的问题及解决方案
如何在量子线路完成虚时演化算法?
解决方案:阅读文献,对比不同算法的原理。并最终确定关注于variational imaginary time evolution(VITE)算法。
如何基于MindSpore Quantum程序库去实现VITE算法所需的核心函数?
解决方案:首先基于线路自己实现求梯度方案,但发现效率并不高。无法支持算法的验证工作。于是借助MindSpore Quantum已有的quantum fisher information板块,基于其实现原理,自己优化并搭建其他所需函数。
如何基于算法完成复杂分子体系的基态能求解?
解决方案:借助量子化学相关知识简化分子体系的Hamiltonian,使其能够在有限计算资源情况下仍然能够运用算法程序完成所需计算。
如何在MindSpore Quantum实现的噪声量子线路上实现梯度计算?
解决方案:因为MindSpore Quantum尚未包含含噪声线路的梯度计算。于是借助Monte Carlo思想,构建算法来模拟含噪声线路的梯度计算,并验证噪声对于VITE算法的影响。
3.更多思考
基于本次开源之夏项目的开发,思考能否将VITE算法运用到更多的量子多体体系上并探究其效果差异;思考VITE算法与传统的GD等梯度算法在对于分子体系基态能求解上表现的不同;思考其他类型噪声对于算法的影响。