QNNCloudを試してみた

#量子コンピュータの種類

大まかに分けると現状、動作している量子コンピュータは大まかに分けると、

- 量子ゲート方式
- 量子アニーリング方式
- 量子ニューラルネットワーク方式

の3通り。

一番目の量子ゲート方式は”量子コンピュータ”といったときに最も最初に想像するタイプで、IBMやGoogleが進めているものです。ただ、有用な利用方法は、ショアのアルゴリズム（因数分解）くらいしか聞いたことがありません。従来方式のコンピュータを超える「量子超越性」に必要な49qbitを超えるのも、もうわずかといわれています。

2番目の量子アニーリングはD-Waveが商用化している、組み合わせ最適化に特化したタイプの量子コンピュータです

最後の量子ニューラルネットワーク方式が今回の発表された量子コンピュータの実装方式のようです。ちなみに、この量子ニューラルネットワーク方式も組み合わせ最適化などに特化したタイプのようです。

#QNNCloud概略

内閣府革新的研究開発推進プログラム（ImPACT）が共同開発した国産の量子コンピュータです。

http://www.ntt.co.jp/news2017/1711/171120a.html

を参考にして、なんとなーく、理解してください。私はあきらめました。
ネットには、批判的な声も多いようです。

#QNNCloudとD-Waveの違い

実現方式については、D-Waveはほぼ絶対零度まで下げないといけない、QNNは常温でもOKなど、いろいろな差分があるので置いておいて、ここではできることや制限にフォーカスしましょう。

##量子ビット数について
量子コンピュータのスペックで最も重要なものが量子ビットで、対処できる問題の複雑さに直結します。
これが小さいとどんなに完ぺきでも適用できる局面が限られるため、使い物になりません。


2017年12月時点ではD-waveがD-Wave 2000Qで2000量子ビットを実装しています。

WikipediaによればD-waveは以下のスペック
- 2017年1月、D-waveが、D-Wave 2000Q をリリース（2000量子ビット）

https://en.wikipedia.org/wiki/D-Wave_Systems
※日本語版は古い情報しかないため、英語版を参照しましょう。

ただ、昔D-Waveの調査をしているときに知ったのですが、D-Waveの量子ビットは全結合ではなく、結合されているビットとされていないビットが存在するため、モデルを作成するときにも制限が発生します。

一方、QNNCloudも驚くべきことに2000量子ビットです。（2000量子ビットというのは、D-waveにぶつけてきたんじゃないかな。完全なあてずっぽうだけど）。

QNNCloudはそういった制限がなく全ビットが連携されている。最適化する問題を分割するなど、局所解に陥りそうな回避方法をとらなくても済むという意味でも、上に大きな進歩といえます。なにより、それが無料で使用できるというのは衝撃的です。

#QNNCloudの詳細

早速QNNCloudのサイトにアクセスしましょう。

https://qnncloud.com

にアクセスして、IDを登録すれば、誰でもこの量子コンピュータを使うことができます。
<img src="https://qiita-image-store.s3.amazonaws.com/0/121950/a3e4973e-e2e0-11d4-a054-504edc4978a2.png" width=80%/>

右上のJPをクリックすると、日本語になるのでとってもありがたい。

上部に表示される、メニューを順に説明すると、

- DOCUMENT：QNNを理論から理解するためのドキュメント
- PLAYGROUND：コンピュータ上のシミュレーションで動作原理を理解できる
- MACHINES：実際にQNNの実機で問題を検証できる

となります。

## DOCUMENT

右上のDocumentをクリックして、PDFをダウンロードすればどのようにこのQuantum Neural Networkが動作しているのか、理論を知ることができます。

<img src="https://qiita-image-store.s3.amazonaws.com/0/121950/241b18a8-5321-11bc-caee-a6bbbe1eafe4.png" width=80%/>

はい、よくわかりました。わからないことが！

**・・・俺たちが知りたいのはそんなことじゃない、どうつかえるかだ！！**
（すいません、研究者の方々。単に理解できない人間のひがみなので）

ということで、この辺りはサクッとスルーしましょう。

## PLAYGROUND

PLAYGROUNDをクリックすると、かわいい絵柄の画面が表示されます。
「チャレンジする」をクリックしましょう。

<img src="https://qiita-image-store.s3.amazonaws.com/0/121950/199cba2f-d983-6fd7-ca26-09ae031da125.png" width=80%/>

赤は仲が良く、青は仲が悪いとのこと。
いきなり、シビアな社会の縮図のような問題を突き付けられます。にしても、このグループ、1-2のペアを除いて仲が悪すぎでしょう...
※あとで気が付きましたが、実施ごとに問題の設定が替わるようです。

<img src="https://qiita-image-store.s3.amazonaws.com/0/121950/1a30fb09-bfdf-88fb-91ed-0ef8b94767aa.png" width=80%/>

各こどもをクリックするごとに、子供の意向は置いておいて、大人の権限で「A」「B」どちらのバスに乗るか決めることができます。

<img src="https://qiita-image-store.s3.amazonaws.com/0/121950/b983d301-f47b-19dd-fa01-b5cdd2883507.png" width=80%/>

”正解をみる”をクリックすると、自分が選んだ結果と、最適解を比べてくれます。
うん、これくらいだったら楽勝。
※すいません、キャプチャ取り損ねて配置が替わってしまいました。

<img src="https://qiita-image-store.s3.amazonaws.com/0/121950/76ff6347-48c1-17b4-f694-10af05a693e0.png" width=80%/>


さて、これがもっと増えた場合には…？？

<img src="https://qiita-image-store.s3.amazonaws.com/0/121950/100c3c19-b116-b247-5a89-dabbc674a44f.png" width=80%/>


