なんでか知らんけど、ここらへんの詳細って誰も説明しないんですよねぇ。
ノウハウなのか面倒だからなのか知らんけど。
量子コンピュータの基本的なゲートは、一応は知っている読者を想定しています。
BlueqatのSlackで聞かれたので、この際だからまとめます。(誰でも入れます。招待リンクはこちら)
期待値測定? なんだっけそれ?
VQEの大雑把な流れは以前書いた記事を参照してほしいのですが、VQEの問題設定について軽くおさらいします。
問題設定
ハミルトニアンと呼ばれる行列$\hat H$が与えられます。この行列に対し、ノルム1のベクトルであって、$\boldsymbol{X}\cdot \hat H \boldsymbol{X}$ (ただし$\cdot$は内積)が最小になるような$\boldsymbol{X}$を探したとき、$\boldsymbol{X}\cdot \hat H \boldsymbol{X}$の値はいくらか、という問題をVQE/QAOAによって解くことができます。
といったものでした。
以前の記事では量子力学っぽい記述はあえて避けたのですが、
- $\boldsymbol{X}$は量子力学では$|\Psi>$と書かれることが多いです。
- $\boldsymbol{X}\cdot \hat H \boldsymbol{X}$は$<\Psi|\hat H|\Psi>$と書かれることが多いです。
記号の意味は、
- $\hat H|\Psi>$は、$\hat H$(行列)と$|\Psi>$ (縦ベクトル)の掛け算
- $<\Psi|$は$|\Psi>$のエルミート共役(実ベクトルでいうと転置)
- $<\Psi|\hat H|\Psi>$は、$<\Psi|$と$\hat H|\Psi>$の掛け算
- 横ベクトルと縦ベクトルの掛け算なので、具体的には、$|\Psi>$と$\hat H|\Psi>$の内積
です。
量子力学では、ハミルトニアン$\hat H$はエネルギーを求める演算子で、$<\Psi|\hat H|\Psi>$は、量子状態$|\Psi>$のエネルギーの期待値を求める計算に相当します。
この記事で学びたいこと
この記事では、
- $\hat H$が与えられている
- 量子状態$|\Psi>$を作る量子回路が与えられている
ときに、どうやったら期待値$<\Psi|\hat H|\Psi>$が求まるのかを学びます。
なお、VQE/QAOAでは、$|\Psi>$はAnsatzと呼ばれ、パラメータを振って$|\Psi(\theta)>$のように書かれることもあります。
測定したらどうなるの?
量子コンピュータでの測定は、通常は「Z基底での測定」と呼べるものしかできません。
これは、
$|\Psi> = \alpha |0> + \beta |1> (|\alpha|^2 + |\beta|^2 = 1)$
と書き表せるとき、
- $|\alpha|^2$の確率で測定結果0を得る
- $|\beta|^2$の確率で測定結果1を得る
というものです。
VQEでは、測定によって期待値を得ますので、これは非常に重要です。
ハミルトニアンはパウリ行列の線型結合で表せる
ハミルトニアン$\hat H$は、パウリ行列の直積と、線型結合で書けます。
量子化学でよく用いるものは、第二量子化をして、Jordan-Wigner変換やBravyi-Kitaev変換によって、この形式が得られますし、
QAOAで用いるイジングモデルのハミルトニアンは、$\sigma_z$をパウリのZ行列で置くと、この形式が得られます。
ハミルトニアンや、パウリ行列の直積は線形
つまり、
$\hat H = a\hat H_1 + b\hat H_2$と書ける場合、
\begin{eqnarray}
<\Psi|\hat H|\Psi> &=& <\Psi|a\hat H_1 + b\hat H_2|\Psi> \\
&=& a<\Psi|\hat H_1|\Psi> + b<\Psi|\hat H_2|\Psi>
\end{eqnarray}
のように、ばらばらに分けることができます。
これだけ分かっていれば、とりあえず十分でしょう。簡単な例からはじめて、少しずつ一般的にしていきます。
ハミルトニアンがパウリのZ行列の場合
$|\Psi> = \alpha |0> + \beta |1>(|\alpha|^2 + |\beta|^2 = 1)$として、$<\Psi|Z|\Psi>$を求める方法を考えます。
まず、
\begin{eqnarray}
|0>&=&\begin{pmatrix}1\\0\end{pmatrix}\\
|1>&=&\begin{pmatrix}0\\1\end{pmatrix}\\
Z&=&\begin{pmatrix}1&0\\0&-1\end{pmatrix}
\end{eqnarray}
でしたので、
$Z |\Psi> = \alpha |0> - \beta |1>$
となり、
\begin{eqnarray}
<\Psi|Z|\Psi>&=&(<0|\alpha^* + <1|\beta^*)( \alpha |0> - \beta |1>)\\
&=&\alpha^*\alpha<0|0> + \alpha^*\beta<0|1> - \beta^*\alpha <1|0> - \beta^*\beta<1|1>\\
&=&\alpha^*\alpha - \beta^*\beta \\
&=&|\alpha|^2 - |\beta|^2
\end{eqnarray}
となります。 $<n|m> = \delta_{n,m}$となることを使いました。また、${}^*$は、複素共役を表します。
先ほど、測定をすると
- $|\alpha|^2$の確率で測定結果0を得る
- $|\beta|^2$の確率で測定結果1を得る
と書いたことを思い出して下さい。
つまり、何度か測定をして、
- $|0>$が得られた数を$N_0$
- $|1>$が得られた数を$N_1$
- トータルの測定回数を$N = N_0 + N_1$
とすると、
$<\Psi|Z|\Psi> = N_0/N - N_1/N = (N_0 - N_1)/N$
となります。
よって、$|\Psi>$を測定して、回数を測ることで、期待値の計算ができました。
ハミルトニアンがZ行列の定数倍のとき
$\hat H = 1.2Z$のような場合、より一般的には、$\hat H = kZ$の場合、
線形性より$<\Psi|kZ|\Psi> = k<\Psi|Z|\Psi>$が成り立つので、単に、Zのときの結果をk倍すればいいだけだと分かります。
ハミルトニアンがX行列の場合
量子ゲート計算の基本で、
X = HZH
というものがあります。(Hはアダマールゲートです。ハミルトニアンではないので気をつけて下さい)
これを使うと
$<\Psi|X|\Psi> = <\Psi|HZH|\Psi>$
なので、
$|\Psi'> = H|\Psi>$
と置くと、これは
$<\Psi'|Z|\Psi'>$の計算をしていることになります。
つまり、$|\Psi>$にアダマールゲートをかけてから、Z行列のときと同じ計算をすればいいことが分かります。
ハミルトニアンがY行列の場合
Y = RX(-π/2) Z RX(π/2)
となります。RX(π/2)のエルミート共役はRX(-π/2)なので、これは
Y = RX(π/2)† Z RX(π/2)
になります。
なので、
$|\Psi'> = RX(\pi/2)|\Psi>$と置くと、$<\Psi|Y|\Psi> = <\Psi|RX(π/2)^\dagger\ Z\ RX(π/2)|\Psi> = <\Psi'|Z|\Psi'>$
となります。
つまり、$|\Psi>$にRXゲートをかけてから、Z行列のときと同じ計算をすればいいことが分かります。
|Ψ>が2量子ビットで、ハミルトニアンがZZのとき
$\hat H = Z_0 Z_1$のとき、
$\hat H|00> = |00>$
$\hat H|01> = -|01>$
$\hat H|10> = -|10>$
$\hat H|11> = |11>$
となり、
- 測定された状態のうち、1の数が偶数だと1を
- 測定された状態のうち、1の数が奇数だと-1を
返す演算子と見ることができます。
実際、
$|\Psi> = a_{00}|00> + a_{01}|01> + a_{10}|10> + a_{11}|11>$
(ただし$\sum_{i,j\in\{0,1\}} |a_{ij}|^2 = 1$)
とおくと、測定結果は
確率 | 得られる状態 |
---|---|
$\mid a_{00}\mid^2$ | |00> |
$\mid a_{01}\mid^2$ | -|01> |
$\mid a_{10}\mid^2$ | -|10> |
$\mid a_{11}\mid^2$ | |11> |
期待値は
$<\Psi|Z_0 Z_1|\Psi> = |a_{00}|^2 - |a_{01}|^2 - |a_{10}|^2 + |a_{11}|^2$
が得られます。
つまり、
- 測定結果のうち、1の数が偶数だったものを$N_0$
- 測定結果のうち、1の数が奇数だったものを$N_1$
- トータルの測定回数を$N = N_0 + N_1$
とおくと、期待値は$(N_0 - N_1)/N$で計算できます。
より量子ビット数が多い場合
実は、2量子ビットのときと同じように、何量子ビットあっても
- 測定結果のうち、1の数が偶数だったものを$N_0$
- 測定結果のうち、1の数が奇数だったものを$N_1$
- トータルの測定回数を$N = N_0 + N_1$
とおいて、期待値を$(N_0 - N_1)/N$で計算できます。
Z行列が$Z_1 Z_3 Z_7 Z_8$のように、歯抜けになっていても計算できます。
Z行列があるところだけ測定して、奇数の数を数えたらOKです。
(Z行列がないところも測定して構いませんが、奇数の数を数える際に、Z行列がないところは無視する必要があります)
ハミルトニアンがXZZYXXのようなものの場合
Xがある部分にアダマールゲートを、Yがある部分にRX(π/2)ゲートをかけたらいいです。
この場合、ゲートをかけて
$H_0 RY(\pi/2)_3 H_4 H_5|\Psi>$
を作ってから、ZZZZZZのときの手順で期待値を求めることができます。
ハミルトニアンがX + Zの場合
また1量子ビットに戻って、
$\hat H = X_0 + Z_0$
の場合を考えます。
一気に$X_0 + Z_0$の期待値は求まらないので、$X_0$の期待値と$Z_0$の期待値をそれぞれ求めて、後で足します。
つまり、
$<\Psi|X_0 + Z_0|\Psi> = <\Psi|X_0|\Psi> + <\Psi|Z_0|\Psi>$
のように求めます。
ハミルトニアンがパウリ行列の直積の線型結合のとき
ここまで理解したら、最も一般的なケースでも、期待値を求めることができます。
例えば
$\hat H = 1.2 X_0 Z_2 + 2.5 Z_3 X_4 Y_2 - 3.4 Z_2 X_3$
の場合、
- $<\Psi|X_0 Z_2|\Psi>$ を求めて、1.2倍した値
- $<\Psi|Z_3 X_4 Y_2|\Psi>$ を求めて、2.5倍した値
- $<\Psi|Z_2 X_3|\Psi>$ を求めて、-3.4倍した値
の和が、$<\Psi|\hat H|\Psi>$の期待値になります。
まとめ
この記事では、期待値測定について学びました。
簡単なハミルトニアンから初めて、徐々に複雑なハミルトニアンを考えることで、理解が進んだのではないでしょうか。
Blueqatの宣伝
それでも難しい、という方は、ぜひとも、私が開発に関わっている量子コンピュータライブラリのBlueqatを使ってみてください。
このへんの複雑な計算はライブラリで面倒を見て、ユーザは書きたい部分だけを書くことができます。
QAOAの計算の場合、チュートリアルにあるとおり、
from blueqat import vqe
from blueqat.pauli import qubo_bit as q
H = q(0)*q(1)
のように、解きたいハミルトニアンを定義して
(量子アニーリングによく使われる、QUBOでハミルトニアンを定義できるようにしています)
step = 2
result = vqe.Vqe(vqe.QaoaAnsatz(H, step)).run()
print(result.most_common(12))
のように、ほとんど何もしなくても自動で問題を解いてくれます。