QAOAとは何か
QAOA(Qauntum Approximate Optimization Algortihm, 量子近似最適化アルゴリズム)とは、量子アルゴリズムの一種です。
組み合わせ最適化問題を古典よりも高速に、あるいは省エネルギーで(?)解くことが期待されています。
本記事の想定読者は「ベクトルや行列はわかるが、組み合わせ最適化や量子はわからない」人です。
組み合わせ最適化問題
組み合わせ最適化問題 は、膨大にある選択肢からコストが最小となるようものを見つける問題です。
例えば、
コインの数
数式に落とし込んで、賢いアルゴリズムで解を探索していく必要があります。
我々はこれを量子のパワーで賢く解いてやろうというわけです。
もちろんこの例に限っては、最小コストが
一般の問題は制約条件があることがほとんど(例えば、隣り合うコインは裏表が異なっていなければならない)です。
簡単に解を思いつく事はできません。
状態とコストをベクトルと行列で書く
今後便利のために、コインの裏表
そこで、
と表すことにします。ベクトルの成分のどれか1つだけが1になります。
また、
このとき、コスト(例えば表の数の合計)を巧みな行列記法で表すことができます。
ぱっと見難しそうですが、
横ベクトル×行列×縦ベクトル = 横ベクトル×縦ベクトル = ベクトル内積 = スカラー
となりますので、たしかに$ \langle q|H|q \rangle$ はベクトル(コインの裏表の情報)を受け取ってスカラー(コスト)を返す関数になっています。
量子
ここから、量子版を説明します。
状態とコスト
量子になっても、状態(コインの裏表の情報)をベクトル
しかし、ベクトルの自由度が拡張されます。
-
ベクトルの成分は勝手な複素数を取ることが出来る
-
ただし、ベクトルの大きさ(長さ)は1でなければならない。
よって、古典的には解釈できない状態が許容されます。例えば、
という状態は、許容されます。
これを古典的な状態に無理やり分解しようとすると、
という形になります。コインが
そのため、重ね合わせ状態とも呼ばれます。
しかし、状態をベクトルで表現し、その”和を取る”という操作が何を意味するのか、全くわかりません。
更に古典的な解釈が難しい状態をみてみます。
これも大きさ1のベクトルですので、何らかの量子状態を表現しています
しかし 状態を複素数倍する というのは、古典的には意味不明です。
直感的なイメージというよりは、ベクトル(と行列)の計算だと割り切ることをおすすめします。
次にコスト
先に述べたように表式は古典と変わらず、$ C = \langle q|H|q \rangle$です。
ただし状態ベクトルが複素数であることを許しましたので、
コスト最小化
組み合わせ最適化問題を解くことは、コスト
状態ベクトルを変化させる
解を探索するには、量子的な状態
量子状態を操作するにはどうしたらいいでしょうか?
いかなる量子状態も、
-
ベクトルの成分は勝手な複素数を取ることが出来る
-
ただし、ベクトルの大きさ(長さ)は1でなければならない。
という条件を満たす必要があります。
実はベクトルの大きさを変えないような変換とは、ユニタリ行列
と表されます。
ユニタリ行列
U をパラメータで表す
状態ベクトルを変化させるユニタリ行列ユニタリ行列
そこで、例えば実数の角度パラメータ
のように
これで、
このようなパラメータ化の方法は色々あります。(上記の例は 回転ゲート と呼ばれるものです)
とします。このようなゲートの連続を「量子回路」と呼びます。
QAOA
ここまでのことがわかれば、QAOAの動作が説明できます。
QAOAの動作は以下のとおりです。
-
適当な量子(初期)状態
を用意する。|q_{init} \rangle -
個のパラメータ付き量子ゲート2p を用意するU(\beta_{1}), U(\gamma_{1}), ...., U(\beta_{p}), U(\gamma_{p}) -
上記のゲートからなる量子回路を作り、量子状態に作用させる。
$|q_{init} \rangle \to |q \rangle = U(\beta_{p})U(\gamma_{p}), ...., U(\beta_{1})U(\gamma_{1})|q_{init} \rangle $
- 得られた量子状態
におけるコスト|q \rangle を計算する。C
$ C = \langle q|H|q \rangle $
なお、行列
がより小さくなるように、量子ゲートのパラメータC をアップデートします。\beta_{1}, \gamma_{1},...,\beta_{p}, \gamma_{p}
アップデートの計算には、古典的な最適化アルゴリズムが使えます。
調子に乗って
- 最適化が収束したら、量子状態
を測定し、解を得ます。|q \rangle
例として
2.のパラメータ付き量子ゲートの個数や行列成分の決め方は、天下り的に思えます。
実は背景には量子断熱定理というものがあるのですが、これを知らなくてもQAOAは使えますので、今は良いことにしましょう。
QAOAを使った最適化の具体例
では実際に使ってみましょう。
解く問題はグラフの問題で、MACXCUTと呼ばれるものです。
ここでは4つの頂点からなるグラフを考えます。
問題設定やコストの定式化の詳細については
外部サイト
(5-3. Quantum Approximate Optimazation Algorithm (QAOA): 量子近似最適化アルゴリズム)
をご確認ください。
この問題の解は、
blueqatで解いてみましょう。
#pip install blueqat
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は、このようにコーディングが圧倒的に簡単化できますので、良いですね。
結果を可視化する関数を書きます。
これは状態
# プロットする
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()
myplot_histogram(result,4)
<Figure size 1440x720 with 1 Axes>
確かに問題が解けています。
- たまにQAOAでうまく解けないことがありますので、その場合は何度か実行してみてください。
2つの解が同時に求まったことになりますが、実はこれは
答えが複数ある時、量子計算の結果として 答えのの重ね合わせ状態が得られる ということは、よく起きます。
このあたりも、古典計算と少し違うところですね。
色々いじってみる
せっかくなので少し遊んでみましょう。ラウンド数
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の課題
このように、QAOAは量子コンピュータで組み合わせ最適化問題を解けるアルゴリズムです。
数値最適化に落とし込むんでいるので、多少雑音があっても動きます。
現状の量子コンピュータは雑音が大きいため、このアプローチは確かに魅力的です。
ただ、round数
QAOAであっても実行が厳しくなってきます。
例えば、湊さんの
Googleの最新SycamoreプロセッサでのQAOA組合せ最適化問題の論文の解説
などを参照して論文を読んでみるとよいかと思います。
まとめ
ゼロからQAOAを頑張って説明してみました。
簡単化のために扱っていない事項も多々ありますが、ご容赦ください。