LoginSignup
31
13

More than 3 years have passed since last update.

VQE/QAOAの期待値測定の部分を学ぶ

Last updated at Posted at 2020-01-26

なんでか知らんけど、ここらへんの詳細って誰も説明しないんですよねぇ。
ノウハウなのか面倒だからなのか知らんけど。

量子コンピュータの基本的なゲートは、一応は知っている読者を想定しています。

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))

のように、ほとんど何もしなくても自動で問題を解いてくれます。

31
13
7

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
31
13