common.title

Docs
Quantum Circuit
TYTAN CLOUD

QUANTUM GAMING


Overview
Terms of service

Privacy policy

Contact
Research

Sign in
Sign up
common.title

blueqatSDK version0.5.0から搭載した回路描画を使ってQCNNの回路を一部実装して可視化してみる¶

Yuichiro Minato

2022/04/17 14:12

blueqatSDK version0.5.0から搭載した回路描画を使ってQCNNの回路を一部実装して可視化してみる

ということでさっそくやってみます。回路描画機能のおかげでかなりわかりやすくなりそうです。
まずはQCNNをみてみます。こちらは畳み込みニューラルネットワークで畳み込み層とプーリング層を持っています。
Tensorflow Quantum

論文はこちらを参考にします。
Nature Physics
回路は畳み込みとプーリングを実装して可視化してみます。そんなに難しいことはしません。
最初に畳み込み回路をKAK分解された変分回路で組みます。こちらは、

from blueqat import Circuit
import numpy as np

def KAK(params):
    a = Circuit()
    for i in range(2):
        a.rx(params[i*3+0])[i].ry(params[i*3+1])[i].rz(params[i*3+2])[i]
    a.rxx(params[6])[0,1].ryy(params[7])[0,1].rzz(params[8])[0,1]
    for i in range(2):
        a.rx(params[i*3+0+9])[i].ry(params[i*3+1+9])[i].rz(params[i*3+2+9])[i]
    return a
circ = KAK([np.random.rand() for _ in range(15)])
print(circ)
Circuit(2).rx(0.9135969658685459)[0].ry(0.8245577601311584)[0].rz(0.8620945818554985)[0].rx(0.1677019188503096)[1].ry(0.01065757463043615)[1].rz(0.8602692551407704)[1].rxx(0.12465164055434919)[0, 1].ryy(0.9415581794052608)[0, 1].rzz(0.17677669493707948)[0, 1].rx(0.45922568694110666)[0].ry(0.24040910046521569)[0].rz(0.5558405546376624)[0].rx(0.06243758306940528)[1].ry(0.6056558616170583)[1].rz(0.4104027136984769)[1]

これまでは回路が分かりづらかったですが、これでだいぶ回路が何をしているのかわかりやすくなりました。

circ.run(backend="draw")
<Figure size 1800x360 with 1 Axes>

image

次にプーリングも実装してみたいと思います。

def Pooling(params):
    a = Circuit()
    for i in range(2):
        a.rx(params[i*3+0])[i].ry(params[i*3+1])[i].rz(params[i*3+2])[i]
    a.cx[0,1].rz(-params[5])[i].ry(-params[4])[i].rx(-params[3])[i]
    return a
circ2 = Pooling([np.random.rand() for _ in range(6)])
print(circ2)
Circuit(2).rx(0.887642974785491)[0].ry(0.9725538474871682)[0].rz(0.09874610457274458)[0].rx(0.8264911582843477)[1].ry(0.31328796033556594)[1].rz(0.7348913369969552)[1].cx[0, 1].rz(-0.7348913369969552)[1].ry(-0.31328796033556594)[1].rx(-0.8264911582843477)[1]
circ2.run(backend="draw")
<Figure size 1800x180 with 1 Axes>

image

この二つをつなげてみます。

(circ + circ2).run(backend="draw")
<Figure size 1800x360 with 1 Axes>

image

シンプルですが、わかりやすいです。
結構楽しいのでもちょっと量子ビットを増やして8くらいでやってみます。

def KAK(params, qlist):
    a = Circuit()
    for i, x in enumerate(qlist):
        a.rx(params[i*3+0])[x].ry(params[i*3+1])[x].rz(params[i*3+2])[x]
    a.rxx(params[6])[qlist[0],qlist[1]].ryy(params[7])[qlist[0],qlist[1]].rzz(params[8])[qlist[0],qlist[1]]
    for i, x in enumerate(qlist):
        a.rx(params[i*3+0+9])[x].ry(params[i*3+1+9])[x].rz(params[i*3+2+9])[x]
    return a
def Pooling(params, qlist):
    a = Circuit()
    for i, x in enumerate(qlist):
        a.rx(params[i*3+0])[x].ry(params[i*3+1])[x].rz(params[i*3+2])[x]
    a.cx[qlist[0],qlist[1]].rz(-params[5])[qlist[1]].ry(-params[4])[qlist[1]].rx(-params[3])[qlist[1]]
    return a
circ_kak0 = KAK([np.random.rand() for _ in range(15)], [0,1])
circ_kak1 = KAK([np.random.rand() for _ in range(15)], [2,3])
circ_kak2 = KAK([np.random.rand() for _ in range(15)], [4,5])
circ_kak3 = KAK([np.random.rand() for _ in range(15)], [6,7])

circ_kak4 = KAK([np.random.rand() for _ in range(15)], [1,2])
circ_kak5 = KAK([np.random.rand() for _ in range(15)], [3,4])
circ_kak6 = KAK([np.random.rand() for _ in range(15)], [5,6])

circ_pooling0 = Pooling([np.random.rand() for _ in range(6)], [0,1])
circ_pooling1 = Pooling([np.random.rand() for _ in range(6)], [2,3])
circ_pooling2 = Pooling([np.random.rand() for _ in range(6)], [4,5])
circ_pooling3 = Pooling([np.random.rand() for _ in range(6)], [6,7])

circ_pooling4 = Pooling([np.random.rand() for _ in range(6)], [1,3])
circ_pooling5 = Pooling([np.random.rand() for _ in range(6)], [5,7])

circ_pooling6 = Pooling([np.random.rand() for _ in range(6)], [3,7])

circ_kak_full = circ_kak0 + circ_kak1 + circ_kak2 + circ_kak3 + circ_kak4 + circ_kak5 + circ_kak6
circ_pooling_full = circ_pooling0 + circ_pooling1 + circ_pooling2 + circ_pooling3 + circ_pooling4 + circ_pooling5 + circ_pooling6

(circ_kak_full + circ_pooling_full).run(backend="draw")
<Figure size 1800x5400 with 1 Axes>

image

できましたがもっとコンパクトにまとめる機能も付けてもいいですね。以上です。

© 2025, blueqat Inc. All rights reserved