こんにちは、機械学習に本格シフトです。
今回は量子コンピュータを利用したNNを見てみたいと思います。
元論文は現在QuEraとしても起業されたハーバード大学のミハイル・ルーキングループからです。
https://www.nature.com/articles/s41567-019-0648-8
https://arxiv.org/abs/1810.03787
引用:https://arxiv.org/pdf/quant-ph/0504097.pdf
基本的にはちょっとかなり難しかったので、勉強会も時間をかけて進めていく必要があると感じました。まず、普通の機械学習での画像認識に使われる畳み込みニューラルネットワークと量子コンピュータを利用したニューラルネットワークの対応の図がとても分かりやすいです。
入力として画像を入力し、畳み込み操作、プーリングを繰り返していきます。最後に全結合を通じて二値分類を行っています。
量子でも同様な構成となっています。畳み込み操作に対応するのが二量子ビットずつにユニタリ演算を適用させる部分です。この操作は後ほど細かく見たいと思います。そしてプーリングですが、量子回路は可逆回路で、全体の総数を減らせません。そのため、CXゲートで別の回路にまとめて、C側の回路は捨てる必要があります。
入力データ
基本的にはデータ入力は古典のデータである01よりも複雑な量子データを使ったほうが性能がでます。普通のコンピュータで解きにくい問題設定がよいという話だと思います。ここでは、重ね合わせ状態にCZを適用したクラスタ状態と呼ばれるデータを使います。もちろん普通のデータでもできますが、あまり優位性がないということだと思います。例題としては古典データを使って遊ぶのもあるかと思います。
畳み込み回路
畳み込み回路はユニタリ演算で表現されます。
参考
https://www.tensorflow.org/quantum/tutorials/qcnn?hl=ja
畳み込み自体の説明は今後勉強会で別途開催したいと思います。ユニタリ回路を隣接の量子ビット同士にかけますが、任意のユニタリ回路は、
from blueqat import Circuit()
Circuit().rx(a0)[0].ry(a1)[0].rz(a2)[0].rx(a3)[1].ry(a4)[1].rxx(a5)[0,1].ryy(a6)[0,1].rzz(a7)[0,1].rz(a8)[1].rx(a9)[0].ry(a10)[0].rz(a11)[0].rx(a12)[1].ry(a13)[1].rz(a14)[1]
変数を15個使って一つのユニタリ回路が作成されました。プーリングについては、変数は逆回転を使って6個で済むようです。なぜこれが成立するのかすぐにわからなかったので、今後勉強会で確認したいと思います。
あとは、回路の出力が1になるまでひたすらつなげるだけですね。変数が多すぎるのでかなり大変かと思います。意外と話題がてんこ盛りだったので、今後は、ちょっとずつひも解いて勉強会をやってみたいと思います。
1,ユニタリ行列とKAK分解
2,畳み込みとプーリング
3,プーリングの逆回転について
4,勾配
5,パラメータシフト
6,pytorchと統合
などを進めたいと思います。