Nobisuke
Dekisugi
RAG
Privacy policy
5
QAOA(Qauntum Approximate Optimization Algortihm, 量子近似最適化アルゴリズム)とは、量子アルゴリズムの一種です。
組み合わせ最適化問題を古典よりも高速に、あるいは省エネルギーで(?)解くことが期待されています。
本記事の想定読者は「ベクトルや行列はわかるが、組み合わせ最適化や量子はわからない」人です。
組み合わせ最適化問題 は、膨大にある選択肢からコストが最小となるようものを見つける問題です。
例えば、
個のコインを投げる時、表の枚数の合計をコストとします。表裏のパターン通りからコストが最小になるようなものを見つけること
コインの数程度であれば総当りでもよいですが、が増えると難しくなります。
数式に落とし込んで、賢いアルゴリズムで解を探索していく必要があります。
我々はこれを量子のパワーで賢く解いてやろうというわけです。
もちろんこの例に限っては、最小コストが(即ち {裏,裏,...,裏})であることは明らかですが、
一般の問題は制約条件があることがほとんど(例えば、隣り合うコインは裏表が異なっていなければならない)です。
簡単に解を思いつく事はできません。
今後便利のために、コインの裏表をベクトルで表す記法を導入します。
の時を考え、表を,裏をと表す時、裏表のパターンはの通りあります。
そこで、成分のベクトルを導入して
のときは
のときは
のときは
のときは
と表すことにします。ベクトルの成分のどれか1つだけが1になります。
に対して、その共役複素数かつ転置したものをと表します。
また、を、をと表記します。
このとき、コスト(例えば表の数の合計)を巧みな行列記法で表すことができます。
に作用する(うまい)行列を考えて、と表現できます。
ぱっと見難しそうですが、
横ベクトル×行列×縦ベクトル = 横ベクトル×縦ベクトル = ベクトル内積 = スカラー
となりますので、たしかに はベクトル(コインの裏表の情報)を受け取ってスカラー(コスト)を返す関数になっています。
ここから、量子版を説明します。
量子になっても、状態(コインの裏表の情報)をベクトルで表すことも、コストを行列を使ってと表すことも変わりません。
しかし、ベクトルの自由度が拡張されます。
ベクトルの成分は勝手な複素数を取ることが出来る
ただし、ベクトルの大きさ(長さ)は1でなければならない。
よって、古典的には解釈できない状態が許容されます。例えば、
という状態は、許容されます。
これを古典的な状態に無理やり分解しようとすると、
という形になります。コインがの状態との状態の”和” です。
そのため、重ね合わせ状態とも呼ばれます。
しかし、状態をベクトルで表現し、その”和を取る”という操作が何を意味するのか、全くわかりません。
更に古典的な解釈が難しい状態をみてみます。
これも大きさ1のベクトルですので、何らかの量子状態を表現しています
しかし 状態を複素数倍する というのは、古典的には意味不明です。
直感的なイメージというよりは、ベクトル(と行列)の計算だと割り切ることをおすすめします。
次にコストを考えます。
先に述べたように表式は古典と変わらず、です。
ただし状態ベクトルが複素数であることを許しましたので、は一般に複素数になりますが、今回は実数になるようなしか使いません。
がエルミート行列であるとき、が実数になります。
組み合わせ最適化問題を解くことは、コストを最小化するような状態を見つけることです。
解を探索するには、量子的な状態 を色々と取り替えながら、コストを計算する必要があります。
量子状態を操作するにはどうしたらいいでしょうか?
いかなる量子状態も、
ベクトルの成分は勝手な複素数を取ることが出来る
ただし、ベクトルの大きさ(長さ)は1でなければならない。
という条件を満たす必要があります。
実はベクトルの大きさを変えないような変換とは、ユニタリ行列のことであって
と表されます。
をかけて状態を変化させながら、コストが最小になるようなものを見つければよいのです。
ユニタリ行列は、量子コンピューターでは 量子ゲート と呼ばれます。
ユニタリ行列を色々と試して状態を探索する といっても、ユニタリ行列の成分には無数のパターンがあります。
そこで、例えば実数の角度パラメータを使って
のようにを限定します。(簡単のために、1量子の状態ベクトルへの作用を考えました)
これで、が決まればユニタリ行列が決まります。
このようなパラメータ化の方法は色々あります。(上記の例は 回転ゲート と呼ばれるものです)
が1つだけだと都合よく解にたどり着くことは難しいので、複数のパラメータ付きを連結させて
とします。このようなゲートの連続を「量子回路」と呼びます。
ここまでのことがわかれば、QAOAの動作が説明できます。
QAOAの動作は以下のとおりです。
適当な量子(初期)状態 を用意する。
個のパラメータ付き量子ゲート を用意する
上記のゲートからなる量子回路を作り、量子状態に作用させる。
が大きいほど回路が”深く”なり、いろいろな量子状態を探索できるようになります。をレイヤー数やラウンド数といいます。
なお、行列は上記計算が組み合わせ最適化問題のコストの計算に一致するようにうまく選んでおきます。
アップデートの計算には、古典的な最適化アルゴリズムが使えます。
調子に乗ってを大きくしていると、ここでパラメータの数が増えて最適化が大変になります。
例としてのQAOAを示します。
2.のパラメータ付き量子ゲートの個数や行列成分の決め方は、天下り的に思えます。
実は背景には量子断熱定理というものがあるのですが、これを知らなくてもQAOAは使えますので、今は良いことにしましょう。
では実際に使ってみましょう。
解く問題はグラフの問題で、MACXCUTと呼ばれるものです。
ここでは4つの頂点からなるグラフを考えます。
問題設定やコストの定式化の詳細については
外部サイト
(5-3. Quantum Approximate Optimazation Algorithm (QAOA): 量子近似最適化アルゴリズム)
https://dojo.qulacs.org/ja/latest/notebooks/5.3_quantum_approximate_optimazation_algorithm.html
をご確認ください。
この問題の解は、との2つです。
blueqatで解いてみましょう。
Copy #pip install blueqat
Copy from blueqat import vqe, pauli import numpy as np edges = [(0, 1), (1, 2), (2, 3), (0, 3)] # graph to be solved p = 5 # number of round H = sum([pauli.Z(i) * pauli.Z(j) for i, j in edges]) # matrix to calc. cost ansatz = vqe.QaoaAnsatz(H, p) #trial (parametrized) circuit result = vqe.Vqe(ansatz).run() # Execute QAOA simulation
QAOAが終わりました。たったこれだけ。。
blueqatは、このようにコーディングが圧倒的に簡単化できますので、良いですね。
結果を可視化する関数を書きます。
これは状態の各成分の絶対値(の二乗)を表示します。
Copy # プロットする import matplotlib.pyplot as plt import numpy as np %matplotlib inline def myplot_histogram(result,n): probs = np.array(list(result.probs.values())) ## z方向に射影測定した時に得られる可能性があるビット列 z_basis = [format(i,"b").zfill(n) for i in range(probs.size)] plt.figure(figsize=(20, 10)) plt.xlabel("states") plt.ylabel("probability(%)") plt.bar(z_basis, probs*100) plt.show()
Copy myplot_histogram(result,4)
<Figure size 1440x720 with 1 Axes>
とが大きいことが分かります。
確かに問題が解けています。
2つの解が同時に求まったことになりますが、実はこれはが先に述べた「重ね合わせ状態」というのになっています。
答えが複数ある時、量子計算の結果として 答えのの重ね合わせ状態が得られる ということは、よく起きます。
このあたりも、古典計算と少し違うところですね。
せっかくなので少し遊んでみましょう。ラウンド数を減らすとどうなるでしょうか。
Copy p = 1 # number of round ansatz = vqe.QaoaAnsatz(H, p) #trial (parametrized) circuit result = vqe.Vqe(ansatz).run() # Execute QAOA simulation myplot_histogram(result,4)
<Figure size 1440x720 with 1 Axes>
解ではない状態が育ってきてしまいましたね。
このように、QAOAは量子コンピュータで組み合わせ最適化問題を解けるアルゴリズムです。
数値最適化に落とし込むんでいるので、多少雑音があっても動きます。
現状の量子コンピュータは雑音が大きいため、このアプローチは確かに魅力的です。
ただ、round数を増やしたり(回路が長く、複雑になる)、解く問題のスケールを大きくしたりする(必要な量子ビット数が増える)と QAOAであっても実行が厳しくなってきます。
例えば、湊さんの
Googleの最新SycamoreプロセッサでのQAOA組合せ最適化問題の論文の解説
https://qiita.com/YuichiroMinato/items/3aa39b335450789db050
などを参照して論文を読んでみるとよいかと思います。
ゼロからQAOAを頑張って説明してみました。
簡単化のために扱っていない事項も多々ありますが、ご容赦ください。
© 2024, blueqat Inc. All rights reserved