{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 含噪声量子线路\n", "\n", "[![下载Notebook](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/r2.2/resource/_static/logo_notebook.svg)](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/notebook/r2.2/mindquantum/zh_cn/mindspore_noise.ipynb) \n", "[![下载样例代码](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/r2.2/resource/_static/logo_download_code.svg)](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/notebook/r2.2/mindquantum/zh_cn/mindspore_noise.py) \n", "[![查看源文件](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/r2.2/resource/_static/logo_source.svg)](https://gitee.com/mindspore/docs/blob/r2.2/docs/mindquantum/docs/source_zh_cn/noise.ipynb) \n", "[![在ModelArts平台运行](https://mindspore-website.obs.cn-north-4.myhuaweicloud.com/website-images/r2.2/resource/_static/logo_modelarts.svg)](https://authoring-modelarts-cnnorth4.huaweicloud.com/console/lab?share-url-b64=aHR0cHM6Ly9taW5kc3BvcmUtd2Vic2l0ZS5vYnMuY24tbm9ydGgtNC5teWh1YXdlaWNsb3VkLmNvbS9ub3RlYm9vay9yMi4yL21pbmRxdWFudHVtL3poX2NuL21pbmRzcG9yZV9ub2lzZS5pcHluYg%3D%3D&imageid=c8303381-a19d-453c-b3c2-4c03de5025de)\n", "\n", "## 概述\n", "\n", "在真实量子设备中,由于现阶段技术的不成熟,量子系统会由于量子操作、环境影响等各种因素而产生噪声。现阶段噪声对量子设备的影响不可忽略,因此在量子线路中加入对噪声的模拟,可以帮助我们寻找对噪声具有鲁棒性的量子算法,或设计减少噪声影响的纠错方案。\n", "\n", "噪声分为两种类型:相干噪声和非相干噪声。相干噪声一般来源于门操作中参数的噪声化,因此是幺正演化并且易于模拟;非相干噪声则来源于系统与环境的相互作用,因此通常是非幺正演化,会使量子系统从纯态变为混态,这个过程也被称为量子信道(Quantum channel)。混态的量子系统通常用密度矩阵的形式表示,但也可以通过“采样-统计”的蒙特卡洛法得到统计模拟结果。在MindSpore Quantum中,我们用蒙特卡洛法来模拟量子信道,其中噪声门会以一定概率影响量子比特,通过对线路的多次采样,可以得到含噪声量子线路的模拟运行结果。\n", "\n", "量子信道的数学表示如下:\n", "\n", "$$\n", "\\varepsilon(\\rho) =\\sum_{k=0}^{m-1} E_{k} \\rho E_{k}^{\\dagger}\n", "$$\n", "\n", "其中$\\{E_k\\}$是Kraus算符,需要满足完备性条件$\\sum_k E_k^\\dagger E_k= I$;$\\rho$是量子态的密度矩阵,$\\varepsilon(\\rho)$是演化后的量子态。\n", "\n", "## 泡利信道(Pauli Channel)\n", "\n", "有一类噪声对量子线路的影响体现为,当进行了某种量子操作后,线路有概率额外受到一个泡利门的影响,被称为泡利信道。例如,经过某个操作后比特以一定概率被额外作用一个`X`门,即该比特以一定概率发生了翻转,这就是比特翻转信道(Bit Flip Channel),数学表示为:\n", "\n", "$$\n", "\\varepsilon_{BF}( \\rho ) =(1-p)I \\rho I +pX \\rho X\n", "$$\n", "\n", "其中$I$是单位矩阵,$X$是泡利`X`门。该信道对应的Kraus算符为:\n", "\n", "$$\n", "E_0=\\sqrt{1-p}\\begin{bmatrix}\n", "1 & 0\\\\\n", "0 & 1\n", "\\end{bmatrix}, E_{1} =\\sqrt{p}\\begin{bmatrix}\n", "0 & 1\\\\\n", "1 & 0\n", "\\end{bmatrix}\n", "$$\n", "\n", "其中$p$可以视为发生比特翻转的概率。由这个例子可以看到,一个纯态量子态经过比特翻转信道后会变为混态,该混态由原本的态和比特翻转后的态构成。\n", "\n", "同理,若比特以一定概率额外作用一个`Z`门称为相位翻转信道,`Y`门是比特相位翻转信道。若是`X`、`Y`、`Z`三个门平分概率,则称为去极化信道,该信道常常被用来描述真实量子硬件中门操作产生的噪声。此外,也可以使用通用的泡利信道自定义三个泡利门的概率。\n", "\n", "下面是这些信道的数学表示。\n", "\n", "泡利信道(Pauli Channel):\n", "\n", "$$\n", "\\varepsilon _{Pauli}( \\rho ) =(1-p_x-p_y-p_z)\\rho + p_x X \\rho X+ p_y Y \\rho Y+p_z Z \\rho Z\n", "$$\n", "\n", "相位翻转信道(Phase Flip Channel):\n", "\n", "$$\n", "\\varepsilon _{PF}( \\rho ) =(1-p)\\rho +pZ \\rho Z\n", "$$\n", "\n", "比特相位翻转信道(Bit-Phase Flip Channel):\n", "\n", "$$\n", "\\varepsilon _{BPF}( \\rho ) =(1-p)\\rho +pY \\rho Y\n", "$$\n", "\n", "去极化信道(Depolarizing Channel):\n", "\n", "$$\n", "\\varepsilon _{DF}( \\rho ) =(1-p)\\rho + \\frac{p}{3}(X \\rho X+ Y \\rho Y+Z \\rho Z)\n", "$$\n", "\n", "下面我们以去极化信道为例,看看如何将噪声信道加入线路中。" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "q0: X DC p=1/10 " ], "text/plain": [ "" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from mindquantum.core.gates import DepolarizingChannel, X\n", "from mindquantum.core.circuit import Circuit\n", "\n", "circ = Circuit()\n", "circ += X.on(0)\n", "circ += DepolarizingChannel(0.1).on(0)\n", "circ.measure(0)\n", "circ.svg()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "此时我们成功搭建了一个单比特的量子线路,该比特在作用`X`门后,会受到去极化噪声的影响,具体表现为有10%概率额外作用一个泡利门,其中`X`、`Y`、`Z`门平分概率。\n", "\n", "现在我们对该线路进行1000次模拟并输出采样结果:" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "Shots:\n", " 1000 Keys: q0 0.0 0.189 0.378 0.567 0.756 0.945 0 55 1 945 probability " ], "text/plain": [ "" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from mindquantum.simulator import Simulator\n", "\n", "sim = Simulator('mqvector', 1)\n", "result = sim.sampling(circ, shots=1000)\n", "result.svg()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "倘若没有噪声影响,量子态应该处于$|1\\rangle$态,测量结果全为1,但在以上结果中,约有7%的模拟结果测得为0,这就是去极化信道产生的影响。采样结果与预期中3.3%概率额外作用`X`门、`Y`门和`Z`门的预测结果相符。\n", "\n", "至此我们就完成了一次对含去极化噪声量子线路的模拟。\n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 阻尼信道(Damping Channel)\n", "\n", "振幅阻尼信道(Amplitude Damping Channel)和相位阻尼信道(Phase Damping Channel)也是比较常见的信道,其中振幅阻尼信道描述了量子系统能量的耗散,相位阻尼信道则描述了系统量子信息的损失。具体来说,振幅阻尼信道会使量子比特从激发态回到基态,相位阻尼信道则会使量子比特从叠加态退回到坍缩态。\n", "\n", "振幅阻尼信道的表达形式为:\n", "\n", "$$\n", "\\varepsilon_{AD}( \\rho ) =E_{0} \\rho E_{0}^{\\dagger } +E_{1} \\rho E_{1}^{\\dagger }\n", "$$\n", "\n", "其中$E_{0}, E_{1}$是Kraus算符,\n", "\n", "$$\n", "E_{0} =\\begin{bmatrix}\n", "1 & 0\\\\\n", "0 & \\sqrt{1-\\gamma }\n", "\\end{bmatrix}, E_{1} =\\begin{bmatrix}\n", "0 & \\sqrt{\\gamma }\\\\\n", "0 & 0\n", "\\end{bmatrix}\n", "$$\n", "\n", "$\\gamma$为耗散系数。\n", "\n", "相位阻尼信道的表达形式为:\n", "\n", "$$\n", "\\varepsilon_{PD}( \\rho ) =E_{0} \\rho E_{0}^{\\dagger } +E_{1} \\rho E_{1}^{\\dagger }\n", "$$\n", "\n", "其中\n", "\n", "$$\n", "E_{0} =\\begin{bmatrix}\n", "1 & 0\\\\\n", "0 & \\sqrt{1-\\gamma }\n", "\\end{bmatrix}, E_{1} =\\begin{bmatrix}\n", "0 & 0\\\\\n", "0 & \\sqrt{\\gamma }\n", "\\end{bmatrix}\n", "$$\n", "\n", "$\\gamma$为损失系数。\n", "\n", "由以上两式可以发现,阻尼信道的Kraus算符不具有幺正性,因此阻尼信道不能表示为以一定概率作用量子门的形式。\n", "接下来我们来看看两个阻尼信道的效果,首先是振幅阻尼信道。" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "q0: H ADC γ=4/5 " ], "text/plain": [ "" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from mindquantum.core.gates import AmplitudeDampingChannel, H\n", "\n", "circ2 = Circuit()\n", "circ2 += H.on(0)\n", "circ2 += AmplitudeDampingChannel(0.8).on(0)\n", "circ2.svg()" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1¦0⟩\n", "\n", "0.912870929175277¦0⟩\n", "0.408248290463863¦1⟩\n", "\n", "0.912870929175277¦0⟩\n", "0.408248290463863¦1⟩\n", "\n", "1¦0⟩\n", "\n", "1¦0⟩\n", "\n" ] } ], "source": [ "# 将线路演化5次并打印量子态\n", "for i in range(5):\n", " sim.reset() # 初始化模拟器\n", " sim.apply_circuit(circ2) # 演化线路\n", " print(sim.get_qs(ket=True)) # 获取量子态\n", " print()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "从以上采样结果可以看出,振幅阻尼信道作用在叠加态 $|\\psi\\rangle=|0\\rangle+|1\\rangle$态后会使其变为混态,混态的其中一部分是$|0\\rangle$态,另一部分仍是叠加态,但$|1\\rangle$态的振幅发生了衰减。该混态的比例由初始量子态和耗散系数$\\gamma$共同决定,初始量子态中的$|1\\rangle$态振幅越大,混态中$|0\\rangle$态的比例就越大。\n", "\n", "具体来说,对于初始量子态 $|\\psi\\rangle=a|0\\rangle+b|1\\rangle$,振幅阻尼信道作用后变成$|0\\rangle$态的概率为 $p=\\gamma b^2$,或以$(1-p)$的概率变为叠加态 $|\\psi'\\rangle=\\frac{1}{\\sqrt{1-\\gamma b^{2}}}(a|0\\rangle+b\\sqrt{1-\\gamma}|1\\rangle)$。\n", "\n", "由此可见,量子比特经过振幅阻尼信道后能量发生耗散,叠加态中激发态$|1\\rangle$态的部分减少,或者直接变为基态$|0\\rangle$态。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "接下来是相位阻尼信道。" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "image/svg+xml": [ "q0: H PDC γ=0.7 " ], "text/plain": [ "" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from mindquantum.core.gates import PhaseDampingChannel\n", "\n", "circ3 = Circuit()\n", "circ3 += H.on(0)\n", "circ3 += PhaseDampingChannel(0.7).on(0)\n", "circ3.svg()" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "1¦1⟩\n", "\n", "0.8770580193070293¦0⟩\n", "0.4803844614152615¦1⟩\n", "\n", "1¦1⟩\n", "\n", "1¦1⟩\n", "\n", "0.8770580193070293¦0⟩\n", "0.4803844614152615¦1⟩\n", "\n" ] } ], "source": [ "# 将线路演化5次并打印量子态\n", "for i in range(5):\n", " sim.reset() # 初始化模拟器\n", " sim.apply_circuit(circ3) # 演化线路\n", " print(sim.get_qs(ket=True)) # 获取量子态\n", " print()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "与振幅阻尼信道类似,相位阻尼信道作用在叠加态 $|\\psi\\rangle=|0\\rangle+|1\\rangle$态后同样会使其变为混态,混态的其中一部分是$|1\\rangle$态,另一部分仍是叠加态,但$|1\\rangle$态的振幅发生了衰减。该混态的比例由初始量子态和耗散系数$\\gamma$共同决定,初始量子态中的$|1\\rangle$态振幅越大,混态中$|1\\rangle$态的比例就越大。\n", "\n", "具体来说,对于初始量子态 $|\\psi\\rangle=a|0\\rangle+b|1\\rangle$,相位阻尼信道作用后变成$|1\\rangle$态的概率为 $p=\\gamma b^2$,或以$(1-p)$的概率变为叠加态 $|\\psi'\\rangle=\\frac{1}{\\sqrt{1-\\gamma b^{2}}}(a|0\\rangle+b\\sqrt{1-\\gamma}|1\\rangle)$。\n", "\n", "由此可见,量子比特经过相位阻尼信道后并没有损失能量,但量子信息(这里体现为量子态叠加)发生了损失。" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 实例演示——含噪声QAOA\n", "\n", "量子近似优化算法(Quantum Approximate Optimization Algorithm)是利用量子计算机来近似解决组合优化问题的量子算法,详尽的介绍可以参考教案[quantum_approximate_optimization_algorithm.ipynb](https://mindspore.cn/mindquantum/docs/zh-CN/r0.9/quantum_approximate_optimization_algorithm.html),在此我们以该算法为案例,看看引入噪声会对量子算法产生怎样的影响。在这里我们与QAOA教案保持一致,解决同一个图的Max-Cut问题。\n", "\n", "由于目前模拟器采用蒙特卡洛法模拟噪声,每次演化线路的结果具有随机性,与真实量子计算机类似,但也因此需要多次采样并分析统计结果,即每次计算哈密顿量期望值之前都需要先重新演化线路。与此同时,我们也无法直接得到含噪声量子线路的梯度,因此需要采用非梯度的优化方法。Nelder-Mead法可以得到多元标量函数的最小值,这里我们采用它来优化含参线路,得到目标哈密顿量期望值的最小值。" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "max cut: 4.716655809015849\n" ] }, { "data": { "image/png": "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iIiqFF/yJqIKG93B74n3oaysEp2IMR3LPnpJRESmh0coiajCAr1qoltAbRy5lFXusKw3cfUTP0cuE9DZ3wMBnjUNnUhERNWIRyiJqFIWRQTBRmbcy3NsZAIWRQQZ9TGJiKjqMSiJqFJ83R3xbnhzoz7mgvDm8HV3NOpjEhFR1WNQElGljQj2w6zQxkZ5rNdCm0AVzHMniYjMkSCKYtWcWU9EVuOnE6mYv/kstDqxQhfryGUCbGQCFoQ3Z0wSEZkxBiURGcXV7HzMiz2NQ8mZkMuEx4blg493C6iNRRFBfJmbiMjMMSiJyKiS0nOwLjEV+y5kIDUrHw9/gxHw103LezX2xJiOfryam4jIQjAoiajK5BVqkZKVhyKtDnY2MjTwcOI74BARWSAGJREREREZhFd5ExEREZFBGJREREREZBAGJREREREZhEFJRERERAZhUBIRERGRQRiURERERGQQBiURERERGYRBSUREREQGYVASERERkUEYlERERERkEAYlERERERmEQUlEREREBmFQEhEREZFBGJREREREZBAGJREREREZhEFJRERERAZhUBIRERGRQRiURERERGQQBiURERERGYRBSUREREQGYVASERERkUEYlERERERkEAYlERERERmEQUlEREREBmFQEhEREZFBGJREREREZBAGJREREREZhEFJRERERAZhUBIRERGRQRiURERERGQQBiURERERGYRBSUREREQGYVASERERkUEYlERERERkEAYlERERERmEQUlEREREBmFQEhEREZFB/h9yK05agL3XtAAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from mindquantum.core.circuit import Circuit, UN\n", "from mindquantum.core.gates import H, RX, Rzz, AmplitudeDampingChannel\n", "from mindquantum.core.operators import Hamiltonian, QubitOperator\n", "from mindquantum.simulator import Simulator\n", "from scipy.optimize import minimize\n", "import networkx as nx\n", "import mindspore as ms\n", "ms.set_context(mode=ms.PYNATIVE_MODE, device_target=\"CPU\")\n", "\n", "# 生成待求解的图\n", "g = nx.Graph()\n", "nx.add_path(g, [0, 1])\n", "nx.add_path(g, [1, 2])\n", "nx.add_path(g, [2, 3])\n", "nx.add_path(g, [3, 4])\n", "nx.add_path(g, [0, 4])\n", "nx.add_path(g, [0, 2])\n", "nx.draw(g, with_labels=True, font_weight='bold')\n", "\n", "gamma = 0.005 # 设定振幅阻尼信道的耗散系数\n", "circ = Circuit(UN(H, g.nodes)) # 生成均匀叠加态\n", "circ += UN(AmplitudeDampingChannel(gamma), g.nodes) # 假设每个H门作用后都会出现噪声\n", "\n", "# 生成ansatz线路,详细的原理请参考QAOA教案\n", "for i in range(4):\n", " for j in g.edges:\n", " circ += Rzz(f'g{i}').on(j) # 对图中的每条边作用ZZ门\n", " circ.barrier(False)\n", " for j in g.nodes:\n", " circ += RX(f'b{i}').on(j) # 对每个节点作用RX门\n", " circ += AmplitudeDampingChannel(gamma).on(j) # 假设每个RX门作用后都会出现噪声\n", " circ.barrier(False)\n", "\n", "# 生成哈密顿量\n", "ham = QubitOperator()\n", "for i in g.edges:\n", " ham += QubitOperator(f'Z{i[0]} Z{i[1]}')\n", "ham = Hamiltonian(ham)\n", "\n", "sim = Simulator('mqvector', circ.n_qubits) # 初始化模拟器\n", "\n", "# 定义待优化的函数,由于噪声存在,每次需要重新演化线路\n", "def func(x):\n", " sim.reset() # 重置模拟器\n", " sim.apply_circuit(circ, x) # 演化线路,参数x是优化器生成的线路参数数值\n", " f = sim.get_expectation(ham).real # 计算并返回哈密顿量的期望值\n", " return f\n", "\n", "# 设置线路参数的初始数值\n", "n_paras = len(circ.params_name)\n", "init_amp = [0.0 for i in range(n_paras)]\n", "\n", "res = minimize(func, init_amp, method='nelder-mead') # 使用优化器优化参数,得到哈密顿量期望值的最小值,优化方法是nelder-mead\n", "cut = (len(g.edges) - res.fun) / 2 # 计算max-cut数\n", "print('max cut:', cut) # 打印结果" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "从结果可以看出,受到噪声影响,QAOA算法的结果变差,但当耗散系数不高时还是能收敛得到一个接近的结果。" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "\n", " \n", " \n", " \n", " \n", "\n", "\n", "\n", "\n", " \n", " \n", "\n", "\n", "
SoftwareVersion
mindquantum0.9.0
scipy1.10.1
numpy1.23.5
SystemInfo
Python3.8.17
OSWindows AMD64
Memory8.39 GB
CPU Max Thread8
DateMon Sep 18 11:13:57 2023
\n" ], "text/plain": [ "" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "from mindquantum.utils.show_info import InfoTable\n", "\n", "InfoTable('mindquantum', 'scipy', 'numpy')" ] } ], "metadata": { "kernelspec": { "display_name": "MindSpore", "language": "python", "name": "mindspore" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.17" }, "orig_nbformat": 4 }, "nbformat": 4, "nbformat_minor": 2 }