common.title
Cloud support

Nobisuke

Dekisugi

RAG


autoQAOA
RAG for dev
Fortune telling app
Annealing
DEEPSCORE
Translation

Overview
Service overview
Terms of service

Privacy policy

Contact
Research

Sign in
Sign up
common.title

インターン講座3:QAOA

Yuichiro Minato

2022/09/02 01:55

2

今回はインターン3回目です。ようやく量子計算にはいります。
なるべくサクッと行きます。ちなみに今回はQAOAを行いますが、以前行ったQAOA説明コンテストの応募内容がとても高度でした。
こちらを参考にしてもらえるとさらに理解が深まります。

QAOAについて調べてみた
https://blueqat.com/8cc88814-a573-4ac9-bca9-14cf40664d0f/f49e9713-0578-4311-9852-f3c0d2984b54

ゼロからQAOAを説明してみる。~基本原理からblueqat実行まで~
https://blueqat.com/Kuma/93c70414-0a10-46ee-bf59-66b11245e716

量子コンピュータの応用 - QAOAの仕組みとこれを応用した組合せ最適化問題のプログラミング(blueqat編)
https://blueqat.com/tetsurotabata/3a8425d5-68a3-4a8b-9773-2c3940bf5898

量子状態と状態ベクトル

量子コンピュータで利用されるデータの扱いは今のコンピュータと違って、1量子ビットでは球を使って表現されます。量子ビットは|0>状態と|1>状態を持っていてベクトルで表現できます。

0=[10],1=[01]\mid 0 \rangle = \begin{bmatrix} 1 \\ 0 \end{bmatrix}, \mid 1 \rangle = \begin{bmatrix} 0 \\ 1 \end{bmatrix}

また、任意の量子ビットは重ね合わせて量子状態を表現できます。

ψ=α0+β1=α[10]+β[01]=[αβ]\mid \psi \rangle = \alpha \mid 0 \rangle + \beta \mid 1 \rangle = \alpha \begin{bmatrix} 1 \\ 0 \end{bmatrix} + \beta \begin{bmatrix} 0 \\ 1 \end{bmatrix} = \begin{bmatrix} \alpha \\ \beta \end{bmatrix}

また、下記条件を満たします。

α2+β2=1|\alpha|^2+|\beta|^2 = 1

ψ\mid \psi \rangleは状態ベクトル(波動関数)と呼ばれ量子ビットの量子状態を表します。α\alphaβ\betaは複素数で「確率振幅」と呼ばれ、二乗するとその対応する計算基底の出現確率になり、α2|\alpha|^2β2|\beta|^2は「測定」をすることで取得できます。

量子状態の極座標表示

ブロッホ球は二つの直交する純粋状態の重ね合わせで表現できる量子状態を単位球面上に表す表記法。
https://ja.wikipedia.org/wiki/%E3%83%96%E3%83%AD%E3%83%83%E3%83%9B%E7%90%83

vqe2

ψ=[cosθsinθeiϕsinθeiϕcosθ][10]=[cosθsinθeiϕ]\mid \psi \rangle = \begin{bmatrix} cos\theta & -sin\theta e^{-i\phi}\\ sin\theta e^{i\phi} & cos\theta \end{bmatrix} \begin{bmatrix} 1\\0 \end{bmatrix} = \begin{bmatrix} cos\theta \\ sin\theta e^{i\phi} \end{bmatrix}

のように角度を利用したパラメータ表記もできます。量子データは角度で表現されるということを覚えてください。

状態ベクトルの操作と量子ゲート

状態ベクトルを操作するには、量子ゲートを利用します。変分アルゴリズムでは基本のパウリゲート、任意回転ゲート、アダマールゲートを主に利用します。

パウリゲートはXYZの3種類があり、それぞれブロッホ球でのXYZ軸周りでの180度の回転を意味し、対応する行列は、

