@yuichirominato 2019.02.18更新 328views

【パーセプトロン】量子コンピュータの2量子ビットだけで16枚の画像を認識する


はじめに

イタリアでIBMの量子コンピュータを利用してパーセプトロトンを実装し、少ない量子ビットで多くの画像を認識したとあります。この仕組みをみてみたいと思います。

参考

こちらのサイトが参考になりました。

https://ai-scholar.tech/2018/12/26/ai-rixyousi-51/

論文はこちらを参照します。

An Artificial Neuron Implemented on an Actual Quantum Processor
Francesco Tacchino,1, ∗ Chiara Macchiavello,1, 2, 3, † Dario Gerace,1, ‡ and Daniele Bajoni4, §
https://arxiv.org/pdf/1811.02266.pdf

回路の概要

回路の概要はシンプルです。画像認識を基にしたパターンを入力として、あるパターンを認識させます。その結果を01のバイナリで分類します。

下記は(a)が通常のニューラルネットワーク構造で、入力値に対して、wの結合荷重で足し合わせて活性化関数に通して判断させますが、今回は(b)のように、入力に専用の量子回路Uiを作成。その後に認識回路でUwを通して、活性化関数の代わりにCX回路をベースにした制御回路で分類します。

https://arxiv.org/pdf/1811.02266.pdf

上記はAncillaビットの0か1で画像を判断します。

具体的な回路

https://arxiv.org/pdf/1811.02266.pdf

上記は論文からの具体的な回路です。まずは認識するためのパターンを準備します。今回は2量子ビットですが、全部で16枚認識できます。二進数表記に対応させたパターンを下記にまとめておきます。

早速回路を確認してみましょう。今回は例題にある回路をみてみます。

ステップの確認

全体ステップの確認です。

  1. 重ね合わせ回路の作成
  2. 入力回路をZとCZで実現
  3. 認識回路をZとCZで実現
  4. 重ね合わせを解除、Xゲートを全体にかける
  5. 制御回路で判断用ビットに移して判断

となります。全体の回路は下記の通りです。

最初は量子ビットは両方とも0からスタート。Hゲートを両方にかけることで、状態ベクトルが変化します。

$$\left( \begin{array}{c} 1 \\ 1 \\ 1 \\ 1 \end{array} \right)$$

次にZゲートは単位行列Iとのテンソル積で表現された後に状態ベクトルに作用すると、

$$I \otimes Z = \left( \begin{array}{c} 1&0&0&0 \\ 0&-1&0&0 \\ 0&0&1&0 \\ 0&0&0&-1 \end{array} \right)$$

これを作用させると、

$$\left( \begin{array}{c} 1 \\ -1 \\ 1 \\ -1 \end{array} \right)$$

そのあとCZの行列表記は、

$$CZ = \left( \begin{array}{c} 1&0&0&0 \\ 0&1&0&0 \\ 0&0&1&0 \\ 0&0&0&-1 \end{array} \right)$$

となるので、適用すると最終的に状態ベクトルは、

$$\left( \begin{array}{c} 1 \\ -1 \\ 1 \\ 1 \end{array} \right)$$

これは、+1を白、-1を黒に対応させた上記のパターンと一致します。

認識回路と活性化関数

上記は同様に7の場合のパターンを回路を使って再現している。もし、入力と認識回路が全く同一なら、入力の際に反転している部分が打ち消しあい、最終的に状態ベクトルはすべて+1の状態になる。そして、Hゲートを全体に適用すると、0に戻る。最後に全てにXゲートを適用し、0から1に反転。

1を制御ゲートで拾って余剰量子ビットに割り当てることで、パターンが全く同じ場合にのみ1が反応するようになっている。活性化関数は制御ゲートで代用し、すべての回路の結果が1の時のみ同一と判断できる。

結構基本的な量子計算が活用されている。実機のIBMで基本的な位相計算を使ってできるということなので、試してみたい方は試してみるのがいいのではないでしょうか。

Blueqatで実装してみる。

早速実際のプログラミング方法を見てみます。ツールはなんでも大丈夫ですが、今回は自社のBlueqatで。https://github.com/mdrft/Blueqat。インストールは、

pip install blueqat

jupyterやgoogle colab経由では、!マークをつけてください。

早速実装は、

from blueqat import Circuit
Circuit(3).h[:2].z[1].cz[0,1].z[:2].cz[0,1].h[:2].x[:2].ccx[0,1,2].m[2].run(shots=100)

こうなります。実行してみると、

ounter({'000': 100})

0となりましたので、認識は成功し、違うパターンが検出されました。最後の量子ビットを見ます。回路を変えてわざと同じパターンにしてみます。

Circuit(3).h[:2].z[1].cz[0,1].z[1].cz[0,1].h[:2].x[:2].ccx[0,1,2].m[2].run(shots=100)

こんどは、

Counter({'001': 100})

1が出たので同じパターンとして認識されました。

まとめ

まだまだ基本的な問題しか解けませんが、2量子ビットだけでたくさんのパターンが実装できました。

実際には行列計算でHゲートで実現した重ね合わせの量子状態に対して位相反転で-1を作りだし、結果として2つの量子ビットに対応する2^2の状態ベクトルに対して、最大で2^2^2=16パターンを認識できました。

量子計算がきちんとできればあまり難しくないということで、面白い問題でした。

Recommended


Wikiへ移動