Nobisuke
Dekisugi
RAG
Privacy policy
2023/12/20 12:39
量子コンピュータの問題で量子もつれを効率的に扱いたい場合、すべての量子状態を必ずしも状態ベクトルとして保持する必要はなく、問題によってはより量子状態のもつれの無駄を省くことで、量子回路や量子回路シミュレーションを効率化できる。
テンソルネットワークを用いることにより、量子もつれを調整する方法を行列積状態MPSを利用して確認をする。
Copy 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 Matrix Product Operatorとして表現ができる。
Copy A = MPO_rand_herm(10, bond_dim=50) A.show()
│50│50│50│50│50│50│50│50│50│
●──●──●──●──●──●──●──●──●──●
│ │ │ │ │ │ │ │ │ │
この状態は、上下に腕が出ており、この場合には、一次元で繋がった量子の操作などに対応した使い方ができる。
機械学習ではTensor Trainとも呼ばれる。今回はtensorlyを使ってみる。
Copy pip install -U tensorly
Collecting tensorly
Downloading tensorly-0.8.1-py3-none-any.whl (229 kB)
[2K [90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━[0m [32m229.7/229.7 kB[0m [31m2.0 MB/s[0m eta [36m0:00:00[0m00:01[0m00:01[0m
[?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.
まずはライブラリを読み込む。
Copy import numpy as np import tensorly as tl from tensorly.decomposition import matrix_product_state
テンソルをnumpyから作る。これは、order-3のテンソル。
Copy 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.]]
Display all output >>>
こちらを分解するには、matrix_product_stateに結合次元を入れたもので分解します。
Copy 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)]
腕の数が変化しましたので分解されました。ちょっと自信がないですが、中身も見れます。
Copy 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)
テンソルにも戻せます。
Copy 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]]
Display all output >>>
多少ずれましたが、再構築できました。MPSやテンソルネットワークは最近では探せばいくつか記事が出ますのでぜひ探してトライしてみてください。
量子コンピュータのシミュレータだけでなく、回路の上でもMPSを作ることができる。2量子ビットゲートを階段上に組むことで、隣接の量子ビット間にもつれを作り、MPSを作ることができる。また、利用する量子ビット数を増やすことで、結合次元を増やすことができる。
image:https://iopscience.iop.org/article/10.1088/2058-9565/ab4eb5/pdf
© 2024, blueqat Inc. All rights reserved