VQSD_Tutorial_CN.ipynb 11.6 KB
Notebook
Newer Older
Q
Quleaf 已提交
1 2
{
 "cells": [
Q
Quleaf 已提交
3 4 5 6 7 8 9 10
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 变分量子态对角化算法(VQSD)\n",
    "<em> Copyright (c) 2020 Institute for Quantum Computing, Baidu Inc. All Rights Reserved. </em>"
   ]
  },
Q
Quleaf 已提交
11 12 13 14 15
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 概览\n",
Q
Quleaf 已提交
16 17
    "\n",
    "- 在本案例中,我们将通过Paddle Quantum训练量子神经网络来完成量子态的对角化。\n",
Q
Quleaf 已提交
18 19 20 21 22 23
    "\n",
    "- 首先,让我们通过下面几行代码引入必要的library和package。"
   ]
  },
  {
   "cell_type": "code",
Q
Quleaf 已提交
24
   "execution_count": 1,
Q
Quleaf 已提交
25 26 27 28 29 30 31 32 33 34 35 36 37
   "metadata": {
    "pycharm": {
     "is_executing": false,
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
    "import numpy\n",
    "from numpy import diag\n",
    "import scipy\n",
    "from paddle import fluid\n",
    "from paddle_quantum.circuit import UAnsatz\n",
Q
Quleaf 已提交
38
    "from paddle_quantum.utils import dagger\n",
Q
Quleaf 已提交
39 40 41 42 43 44 45 46 47 48 49 50 51
    "from paddle.complex import matmul, trace, transpose"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "\n",
    "## 背景\n",
Q
Quleaf 已提交
52
    "量子态对角化算法(VQSD,Variational Quantum State Diagonalization)[1-3] 的目标是输出一个量子态的特征谱,即其所有特征值。求解量子态的特征值在量子计算中有着诸多应用,比如可以用于计算保真度和冯诺依曼熵,也可以用于主成分分析。\n",
53
    "- 量子态通常是一个混合态,表示如下 $\\rho_{\\text{mixed}} = \\sum_i P_i |\\psi_i\\rangle\\langle\\psi_i|$\n",
Q
Quleaf 已提交
54
    "- 作为一个简单的例子,我们考虑一个2量子位的量子态,它的特征谱为 $(0.5, 0.3, 0.1, 0.1)$, 我们先通过随机作用一个酉矩阵来生成具有这样特征谱的随机量子态。\n"
Q
Quleaf 已提交
55 56 57 58
   ]
  },
  {
   "cell_type": "code",
Q
Quleaf 已提交
59
   "execution_count": 2,
Q
Quleaf 已提交
60 61 62 63 64 65
   "metadata": {
    "pycharm": {
     "is_executing": false,
     "name": "#%%\n"
    }
   },
Q
Quleaf 已提交
66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[[ 0.25692714+2.79965123e-18j -0.01201165+4.35008229e-02j\n",
      "  -0.04922153-5.53435795e-03j -0.05482813+6.81592880e-02j]\n",
      " [-0.01201165-4.35008229e-02j  0.29589652-4.11838221e-18j\n",
      "   0.10614221-7.12575060e-02j -0.03921986-9.71359495e-02j]\n",
      " [-0.04922153+5.53435795e-03j  0.10614221+7.12575060e-02j\n",
      "   0.214462  -3.16199986e-18j  0.02936413-1.13227406e-01j]\n",
      " [-0.05482813-6.81592880e-02j -0.03921986+9.71359495e-02j\n",
      "   0.02936413+1.13227406e-01j  0.23271434+4.32784528e-18j]]\n"
     ]
    }
   ],
Q
Quleaf 已提交
82
   "source": [
Q
Quleaf 已提交
83 84 85
    "scipy.random.seed(13)\n",
    "V = scipy.stats.unitary_group.rvs(4)   # 随机生成一个酉矩阵\n",
    "D = diag([0.5, 0.3, 0.1, 0.1])         # 输入目标态 rho 的谱\n",
Q
Quleaf 已提交
86
    "V_H = V.conj().T \n",
Q
Quleaf 已提交
87 88
    "rho = V @ D @ V_H                      # 生成 rho\n",
    "print(rho)                             # 打印量子态 rho"
Q
Quleaf 已提交
89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 搭建量子神经网络\n",
    "- 在这个案例中,我们将通过训练量子神经网络QNN(也可以理解为参数化量子电路)来学习量子态的特征谱。这里,我们提供一个预设的2量子位量子电路。\n",
    "\n",
    "- 我们预设一些该参数化电路的参数,比如宽度为2量子位。\n",
    "\n",
    "- 初始化其中的变量参数,${\\bf{\\theta }}$代表我们量子神经网络中的参数组成的向量。\n",
    "         "
   ]
  },
  {
   "cell_type": "code",
Q
Quleaf 已提交
106
   "execution_count": 3,
Q
Quleaf 已提交
107 108 109 110 111 112 113 114
   "metadata": {
    "pycharm": {
     "is_executing": false,
     "name": "#%% \n"
    }
   },
   "outputs": [],
   "source": [
Q
Quleaf 已提交
115 116 117
    "N = 2            # 量子神经网络的宽度\n",
    "SEED = 14        # 固定随机种子\n",
    "THETA_SIZE = 15  # 量子神经网络中参数的数量\n",
Q
Quleaf 已提交
118 119 120
    "\n",
    "def U_theta(theta, N):\n",
    "    \"\"\"\n",
Q
Quleaf 已提交
121
    "    Quantum Neural Network\n",
Q
Quleaf 已提交
122
    "    \"\"\"\n",
Q
Quleaf 已提交
123 124
    "    \n",
    "    # 按照量子比特数量/网络宽度初始化量子神经网络\n",
Q
Quleaf 已提交
125
    "    cir = UAnsatz(N)\n",
Q
Quleaf 已提交
126 127 128
    "    \n",
    "    # 调用内置的量子神经网络模板\n",
    "    cir.universal_2_qubit_gate(theta)\n",
Q
Quleaf 已提交
129
    "\n",
Q
Quleaf 已提交
130 131
    "    # 返回量子神经网络所模拟的酉矩阵 U\n",
    "    return cir.U"
Q
Quleaf 已提交
132 133 134 135 136 137 138 139 140 141 142 143
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
    "## 配置训练模型 - 损失函数\n",
    "- 现在我们已经有了数据和量子神经网络的架构,我们将进一步定义训练参数、模型和损失函数。\n",
Q
Quleaf 已提交
144 145
    "- 通过作用量子神经网络$U(\\theta)$在量子态$\\rho$后得到的量子态记为$\\tilde\\rho$,我们设定损失函数为$\\tilde\\rho$与用来标记的量子态$\\sigma=0.1 |00\\rangle\\langle 00| + 0.2 |01\\rangle \\langle 01| + 0.3 |10\\rangle \\langle10| + 0.4 |11 \\rangle\\langle 11|$的推广的内积。\n",
    "- 具体的,设定损失函数为 $\\mathcal{L}(\\boldsymbol{\\theta})  = \\text{Tr}(\\tilde\\rho\\sigma) .$"
Q
Quleaf 已提交
146 147 148 149
   ]
  },
  {
   "cell_type": "code",
Q
Quleaf 已提交
150
   "execution_count": 4,
Q
Quleaf 已提交
151 152 153 154 155 156 157 158
   "metadata": {
    "pycharm": {
     "is_executing": false,
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
Q
Quleaf 已提交
159 160
    "# 输入用来标记的量子态sigma\n",
    "sigma = diag([0.1, 0.2, 0.3, 0.4]).astype('complex128') \n",
Q
Quleaf 已提交
161 162 163 164 165 166 167
    "\n",
    "class Net(fluid.dygraph.Layer):\n",
    "    \"\"\"\n",
    "    Construct the model net\n",
    "    \"\"\"\n",
    "\n",
    "    def __init__(self, shape, rho, sigma, param_attr=fluid.initializer.Uniform(low=0.0, high=2 * numpy.pi, seed=SEED),\n",
Q
Quleaf 已提交
168
    "                 dtype='float64'):\n",
Q
Quleaf 已提交
169
    "        super(Net, self).__init__()\n",
Q
Quleaf 已提交
170 171
    "        \n",
    "        # 将 Numpy array 转换成 Paddle 动态图模式中支持的 variable\n",
Q
Quleaf 已提交
172 173
    "        self.rho = fluid.dygraph.to_variable(rho)\n",
    "        self.sigma = fluid.dygraph.to_variable(sigma)\n",
Q
Quleaf 已提交
174 175
    "        \n",
    "        # 初始化 theta 参数列表,并用 [0, 2*pi] 的均匀分布来填充初始值\n",
Q
Quleaf 已提交
176 177
    "        self.theta = self.create_parameter(shape=shape, attr=param_attr, dtype=dtype, is_bias=False)\n",
    "\n",
Q
Quleaf 已提交
178
    "    # 定义损失函数和前向传播机制\n",
Q
Quleaf 已提交
179
    "    def forward(self, N):\n",
Q
Quleaf 已提交
180 181 182
    "        \n",
    "        # 施加量子神经网络\n",
    "        U = U_theta(self.theta, N)\n",
Q
Quleaf 已提交
183
    "\n",
Q
Quleaf 已提交
184
    "        # rho_tilde 是将 U 作用在 rho 后得到的量子态 U*rho*U^dagger \n",
Q
Quleaf 已提交
185
    "        rho_tilde = matmul(matmul(U, self.rho), dagger(U))\n",
Q
Quleaf 已提交
186
    "\n",
Q
Quleaf 已提交
187
    "        # 计算损失函数\n",
Q
Quleaf 已提交
188 189 190 191 192 193 194 195 196 197
    "        loss = trace(matmul(self.sigma, rho_tilde))\n",
    "\n",
    "        return loss.real, rho_tilde"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 配置训练模型 - 模型参数\n",
Q
Quleaf 已提交
198
    "\n",
Q
Quleaf 已提交
199
    "在进行量子神经网络的训练之前,我们还需要进行一些训练(超)参数的设置,例如学习速率与迭代次数。\n",
Q
Quleaf 已提交
200
    "- 设定学习速率(learning rate)为 0.1;\n",
Q
Quleaf 已提交
201 202 203 204 205
    "- 设定迭代次数为50次。"
   ]
  },
  {
   "cell_type": "code",
Q
Quleaf 已提交
206
   "execution_count": 5,
Q
Quleaf 已提交
207 208 209 210 211 212 213 214
   "metadata": {
    "pycharm": {
     "is_executing": false,
     "name": "#%%\n"
    }
   },
   "outputs": [],
   "source": [
Q
Quleaf 已提交
215 216
    "ITR = 50 # 设置训练的总的迭代次数\n",
    "LR = 0.1 # 设置学习速率"
Q
Quleaf 已提交
217 218 219 220 221 222 223 224 225 226 227 228 229 230 231
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 进行训练\n",
    "\n",
    "- 当训练模型的各项参数都设置完成后,我们将数据转化为Paddle动态图中的变量,进而进行量子神经网络的训练。\n",
    "- 过程中我们用的是Adam Optimizer,也可以调用Paddle中提供的其他优化器。\n",
    "- 我们将训练过程中的结果依次输出。"
   ]
  },
  {
   "cell_type": "code",
Q
Quleaf 已提交
232
   "execution_count": 6,
Q
Quleaf 已提交
233 234 235 236 237 238
   "metadata": {
    "pycharm": {
     "is_executing": false,
     "name": "#%% \n"
    }
   },
Q
Quleaf 已提交
239 240 241 242 243 244 245 246 247 248 249 250 251
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "iter: 0 loss: 0.2354\n",
      "iter: 10 loss: 0.1912\n",
      "iter: 20 loss: 0.1844\n",
      "iter: 30 loss: 0.1823\n",
      "iter: 40 loss: 0.1813\n"
     ]
    }
   ],
