@yuichirominato 2019.02.24更新 210views

量子状態のOne Hotベクトル表現、グローバーや量子ニューロン


はじめに

万能量子計算において重要なのは欲しい量子状態の特定の状態ベクトルをOne Coldの状態にしてマーキングし、それを振幅増幅反転でOne Hot状態にするです。

One-hot

デジタル回路において、one-hot(ワン・ホット)は1つだけHigh(1)であり、他はLow(0)であるようなビット列のことを指す。[1] 類似のものとして、0が1つだけで、他がすべて1であるようなビット列をone-cold(ワン・コールド)と呼ぶことがある。

https://ja.wikipedia.org/wiki/One-hot

グローバーや量子回路の場合には、必ずしも指定のビットは1もしくは0ではないですが、同様の考え方で、1つだけ-1で他は+1に近い表現を使います。

グローバーのアルゴリズム

以前の記事で概要を見ました。基本的にグローバーのアルゴリズムは整頓されていないランダムなデータから√Nステップで目的のデータを求めるための万能量子計算向けのアルゴリズムです。

回路自体は
1、重ね合わせ(データを準備する)
2、マーキング(データをOne Hot表現にする)
3、振幅増幅反転(One Hotを量子状態から可視化する)

の通りです。数学的にはとてもシンプルです。

重ね合わせ=少ない量子ビットで使えるベクトルを増やす

量子コンピュータのビット表現は、最初はすべて0に初期化されます。量子ビットは通常ベクトルで表現され、

0 = [1,0] , 1=[0,1]

のベクトルが割り当てられます。これを複数量子ビット利用する際には、テンソル積と呼ばれる手法で、量子状態を表現します。通常初期化された2量子ビットは[1,0]と[1,0]のテンソル積を取り、[1,0,0,0]のように表現され、3量子ビットは、[1,0,0,0,0,0,0,0]となります。

ここで、量子計算は行列回転を使いますので、0のあたいは使いづらいので、ここでアダマールゲートを利用して、この状態ベクトルを使いやすい形にします。

アダマールゲートを全ての量子ビットに適用することによって、ベクトルをすべて1に持っていくことができます。2量子ビットは、

[1,0,0,0] -> [1,1,1,1]

3量子ビットは、

[1,0,0,0,0,0,0,0] -> [1,1,1,1,1,1,1,1]

となります。これだけです。

重ね合わせで準備されたベクトルにOne Coldを適用

重ね合わせ状態の状態ベクトルをOne Coldにもっていきます。1つが-1で他が+1です。

One Coldベクトルは通常量子ゲートの組み合わせで作ります。基本となるゲートはCZです。CZゲートは、

[[1,0,0, 0],
 [0,1,0, 0],
 [0,0,1, 0],
 [0,0,0,-1]]

このように1つの対角行列要素が-1になっていて、その他が+1になっています。これをそのまま重ね合わせ状態に適用すると、

[1,1,1,1] -> [1,1,1,-1]

のように、CZに対応する状態ベクトルの要素にマイナスがつきました。このように1つだけの要素にマーキングをするのがグローバーです。

One ColdベクトルをOne Hotベクトルに

そして、最後に振幅増幅反転回路によって、One Hot状態ベクトルに可視化します。その際には、上記マイナスがついただけでは量子状態は測定によって可視化できませんので、同様にXとCZを使った回路によって、可視化させます。可視化回路は例えば、

[[-1, 1, 1, 1],
 [ 1,-1, 1, 1],
 [ 1, 1,-1, 1],
 [ 1, 1, 1,-1]]

こんな感じのものをかけます。numpyで確認してみると、まずはOne Hot

np.array([[1,0,0,0],[0,1,0,0],[0,0,1,0],[0,0,0,-1]])@[1,1,1,1]
#=>
array([ 1,  1,  1, -1])

最後に振幅増幅します。

np.array([[-1,1,1,1],[1,-1,1,1],[1,1,-1,1],[1,1,1,-1]])@[1,1,1,-1]
#=>
array([0, 0, 0, 4])

One Hotが可視化できました。

量子パーセプトロン

量子ニューロンも基本的には全く同じです。対応となる状態ベクトルに-1を出現させるようにして、少ない量子ビットで大きな表現をしています。

Recommended


Wikiへ移動