サンプルベース量子対角化(SQD)
サンプルベース量子対角化(SQD)は、古典的な線形代数と量子コンピューティングの力を組み合わせて、ハミルトニアン(行列)を対角化し、その固有値と固有ベクトルを計算します。行列の対角化は、科学・計算・最適化における多くの問題でその手法が使われる重要な数学的操作です。
以下の動画では、SQDの概要、その有用性を決める要素、そして他の多くのアプローチより高速である理由を説明しています。その後のテキストでは、さらに詳しく解説します。
1. はじめに・動機
例として、シュレーディンガーによって有名になったエネルギー固有値方程式を考えます。
はシステムのハミルトニアン、 は波動関数(固有状態とも呼ばれます)、 は固有値です。行列 の固有値はシステムのエネルギー準位を表します。例えば、システムが分子の場合、最小の固有値は分子の基底状態エネルギーを表します。多くの問題では、基底状態エネルギーの推定に関心があります。
線形代数の完全対角化技術を適用すれば、 行列全体を対角化できます。しかし、行列が大きくなるにつれて、このアプローチは計算コストが高く(場合によっては不可能に)なります。例えば、小さな化学分子であっても、 は非常に大きくなることがあります(たとえば、cc-PVDZ基底を用いた 分子のハミルトニアンの次元は です)。
幸いなことに、ハミルトニアン のすべての固有値と固有ベクトルが常に必要なわけではないため、多くの実際の場面では全行列の対角化は不要です。例えば、基底状態推定の場合、最小の固有値とそれに対応する固有ベクトルにのみ関心があります。これにより、(有用な)部分空間への射影という概念を適用できます。
行列 を考えます。完全なベクトル空間(ヒルベルト空間)の次元は ( は大きい値)です。次に、完全なヒルベルト空間の部分集合である部分空間()を次元 ( は十分に小さい)として選択します。 をこの部分空間に射影すると、射影された行列( とします)はより小さい()ものになります。小さくなった は適切な古典的数値法を用いて対角化でき、その部分空間の固有値と固有ベクトルを生成できます。
部分空間は、目的の(例えば基底)固有状態の サポート に含まれていなければなりません。 言い換えると、射影されたハミルトニアン は最小固有値を含む部分空間内になければなりません。
2. 射影と対角化
次の ハミルトニアン行列 の最小固有値とそれに対応する固有ベクトルを求めたいとします。
全行列とともに、異なる部分空間に対する複数の射影版()を対角化し、スケーラビリティと部分空間選択の重要性を示します。
行列 の基底状態エネルギー(最小固有値)は であり、正確な 基底状態波動関数(固有ベクトル)は次のとおりです:
つまり、行列の基底状態は2つの計算基底状態(ベクトル) と によって張られています。
# Added by doQumentation — installs the packages this notebook needs if they are missing
import importlib.util
_needed = {"numpy": "numpy", "scipy": "scipy"}
_missing = [pip for module, pip in _needed.items()
if importlib.util.find_spec(module) is None]
# One at a time, so a package that fails to install does not block the others
for _pip in _missing:
%pip install -q {_pip}
if not _missing:
print("\u2713 All required packages are installed")
import numpy as np
from scipy.linalg import eigh
np.set_printoptions(precision=4, sign="-", suppress=True, linewidth=100)
H = np.array(
[
[0.2235, -0.039, -0.1035, -0.0818, 0.1746, 0.1091, 0.1165, -0.0104],
[-0.0390, 0.6621, 0.0706, -0.1964, -0.0782, 0.2619, 0.1095, 0.0029],
[-0.1035, 0.0706, 0.9961, 0.1724, 0.1067, -0.2299, -0.1817, 0.1571],
[-0.0818, -0.1964, 0.1724, -0.1773, 0.1019, -0.4778, -0.1272, -0.0414],
[0.1746, -0.0782, 0.1067, 0.1019, 0.1418, -0.1359, -0.1793, -0.0766],
[0.1091, 0.2619, -0.2299, -0.4778, -0.1359, 0.1014, 0.1696, 0.0552],
[0.1165, 0.1095, -0.1817, -0.1272, -0.1793, 0.1696, 0.4227, 0.2702],
[-0.0104, 0.0029, 0.1571, -0.0414, -0.0766, 0.0552, 0.2702, 0.4456],
]
)
eigvals, eigvecs = eigh(H)
print("Eigenvalues:")
print(eigvals)
print(f"Minimum eigenvalue: {eigvals.min()}")
print("\nEigenvectors (columns represent vectors):")
print(eigvecs)
print("\nEigenvector for the minimum eigenvalue (ground state)")
print(eigvecs[:, np.argmin(eigvals)])
Eigenvalues:
[-0.5357 -0.1321 0.1049 0.1258 0.3616 0.6405 0.947 1.3039]
Minimum eigenvalue: -0.5356560029438817
Eigenvectors (columns represent vectors):
[[-0. -0.5612 0.098 -0.0024 0.8051 -0.0806 0.0643 0.1288]
[-0. -0.1403 -0.1985 -0.4249 -0.0092 0.585 -0.5952 0.2526]
[ 0. 0.0416 0.3041 0.2122 0.1509 -0.0139 -0.5794 -0.7086]
[ 0.8 -0.1936 -0.0127 -0.4376 -0.1081 -0.0838 0.1557 -0.2966]
[ 0. 0.6716 -0.3535 -0.2552 0.5395 0.0954 0.1449 -0.1941]
[ 0.6 0.258 0.017 0.5834 0.1441 0.1118 -0.2076 0.3954]
[ 0. 0.3088 0.5504 -0.4197 0.0626 -0.468 -0.2625 0.3657]
[-0. -0.1146 -0.6559 0.0356 -0.0394 -0.6352 -0.3856 0.0418]]
Eigenvector for the minimum eigenvalue (ground state)
[-0. -0. 0. 0.8 0. 0.6 0. -0. ]
次に、行列 を異なる部分空間へ射影し、正確な基底状態が得られるかどうかを確認します。具体的には、以下の部分空間にそれぞれ射影します:
-
正確な基底状態ベクトル( と )によって張られる部分空間
-
正確な基底状態ベクトルの一部またはすべてを含まないベクトル(例:、、)による部分空間
-
正確な基底状態ベクトルと非基底状態ベクトルの両方を含むベクトル(ただし、ヒルベルト空間のすべてのベクトルではない)による部分空間
2.1 ケース1:部分空間が基底状態を含む場合
を、 と の2つのベクトルによって張られる部分空間()へ射影するとします。射影されたハミルトニアンは次のように定義されます:
x1 = np.zeros(8)
x1[3] = 1 # binary 011 is 3 in decimal. |011> = |3> = [0,0,0,1,0,0,0,0]
x2 = np.zeros(8)
x2[5] = 1 # binary 101 is 5 in decimal
Hs = np.array([[x1.T @ H @ x1, x1.T @ H @ x2], [x2.T @ H @ x1, x2.T @ H @ x2]])
print(Hs)
[[-0.1773 -0.4778]
[-0.4778 0.1014]]
射影ハミルトニアン要素を x1.T @ H @ x2 と書く際には、状態ベクトル x1 と x2 が のような式と整合するケット(列ベクトル)に対応するという一般的な慣習を暗黙のうちに採用していることに注意してください。しかし、NumPyの1次元配列は本質的に行ベクトルと列ベクトルを区別せず、ここで使用するベクトルに対して転置操作は数値的な効果を持ちません。そのため、x1 @ H @ x2.T と書いても同じ数値結果が得られますが、x1.T @ H @ x2 の方が通常のディラック記法における対応 により近い形になります。
eigvals, eigvecs = eigh(Hs)
print(f"Minimum eigenvalue: {eigvals.min()}")
print(f"Eigenvector for minimum eigenvalue: {eigvecs[:,np.argmin(eigvals)]}")
Minimum eigenvalue: -0.535656000064295
Eigenvector for minimum eigenvalue: [-0.8 -0.6]
ここでいくつかの重要な観察ができます。
- 2つのベクトルで部分空間を張ったため、射影された行列()の次元は となり、元の行列 ()より小さくなっています。
- 射影された行列の最小固有値は、正確な基底状態の固有値と一致しています。
eigvecs変数の値は部分空間を張るベクトルの振幅を示しており、それらを使って固有状態(基底状態)を再構成できます。この場合、正確な基底状態が(全体的位相を除いて)得られます:
2.2 ケース2:部分空間が基底状態ベクトルの一部またはすべてを含まない場合
次に、、、 の3つのベクトルによって張られる部分空間へ を射影します。基底状態ベクトル()が除外されるように意図的にベクトルを選択しています。射影されたハミルトニアンは次のように定義されます:
x1 = np.zeros(8)
x1[0] = 1
x2 = np.zeros(8)
x2[3] = 1
x3 = np.zeros(8)
x3[6] = 1
Hs = np.array(
[
[x1.T @ H @ x1, x1.T @ H @ x2, x1.T @ H @ x3],
[x2.T @ H @ x1, x2.T @ H @ x2, x2.T @ H @ x3],
[x3.T @ H @ x1, x3.T @ H @ x2, x3.T @ H @ x3],
]
)
print(Hs)
[[ 0.2235 -0.0818 0.1165]
[-0.0818 -0.1773 -0.1272]
[ 0.1165 -0.1272 0.4227]]
eigvals, eigvecs = eigh(Hs)
print(f"Minimum eigenvalue: {eigvals.min()}")
Minimum eigenvalue: -0.21108858736702252
この場合の固有値 は、全ハミルトニアンの最小固有値 と一致していません。ここでの重要な観察は、目的の(基底)状態に含まれる計算基底状態(基底ベクトル)を部分的または完全に除外した部分空間へ射影すると、推定された基底状態が正確なものと異なってしまうという点です。
2.3 ケース3:部分空間が基底状態ベクトルと非基底状態ベクトルの両方を含む場合
次に、部分空間が正確な基底状態ベクトルと不要なベクトルの両方を含む場合を示します。部分空間が 、(正確な基底状態に含まれる)、および (正確な基底状態に含まれない)によって張られるとします。
x1 = np.zeros(8)
x1[3] = 1
x2 = np.zeros(8)
x2[5] = 1
x3 = np.zeros(8)
x3[7] = 1
Hs = np.array(
[
[x1.T @ H @ x1, x1.T @ H @ x2, x1.T @ H @ x3],
[x2.T @ H @ x1, x2.T @ H @ x2, x2.T @ H @ x3],
[x3.T @ H @ x1, x3.T @ H @ x2, x3.T @ H @ x3],
]
)
print(Hs)
[[-0.1773 -0.4778 -0.0414]
[-0.4778 0.1014 0.0552]
[-0.0414 0.0552 0.4456]]
eigvals, eigvecs = eigh(Hs)
print(f"Minimum eigenvalue: {eigvals.min()}")
print(f"Eigenvector for minimum eigenvalue: {eigvecs[:,np.argmin(eigvals)]}")
Minimum eigenvalue: -0.53565600006461
Eigenvector for minimum eigenvalue: [ 0.8 0.6 -0. ]
この場合も最小固有値として が得られ、これは全行列(すなわち正確な基底状態)と一致しています。もう一つの興味深い結果は、射影と対角化のプロセスが返す の振幅です。振幅は であり、計算された振幅とベクトルで波動関数(固有状態)を再構成すると、次のようになります:
つまり、部分空間に非ターゲットベクトルが含まれていても(ターゲットベクトルの完全なセットとともに)、射影と対角化のプロセスが非ターゲットベクトルの振幅を にすることでフィルタリングし、正しい固有値を計算して正確な固有状態を再構成できます。SQDのこの性質は、固有のノイズ耐性を提供します。
3. SQDにおける量子の役割
上記の分析により、部分空間を張るベクトルの重要性が確立されました。これらのベクトルは目的状態の サポート に含まれていなければなりません。これにより、重要な疑問が生じます: 部分空間を構築するために、ターゲット状態のサポートを持つベクトルをどのように選べばよいのでしょうか?
ここで 量子コンピュータ が登場します。SQDパラダイムにおける量子-古典の相乗効果は次のように機能します:
-
適切な量子回路を使用して、ターゲット波動関数(例:基底状態)が大きなサポートを持つ基底状態を量子コンピュータ上で生成しようとします。サンプリングされた基底状態(ビット列)が、ハミルトニアン射影のための部分空間を張ります。
-
古典コンピューターは(量子コンピューターからのサンプル/ベクトルによって張られる)部分空間にハミルトニアンを射影し、適切な数値的手法を用いてそれを対角化することで固有値と固有ベクトルを計算します。
このような量子状態を準備する方法は複数あり、問題に応じて変分的な方法にも非変分的な方法にもなり得ます。
次の2つのレッスンでは、状態を準備してサンプリングする2つの具体例を示します。
- レッスン4では、パラメーター化された局所ユニタリー結合Jastrow(LUCJ)アンザッツを使用して、化学問題( 分子の基底状態エネルギー推定)のサンプルを生成します。LUCJアンザッツは、古典的な結合クラスター一電子・二電子励起(CCSD)計算からのパラメーターで初期化します。
- レッスン5では、凝縮系物理の問題に対して部分空間を張るために、クリロフ基底状態からサンプリングします。このアプローチは本質的に非変分的です。
上記の問題固有のアプローチに加え、状態準備の一般的なアプローチには変分アンザッツを用いる方法があります。これは古典的な最適化アルゴリズムを使ってアンザッツのパラメーターを反復的に更新するものです。
フォールトトレラント以前の量子コンピューターからのサンプルにはノイズが含まれる可能性があります。SQDは、ノイズの多いサンプルを修正するために自己無撞着な配置回復プロセスを採用しています [1]。レッスン4では、この配置回復プロセスについてより詳しく説明し、化学問題の基底状態エネルギー推定を精緻化するために、ノイズの多いサンプルを反復的に修正するためにこれを適用します。
3.1 基底状態サポートに関する注意
基底状態サポート の概念についてさらに説明します。基底状態サポートとは、基底状態が(カットオフ閾値以上の)ゼロでない振幅を持つ計算基底状態(基底ベクトル)の集合として定義できます。
量子ビット問題の正確な基底状態が次のようであるとします:
上記の状態をサンプリングすると、計算基底状態の集合 , が得られるはずです(他の計算基底状態は基底状態において振幅がゼロであるため、理想的にはサンプリング時に現れません)。
理想的には、この状態の基底ベクトルの集合は から構成されます(言い換えると、この状態の部分空間はこれら2つの基底ベクトルによって張られます)。
実際には、正確な基底状態を準備する必要はありません。多くの他の状態をサンプリングすることで同じベクトルの集合が得られます。例えば:
上記のいずれかの状態を準備してサンプリングすると、基底状態においてゼロでない振幅を持つベクトルが生成され、そのすべてが 基底状態サポート を持つと言えます。なお、 のサンプリングには、正確な基底状態において振幅が である という余分なベクトルが含まれています。しかし、先ほど示したように、そのようなベクトルを部分空間に含めることは問題ではありません。射影と対角化の操作が不要なベクトルの振幅を にし、期待される固有値を得て正しい固有状態を再構成できます。