Q
Quleaf 已提交
252
   "source": [
Q
Quleaf 已提交
253
    "# 初始化paddle动态图机制\n",
Q
Quleaf 已提交
254
    "with fluid.dygraph.guard():\n",
Q
Quleaf 已提交
255 256
    "    \n",
    "    # 确定网络的参数维度\n",
Q
Quleaf 已提交
257 258
    "    net = Net(shape=[THETA_SIZE], rho=rho, sigma=sigma)\n",
    "\n",
Q
Quleaf 已提交
259
    "    # 一般来说,我们利用Adam优化器来获得相对好的收敛,当然你可以改成SGD或者是RMS prop.\n",
Q
Quleaf 已提交
260
    "    opt = fluid.optimizer.AdagradOptimizer(learning_rate=LR, parameter_list=net.parameters())\n",
Q
Quleaf 已提交
261 262
    "    \n",
    "    # 优化循环\n",
Q
Quleaf 已提交
263
    "    for itr in range(ITR):\n",
Q
Quleaf 已提交
264 265
    "        \n",
    "        # 前向传播计算损失函数并返回估计的能谱\n",
Q
Quleaf 已提交
266 267
    "        loss, rho_tilde = net(N)\n",
    "        rho_tilde_np = rho_tilde.numpy()\n",
Q
Quleaf 已提交
268 269
    "        \n",
    "        # 在动态图机制下,反向传播极小化损失函数\n",
Q
Quleaf 已提交
270 271 272
    "        loss.backward()\n",
    "        opt.minimize(loss)\n",
    "        net.clear_gradients()\n",
Q
Quleaf 已提交
273 274 275 276
    "        \n",
    "        # 打印训练结果\n",
    "        if itr % 10 == 0:\n",
    "            print('iter:', itr, 'loss:', '%.4f' % loss.numpy()[0])\n"
Q
Quleaf 已提交
277 278 279 280 281 282 283 284
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 总结\n",
    "根据上面训练得到的结果,通过大概50次迭代,我们就比较好的完成了对角化。\n",
Q
Quleaf 已提交
285 286
    "我们可以通过打印\n",
    "$\\tilde{\\rho} = U(\\boldsymbol{\\theta})\\rho U^\\dagger(\\boldsymbol{\\theta})$\n",
Q
Quleaf 已提交
287 288 289 290 291
    "的来验证谱分解的效果。特别的,我们可以验证它的对角线与我们目标谱是非常接近的。"
   ]
  },
  {
   "cell_type": "code",
Q
Quleaf 已提交
292
   "execution_count": 7,
Q
Quleaf 已提交
293 294 295 296 297 298
   "metadata": {
    "pycharm": {
     "is_executing": false,
     "name": "#%%\n"
    }
   },
Q
Quleaf 已提交
299 300 301 302 303 304 305 306 307 308
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The estimated spectrum is: [0.49401064 0.30357179 0.10224927 0.10016829]\n",
      "The target spectrum is: [0.5 0.3 0.1 0.1]\n"
     ]
    }
   ],