X=[0110],Y=[0ii0],Z=[1001]X= \begin{bmatrix} 0&1 \\ 1&0 \end{bmatrix} , Y= \begin{bmatrix} 0&-i \\ i&0 \end{bmatrix} , Z= \begin{bmatrix} 1&0 \\ 0&-1 \end{bmatrix}

となります。また、XYZ軸周りに任意回転にしたのが、RX,RY,RZゲートで、

Rx(θ)=[cos(θ2)isin(θ2)isin(θ2)cos(θ2)],Ry(θ)=[cos(θ2)sin(θ2)sin(θ2)cos(θ2)],Rz(θ)=[eiθ200eiθ2]Rx(\theta) = \begin{bmatrix} \cos\left(\frac{\theta}{2}\right) & -i\sin\left(\frac{\theta}{2}\right)\\ -i\sin\left(\frac{\theta}{2}\right) & \cos\left(\frac{\theta}{2}\right) \end{bmatrix}, Ry(\theta) = \begin{bmatrix} \cos\left(\frac{\theta}{2}\right) & -\sin\left(\frac{\theta}{2}\right)\\ \sin\left(\frac{\theta}{2}\right) & \cos\left(\frac{\theta}{2}\right) \end{bmatrix}, Rz(\theta) = \begin{bmatrix} e^{-i\frac{\theta}{2}} & 0\\ 0 & e^{i\frac{\theta}{2}} \end{bmatrix}

となります。状態ベクトルにこれらの量子ゲートを作用させることで量子状態を変化させることができます。

X[10]=[0110][10]=[01]X \begin{bmatrix} 1 \\ 0 \end{bmatrix} = \begin{bmatrix} 0&1 \\ 1&0 \end{bmatrix} \begin{bmatrix} 1 \\ 0 \end{bmatrix} = \begin{bmatrix} 0 \\ 1 \end{bmatrix}

アダマールゲートはXZ軸45度周りに回転させる便利なゲートです。

H=12[1111]H= \frac{1}{\sqrt{2}} \begin{bmatrix} 1&1 \\ 1&-1 \end{bmatrix}

固有値・固有ベクトル問題

ある行列に対する固有値と固有ベクトルを見つけることができれば様々な問題を解くことができます。与えられた行列HH(ハミルトニアンと呼ばれます)に対して、固有値をE0E_0、固有ベクトルをψ\mid \psi \rangleとしたときに、

Hψ=E0ψH \mid \psi \rangle = E_0 \mid \psi \rangle

を満たすような、E0E_0ψ\mid \psi \rangleを見つけるのが目的です。ψ\mid \psi \rangleは状態ベクトル(波動関数)と呼ばれます。

量子コンピュータの問題のほとんどがこの固有値問題に対応しています。行列Hに問題を設定し、固有値Eを探します。

量子変分原理

固有値の探し方はNISQでは主に最適化を使います。インターンでは二回目に学びました。

ψ(θ)Hψ(θ)E0\langle \psi (\theta) \mid H \mid \psi (\theta) \rangle \geq E_0

固有値を直接求めるのは厳しいので、間接的に固有値の期待値にできるだけ近づける最適化計算に落とし込みます。ハミルトニアンHHは与えられた式なので、私たちにできるのは状態ベクトルψ(θ)\mid \psi (\theta) \rangleをできるだけ固有状態に近づける状態ベクトルを角度の最適化計算として探していくのが今回の目的です。状態ベクトルの探索はansatz(アンザッツ)と呼ばれる回路を作ることで実現します。

ハミルトニアンとその期待値

ハミルトニアンHHはパウリゲートXYZと単位行列Iから構成されるエルミート行列です。ある量子状態ψ\mid \psi\rangleが与えられた場合の、ハミルトニアンHHの期待値EEは、上記の式の両方にψ\langle \psi \midを左からかけてみると、

ψHψ=ψEψψHψ=EψψψHψ=E\langle \psi \mid H \mid \psi \rangle = \langle \psi \mid E \mid \psi \rangle\\ \langle \psi \mid H \mid \psi \rangle = E \langle \psi \mid \psi \rangle\\ \langle \psi \mid H \mid \psi \rangle = E