したがって、正確な基底状態を準備してサンプリングすることは必要ではありません。実際、正確な基底状態は 事前には わからないため準備が難しく、特に波動関数(状態)が偏っていて一部の基底状態が非常に高い確率を持つ場合は、正確な基底状態を準備してサンプリングしない方が有益であることがよくあります。次の波動関数を考えます:
これは、基底状態 と が や に比べてはるかに大きな振幅を持つ偏った波動関数です。サンプリングすると、 と がより頻繁に得られます(: と それぞれ 、 は 、 は )。有限のサンプリング予算(ショット数)では、サンプリングされたセットに と しか含まれない可能性が非常に高くなります。先ほど示したように、ベクトルが欠けたそのようなセットで部分空間を張ると、真の最小固有値を見つけることができません。したがって、基底状態サポートを持つ状態からサンプリングすることが有益(かつ必要)です。
3.2 一様サンプリングに対する反論
部分空間を張るために一様分布からサンプルを取ることは魅力的に見えるかもしれません。小さな問題では機能することもありますが、より大きく実用的な問題では機能しなくなります。多数の量子ビットを持つ大きな問題では、ヒルベルト空間が非常に大きくなる可能性があります。例えば、32量子ビットのヒルベルト空間には40億以上の可能な基底ベクトルがあります()。有限のサンプリング予算(対角化プロセスを実行可能に保つために、たとえばベクトル)でその空間から一様サンプリングすると、プロセスがランダムであるため、基底状態サポートを持つベクトルが部分空間から除外されることが多くなります。したがって、量子回路を活用して基底状態サポートから体系的にサンプリングする方法が必要です。
4. SQDと波動関数のスパース性
完全なヒルベルト空間と実行可能な部分空間の次元の差は、SQD のもう一つの重要な側面である波動関数のスパース性をもたらします。SQD のアプローチは、わずかな割合の基底状態が無視できない振幅を持つ、スパースまたは集中した波動関数に対してうまく機能します。その理由は2つあります:
-
波動関数が広い場合(つまり、多くの基底状態が無視できない振幅を持つ場合)、ターゲット状態サポートを持つベクトルを部分空間に含め損ねると、誤った固有値と固有ベクトルになる可能性があります。
-
上記の問題を避けるためには、部分空間に多くのベクトルを含める必要があります。しかし、射影されたハミルトニアンの次元は部分空間の次元と直接関係しています。部分空間が大きくなるほどハミルトニアンも大きくなり、対角化が実行不可能になる可能性があります。
次の行列()でこの問題を示します。 の最小固有値は であり、対応する波動関数(固有状態)は広いものです:
H_new = np.array(
[
[-0.958, 0.1853, -0.2663, -0.3875, -0.0524, -0.3779, -0.0145, -0.3369],
[0.1853, -0.4081, -0.8549, -0.2312, 0.0615, -0.2493, -0.3804, -0.3312],
[-0.2663, -0.8549, -0.6929, -0.0063, -0.0478, -0.0236, -0.2494, -0.0669],
[-0.3875, -0.2312, -0.0063, -0.4468, -0.6301, -0.4627, -0.1188, 0.0753],
[-0.0524, 0.0615, -0.0478, -0.6301, -0.6664, -0.1514, -0.3571, -0.3644],
[-0.3779, -0.2493, -0.0236, -0.4627, -0.1514, -0.9605, 0.0137, 0.0035],
[-0.0145, -0.3804, -0.2494, -0.1188, -0.3571, 0.0137, -1.1449, 0.0433],
[-0.3369, -0.3312, -0.0669, 0.0753, -0.3644, 0.0035, 0.0433, -1.2307],
]
)
eigvals, eigvecs = eigh(H_new)
print(f"Minimum eigenvalue: {eigvals.min()}")
print(f"Eigenvector for minimum eigenvalue: {eigvecs[:,np.argmin(eigvals)]}")
Minimum eigenvalue: -2.208137504726661
Eigenvector for minimum eigenvalue: [0.3536 0.3536 0.3536 0.3536 0.3535 0.3536 0.3535 0.3535]
を、、、、 の4つのベクトルによって張られる部分空間へ射影し、固有値を計算してみます。
x1 = np.zeros(8)
x1[0] = 1
x2 = np.zeros(8)
x2[2] = 1
x3 = np.zeros(8)
x3[5] = 1
x4 = np.zeros(8)
x4[6] = 1
H_new_s = np.array(
[
[x1.T @ H_new @ x1, x1.T @ H_new @ x2, x1.T @ H_new @ x3, x1.T @ H_new @ x4],
[x2.T @ H_new @ x1, x2.T @ H_new @ x2, x2.T @ H_new @ x3, x2.T @ H_new @ x4],
[x3.T @ H_new @ x1, x3.T @ H_new @ x2, x3.T @ H_new @ x3, x3.T @ H_new @ x4],
[x4.T @ H_new @ x1, x4.T @ H_new @ x2, x4.T @ H_new @ x3, x4.T @ H_new @ x4],
]
)
print(H_new_s)
[[-0.958 -0.2663 -0.3779 -0.0145]
[-0.2663 -0.6929 -0.0236 -0.2494]
[-0.3779 -0.0236 -0.9605 0.0137]
[-0.0145 -0.2494 0.0137 -1.1449]]
eigvals, eigvecs = eigh(H_new_s)
print(f"Minimum eigenvalue: {eigvals.min()}")
Minimum eigenvalue: -1.4266552340586673
上記の例は、波動関数が広い場合に、基底状態を部分空間に含めないと固有値の計算が不正確になることを示しています。
5. SQD と VQE の比較
前述の通り、SQDは基底状態のサポートから準備・サンプリングするために変分量子回路と反復的なパラメーター更新が必要な場合があります。この反復的なパラメーター更新ルーチンはVQEに類似しているため、これらの手法がどう異なるのか、VQEに対するSQDの利点は何かという疑問が生じるかもしれません。このセクションでは、最小基底関数系(sto-3g)で記述された 分子を例として、両手法を比較しSQDの利点について議論します。
| VQE | SQD | |
|---|---|---|
| 測定オーバーヘッド | 多数のパウリ項、多数の測定回路: この分子のハミルトニアンには 個のユニークなパウリ項があります。パウリ項には 項と 項が含まれる場合があり、典型的な量子測定は 基底で行われるため、これらの項を評価するには測定基底の変換が必要です。測定用に最適化すると、 個の項は 個のグループにまとめることができ、各グループは1つの回路で評価できます。したがって、すべてのパウリ項を評価するには少なくとも 個のユニークな回路が必要です。**より厳密な分散のための、回路あたり多数のショット。**繰り返しになりますが、各パウリ項の評価された期待値には分散があり、これは に反比例します。したがって、各項を正確に推定するには、回路あたり多くのショットを割り当てる必要があります。例えば、化学的精度( kcal/mol)を達成するには、通常、回路あたり - 程度のショットが必要です。したがって、VQEには多数の測定回路が必要であり、各回路には一定数のショットが必要です。実用的なケースでは、この測定オーバーヘッドが制約となる場合があります。 | SQDでは、グループ化された各パウリ項に対して異なる測定回路を必要としません。通常、固定数のショットで単一の回路を測定します。問題に応じてショット数を大きな値に設定する場合もありますが、オーバーヘッドはVQEよりもはるかに小さくなります。また、対角化プロセスを用いたエネルギー推定は正確であり、計算された固有値はその部分空間において正確であり、VQEのような分散を持ちません。(クリロフ基底状態サンプリング(レッスン5)の場合、複数の回路を測定する必要がありますが、回路数はVQEよりもはるかに少なくなります。) |
| 推定エネルギーの境界 | VQEでは、エネルギー推定は境界を持たず、ノイズにより真の最小値より低くなることがあります。 | SQDにおけるエネルギー推定プロセスは常に基底状態エネルギーの上限を生成し、推定されたエネルギーが真の基底状態エネルギーより低くなることはありません。 |
| ノイズ耐性 | VQEのエネルギー推定は、フォールトトレラント以前の量子コンピューターからのノイズの影響を受けやすいです。 | SQDには本質的なノイズ耐性があります。フォールトトレラント以前の量子コンピューターはノイズの多いサンプルを生成することがあります。それらのサンプルを部分空間に含めたとしても、その後の対角化プロセスにより、それらのサンプルの振幅をゼロに設定することで抑制できます。また、SQDに関連して_配置回復_と呼ばれる手法についても説明し、これによりSQDのノイズ耐性がさらに向上します。 |
6. まとめ
-
SQD では、量子コンピュータがサンプルを生成し、古典コンピュータがそのサンプルによって張られる部分空間にハミルトニアンを射影して対角化し、固有値と固有ベクトルを計算します。
-
生成されるサンプルは、ターゲット(基底)状態サポートから来るものでなければなりません。
-
問題によっては、量子状態の準備とサンプル生成フローが反復的であったり非反復的であったりします。
-
SQD はスパースな波動関数に対して最もよく機能します。広い波動関数では正確な解のために大きな部分空間が必要となり、古典的な射影と対角化の操作のコストが高くなります。
-
SQD はVQEに比べて、測定オーバーヘッドの低さや推定基底状態エネルギーの上界などの利点があり、よりスケーラブルです。
参考文献
[1] J. Robledo-Moreno et al., "Chemistry Beyond Exact Solutions on a Quantum-Centric Supercomputer" (2024). arXiv:quant-ph/2405.05068.