Q
Quleaf 已提交
309 310 311 312 313 314 315 316 317 318 319 320 321
   "source": [
    "print(\"The estimated spectrum is:\", numpy.real(numpy.diag(rho_tilde_np)))\n",
    "print(\"The target spectrum is:\", numpy.diag(D))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {
    "pycharm": {
     "name": "#%% md\n"
    }
   },
   "source": [
Q
Quleaf 已提交
322
    "## 参考文献\n",
Q
Quleaf 已提交
323
    "\n",
Q
Quleaf 已提交
324
    "[1] [Larose, R., Tikku, A., Neel-judy, É. O., Cincio, L. & Coles, P. J. Variational quantum state diagonalization. npj Quantum Inf. (2019) doi:10.1038/s41534-019-0167-6.](https://www.nature.com/articles/s41534-019-0167-6)\n",
Q
Quleaf 已提交
325
    "\n",
Q
Quleaf 已提交
326
    "[2] [Nakanishi, K. M., Mitarai, K. & Fujii, K. Subspace-search variational quantum eigensolver for excited states. Phys. Rev. Res. 1, 033062 (2019).](https://journals.aps.org/prresearch/pdf/10.1103/PhysRevResearch.1.033062)\n",
Q
Quleaf 已提交
327
    "\n",
Q
Quleaf 已提交
328
    "[3] [Cerezo, M., Sharma, K., Arrasmith, A. & Coles, P. J. Variational Quantum State Eigensolver. arXiv:2004.01372 (2020).](https://arxiv.org/pdf/2004.01372.pdf)\n"
Q
Quleaf 已提交
329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
Q
Quleaf 已提交
348
   "version": "3.7.7"
Q
Quleaf 已提交
349 350 351 352 353 354 355 356 357 358 359 360 361 362
  },
  "pycharm": {
   "stem_cell": {
    "cell_type": "raw",
    "metadata": {
     "collapsed": false
    },
    "source": []
   }
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}