common.title
Cloud support

Nobisuke

Dekisugi

RAG


autoQAOA
RAG for dev
Fortune telling app
Annealing
DEEPSCORE
Translation

Overview
Service overview
Terms of service

Privacy policy

Contact
Research

Sign in
Sign up
common.title

インターンシップ:量子もつれとテンソルネットワーク

Yuichiro Minato

2023/12/20 12:39

量子もつれ

量子コンピュータの問題で量子もつれを効率的に扱いたい場合、すべての量子状態を必ずしも状態ベクトルとして保持する必要はなく、問題によってはより量子状態のもつれの無駄を省くことで、量子回路や量子回路シミュレーションを効率化できる。

MPS

テンソルネットワークを用いることにより、量子もつれを調整する方法を行列積状態MPSを利用して確認をする。

from quimb.tensor import * p = MPS_rand_state(L=10, bond_dim=50) p.show()
 50 50 50 50 50 50 50 50 50 

●──●──●──●──●──●──●──●──●──●

│  │  │  │  │  │  │  │  │  │

通常よくある、量子状態を扱う状態ベクトルは名前の通り、大きなベクトルとなっていて、テンソルネットワーク表現では、ノード1つ、腕が1本のベクトルとなっている。

一方で、量子状態はさまざまな表現で扱うことができて、上記は行列積状態と呼ばれる一次元のモデルを利用している。これは、隣接する量子ビット同士を横一列で繋いでいる。状態ベクトルからだと、SVDなどを連続で行うことで、量子ビットを分離し表現できる。

上記量子ビットの間には結合次元と呼ばれる値があり、それが隣接する量子ビット同士のもつれの度合いを表現している。次元が大きい方がフルの状態ベクトルに近くなるが、量子もつれが小さい場合には無駄が多くなるため、結合次元を小さくしても精度が落ちなかったりもする。

MPO

上記は量子状態だが、量子ゲート自体も同様にMPO Matrix Product Operatorとして表現ができる。

A = MPO_rand_herm(10, bond_dim=50) A.show()
│50│50│50│50│50│50│50│50│50│

●──●──●──●──●──●──●──●──●──●

│  │  │  │  │  │  │  │  │  │

この状態は、上下に腕が出ており、この場合には、一次元で繋がった量子の操作などに対応した使い方ができる。

MPSを作る

機械学習ではTensor Trainとも呼ばれる。今回はtensorlyを使ってみる。

pip install -U tensorly
Collecting tensorly

  Downloading tensorly-0.8.1-py3-none-any.whl (229 kB)

     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 229.7/229.7 kB 2.0 MB/s eta 0:00:0000:0100:01

[?25hRequirement already satisfied: numpy in /opt/conda/lib/python3.10/site-packages (from tensorly) (1.23.5)

Requirement already satisfied: scipy in /opt/conda/lib/python3.10/site-packages (from tensorly) (1.10.1)

Installing collected packages: tensorly

Successfully installed tensorly-0.8.1

Note: you may need to restart the kernel to use updated packages.

まずはライブラリを読み込む。

import numpy as np import tensorly as tl from tensorly.decomposition import matrix_product_state

テンソルをnumpyから作る。これは、order-3のテンソル。

tensor = tl.tensor(np.arange(24).reshape((3, 4, 2)), dtype=tl.float64) print(tensor)
[[[ 0.  1.]

  [ 2.  3.]

  [ 4.  5.]

  [ 6.  7.]]



 [[ 8.  9.]

  [10. 11.]

  [12. 13.]

  [14. 15.]]


こちらを分解するには、matrix_product_stateに結合次元を入れたもので分解します。

ttcore = matrix_product_state(tensor, rank=[1,2,2,1]) print([c.shape for c in ttcore])
[(1, 3, 2), (2, 4, 2), (2, 2, 1)]

腕の数が変化しましたので分解されました。ちょっと自信がないですが、中身も見れます。

np.array(ttcore,dtype=object)
array([array([[[ 0.16419877,  0.89798224],

               [ 0.50559916,  0.27875225],

               [ 0.84699956, -0.34047773]]]),

       array([[[ 0.39515015,  0.1924406 ],

               [ 0.46037119,  0.0836525 ],

               [ 0.52559222, -0.0251356 ],

               [ 0.59081325, -0.1339237 ]],



              [[-0.05990062,  0.56939785],

               [-0.02394228,  0.50941965],

               [ 0.01201607,  0.44944145],

               [ 0.04797442,  0.38946325]]]), array([[[44.97949845],

                                                      [47.95056535]],



                                                     [[-0.91908612],

                                                      [ 0.86213859]]])],

      dtype=object)

テンソルにも戻せます。

reconstructed_tensor = tl.tt_to_tensor(ttcore) print(reconstructed_tensor)
[[[3.41242664e-15 1.00000000e+00]

  [2.00000000e+00 3.00000000e+00]

  [4.00000000e+00 5.00000000e+00]

  [6.00000000e+00 7.00000000e+00]]



 [[8.00000000e+00 9.00000000e+00]

  [1.00000000e+01 1.10000000e+01]

  [1.20000000e+01 1.30000000e+01]

  [1.40000000e+01 1.50000000e+01]]


多少ずれましたが、再構築できました。MPSやテンソルネットワークは最近では探せばいくつか記事が出ますのでぜひ探してトライしてみてください。

量子回路でのMPS

量子コンピュータのシミュレータだけでなく、回路の上でもMPSを作ることができる。2量子ビットゲートを階段上に組むことで、隣接の量子ビット間にもつれを作り、MPSを作ることができる。また、利用する量子ビット数を増やすことで、結合次元を増やすことができる。

./img/231220mps.png image:https://iopscience.iop.org/article/10.1088/2058-9565/ab4eb5/pdf

© 2024, blueqat Inc. All rights reserved