のように計算できます。1量子ビットの例として、任意の量子状態ψ\mid \psi \rangleと任意のハミルトニアンHHから、

ψHψ=[αβ][abcd][αβ]\langle \psi \mid H \mid \psi \rangle = \begin{bmatrix} \alpha^* & \beta^* \end{bmatrix} \begin{bmatrix} a&b\\ c&d \end{bmatrix} \begin{bmatrix} \alpha\\ \beta \end{bmatrix}

のように計算できます。

ハミルトニアンZの期待値を求める

任意の状態ベクトルにおけるハミルトニアンがH=ZH = Zの場合の期待値は、

ψHψ=[αβ][1001][αβ]=α2β2\langle \psi \mid H \mid \psi \rangle = \begin{bmatrix} \alpha^* & \beta^* \end{bmatrix} \begin{bmatrix} 1&0\\ 0&-1 \end{bmatrix} \begin{bmatrix} \alpha\\ \beta \end{bmatrix} = |\alpha|^2 - |\beta|^2

となります。α2|\alpha|^2は0がでる確率、β2|\beta|^2は1が出る確率に対応します。

ハミルトニアンがH=XH = Xの場合のハミルトニアンHHの期待値は、

ψHψ=[αβ][0110][αβ]=αβ+αβ\langle \psi \mid H \mid \psi \rangle = \begin{bmatrix} \alpha^* & \beta^* \end{bmatrix} \begin{bmatrix} 0&1\\ 1&0 \end{bmatrix} \begin{bmatrix} \alpha\\ \beta \end{bmatrix} = \alpha^* \beta + \alpha \beta^*

となりますが、通常の測定ではこの値を求めることができませんので、ハミルトニアンの変形を通じて解を得ます。

ハミルトニアンの変形

ハミルトニアンHHZZの場合には、期待値の計算ができますが、XやYの場合には求めることができません。そこでハミルトニアンの変形を利用します。

X=HZHX = HZH

より、

ψXψ=ψHZHψ=ψZψ\langle \psi \mid X \mid \psi \rangle \\ = \langle \psi \mid HZH \mid \psi \rangle\\ = \langle \psi' \mid Z \mid \psi' \rangle

のように状態ベクトルを変形することで対応できます。Yの場合は、

Y=RX(π/2)ZRX(π/2)Y = RX(-\pi/2) Z RX(\pi/2)

と、なり同様に、

ψYψ=ψRX(π/2)ZRX(π/2)ψ=ψZψ\langle \psi \mid Y \mid \psi \rangle \\ = \langle \psi \mid RX(-\pi/2) Z RX(\pi/2) \mid \psi \rangle\\ = \langle \psi'' \mid Z \mid \psi'' \rangle

とすることができます。これらは、量子回路の測定の直前に上記のHやRXゲートを入れて測定を行うことで期待値を計算することができます。

線形結合

実際にはハミルトニアンHHはエルミート行列で与えられ、ユニタリ行列の和の形で与えられ、下記のように分解できます。

ψaH1+bH2ψ=ψaH1ψ+ψbH2ψ=aψH1ψ+bψH2ψ\langle \psi \mid aH_1 + bH_2 \mid \psi \rangle \\ = \langle \psi \mid aH_1 \mid \psi \rangle + \langle \psi \mid bH_2 \mid \psi \rangle \\ = a\langle \psi \mid H_1 \mid \psi \rangle + b\langle \psi \mid H_2 \mid \psi \rangle

これを使えば、複雑なハミルトニアンの場合でも、

H=1.2X0Z2+2.5Z0X1Y23.4Z2X1H = 1.2 X_0 Z_2 + 2.5 Z_0 X_1 Y_2 - 3.4 Z_2 X_1

期待値は、