ということで、ホンチャンのPlaygroundへ移ります。これはシミュレーションなので、CPUでゴリゴリQNNの真似をするため、設定できるノードが16までです。
せっかくなので以下最大数を設定を実施して、Runをクリックしてみましょう

- Number of nodes (persons)　**16**を入力
- Graph Topology (Relation)　**Rっぽい形（Random?)**を選択

※アレな人はピンとくるかもしれませんが、左下に表示される図もナニゲに最適化問題ですよね（離散値じゃないので組み合わせ最適化ではないですが）。
※「うそでしょ」と思う人は自力で同等の絵を作ってみて下さい。

<img src="https://qiita-image-store.s3.amazonaws.com/0/121950/d109fed2-14df-ba12-69e0-8bd20b920636.png" width=80%/>

はい、結果が以下。
左の図で、赤と青が先ほどの例で行くとバスのA、Bのグループ分けですね。グループ分けによって「仲がいい」「仲が悪い」を満たす線はグリーンに塗り替えられるようです。
赤、青のまま残っているのは要件を満たさなかった部分ですね。たとえば、0番と3番は仲がいいのに、別チームになっているため要件を満たしておらず、赤の線が見えます。

<img src="https://qiita-image-store.s3.amazonaws.com/0/121950/8fb02c3f-340e-0f97-d6f1-0c165fbc499b.png" width=80%/>

まぁ、普通のマシンでもこのレベルの規模だったら解けるというわけです。

## MACHINES

さて、こっからが量子コンピュータの本番。画面上部の「MACHINES」をクリックしましょう。
ゆるかった雰囲気が一気にアダルティなものになります。

<img src="https://qiita-image-store.s3.amazonaws.com/0/121950/e68157ea-1a7b-0f3c-31d6-722c8a7303a2.png" width=80%/>

画面上部には、「QNN-Machine」として信号が表示されています。混んでいたり、障害があったりすると色が変わるのでしょうが、基本的にいつでもグリーンです。

試しに、一度走らせてみましょう。画面上部の「+ NewProject」をクリックしましょう。

<img src="https://qiita-image-store.s3.amazonaws.com/0/121950/e8eba00c-c214-743f-10f7-0a1c1ad5c5eb.png" width=80%/>

設定できる項目は画面左上から
**Title：** 一覧に表示されるときの名前になります。
**Comment：** コメントです。今の機能（後述）ではあまり意味がないかも
**Type：** 変更できません。なんだろう
**Size：** ノード数でデフォルト100になります。（大きければ大きいほど難しい設定できる最大は2000）
**Connectivity：** AutoかCustomですが、CustomでもRandom seedを選択できるだけです（一定の設定で評価はできますね）。

**Jij:** この問題のデータがダウンロードできます。（従来方式と比較するのもいいかもね！） 

下のヒストグラムはノードのエッジの合計数とその頻度と思われます。


さて、ここまでわかったところで早速実行しましょう。右上のRunをクリック！

![qnn12.png](https://qiita-image-store.s3.amazonaws.com/0/121950/40446891-3a79-6474-617e-93e7f32e2d95.png)
。

はい。即座には終了しません。物理的な装置を使うので順番に実施しているのでしょう。
Project Listに戻ると、作成したデータが「Registered」となっていることがわかります。

![qnn13.png](https://qiita-image-store.s3.amazonaws.com/0/121950/eff17dd9-3f56-4025-4ffc-f2133b048843.png)

さて、しばらく待つと、処理が完了したというメールが届き、QNNが「Finished」になります。
私の時は、22:26に登録して、処理完了が00:33でした。約2時間。朝（JST)やると、即座に実行されました。
メンテナンス時間だったのか、混んでいたのかわかりません。

中央、”Machine's Result”に量子コンピュータがはじき出した結果が球状に表示されます。
雰囲気は伝わってきますが、全然わかりませんね。かつ、WebGLか何かをつかっているのでしょう。CPUだか、GPUだかがブンブンいいだします。

![qnn14.png](https://qiita-image-store.s3.amazonaws.com/0/121950/3817bf8c-7919-d3fa-1334-976b96020622.png)

さて、重要なことは結果です。
右側に”Best Cut[11876]"とありますが、同時にヒストグラムも表示されています。

量子コンピュータなのになぜヒストグラムが表示されるのでしょうか？？
それは、D-waveの量子コンピュータもそうですが、必ず正解が出てくるわけではありません。いい感じの答えは出てきますが、最適解は保証されていないのです。
そこで、何度か試行してその結果を返します。（D-waveも同じ）

（半端な知識ですが）もともと、原理的に最も安定する形になる確率が高いという特性を利用しているだけなので、必ずしも最適解がはじき出されるわけではありません。
むしろ、これだけ目的関数の差が出にくく、組み合わせの数の多さのから局所解だらけのなかでよくこれだけの値を出すなと感心します。

話を戻して、QNNCloudですが、合計100回の試行を行い、その結果を返してくれるようです。

今回の問題では、
BEST：11876
WORST：10512
です。一割くらい差が出ていますね。

さて、使い方がわかったところで、自分で作成した問題をUploadして...としたいところですが、現在のQNNCloudにはそのような機能がありません。
基本眺めるだけです。

## まとめ

現行ではやりの量子コンピュータで、組み合わせ最適化問題を触ってみた。

- どうやらいい感じで答えをはじき出してくれるようだ。
- 残念ながら実際の処理時間はよくわからない。
- いまは動きを眺めるだけ（活用はできない）
- アップロードの時期は未定（ある人がQNNCloudに問い合わせたらしい）