ψ1.2X0Z2+2.5Z0X1Y23.4Z2X1ψ=1.2ψX0Z2ψ+2.5ψZ0X1Y2ψ3.4ψZ2X1ψ\langle \psi \mid 1.2 X_0 Z_2 + 2.5 Z_0 X_1 Y_2 - 3.4 Z_2 X_1 \mid \psi \rangle\\ = 1.2\langle \psi \mid X_0 Z_2 \mid \psi \rangle + 2.5 \langle \psi \mid Z_0 X_1 Y_2\mid \psi \rangle - 3.4 \langle \psi \mid Z_2 X_1 \mid \psi \rangle

のように個別に計算をして和を求めることで計算できます。

量子断熱計算

量子断熱計算は、状態ベクトルを断続的に変化させることで基底状態をキープしたまま時間発展を行うことができる理論です。

初期状態のハミルトニアンをHstartH_{start}として、最終的に求めたい問題のハミルトニアンをHfinalH_{final}としたときに、時間ttと全体のスケジュールTTから、

Htemp=(1tT)Hstart+tTHfinalH_{temp} = (1-\frac{t}{T})H_{start} + \frac{t}{T}H_{final}

としたときにTT\rightarrow\inftyとすれば、時間発展で変化させた状態ベクトルが、その瞬間瞬間のハミルトニアンに追従し、固有状態をとり固有値λ\lambdaを持つようにすることができます。

Htempψ=E0tempψH_{temp}\mid \psi \rangle = E_{0temp}\mid \psi \rangle

時間発展計算は、

ψt+1=Uψt=eiHtψt\mid \psi_{t+1} \rangle = U \mid \psi_t \rangle = e^{-iHt} \mid \psi_t \rangle

となります。課題は基底状態と第一励起状態が最接近する部分ですが、E1(t)E0(t)E_1(t)-E_0(t)のエネルギー差に注意して計算することによって、基底状態をキープできます。

QAOA回路

QAOAは上記の量子断熱計算の時間発展計算をansatzとして変分アルゴリズムに適用したものです。

|0> --H-- --RZZ--RZ-- --RX-- --RZZ--RZ-- --RX--
            |                  |
|0> --H-- --RZZ--RZ-- --RX-- --RZZ--RZ-- --RX--

全体構成を大きく分けて、

1.mixerを選ぶと、初期状態が決まる
2.定式化をQUBOもしくはZで作る

です。2番目の定式化は自動的に時間発展されます。

一番左は初期固有状態|+>を作っています。これに対応するハミルトニアンXは時間発展の形でRxで出てきます。通常はmixerはデフォルトではXを選び、初期状態はそれに対応する|+>を作るために、HNH^ {\otimes N}が利用されることが多いです。

また、CX-Rz-CXは問題設定のハミルトニアンのウェイトに対応し、次のRzはハミルトニアンのバイアスに対応しています。

blueqatのQaoaAnsatzはハミルトニアンとステップ分割数を決めれば、自動的にこの時間発展のansatzを構成してくれます。ライブラリ側で適切な計算をしてくれているので、私たちがするのはハミルトニアンの定式化とmixerの選択です。簡単な定式化を解いてみましょう。

## イジング定式化 イジングモデルと呼ばれる物理モデルを利用して組合せ最適化問題を解きます。イジングモデルでは通常スピンの上下を利用して問題を定式化します。定式化では演算子としてZを利用します。Zは+1と-1を期待値としてもとめられます。

H=Z0Z0Z1H = -Z_0 -Z_0*Z_1

## QUBO つぎに、上記ハミルトニアンZの定式化から派生して、0と1で定式化をするQUBOを確認します。QUBOはZの定式化を書き換えた形になりますが、blueqatでは自動変換してくれるツールがあります。

定式化は、

H=2q14q0q1H = 2q_1-4q_0q_1

としてみたいと思います。

from blueqat import Circuit from blueqat.utils import qaoa from blueqat.pauli import qubo_bit as q from blueqat.pauli import X,Y,Z,I hamiltonian = 2*q(1)-4*q(0)*q(1) step = 1 result = qaoa(hamiltonian, step) result.circuit.run(shots=100)
Counter({'11': 47, '00': 36, '10': 17})

© 2024, blueqat Inc. All rights reserved