サンプルベース量子対角化(SQD)
サンプルベース量子対角化(SQD)は、古典的な線形代数と量子コンピューティングの力を組み合わせて、ハミルトニアン(行列)を対角化し、その固有値と固有ベクトルを計算します。行列の対角化は、科学・計算・最適化における多くの問題でその手法が使われる重要な数学的操作です。
以下の動画では、SQDの概要、その有用性を決める要素、そして他の多くのアプローチより高速である理由を説明しています。その後のテキストでは、さらに詳しく解説します。
1. はじめに・動機
例として、シュレーディンガーによって有名になったエネルギー固有値方程式を考えます。
はシステムのハミルトニアン、 は波動関数(固有状態とも呼ばれます)、 は固有値です。行列 の固有値はシステムのエネルギー準位を表します。例えば、システムが分子の場合、最小の固有値は分子の基底状態エネルギーを表します。多くの問題では、基底状態エネルギーの推定に関心があります。
線形代数の完全対角化技術を適用すれば、 行列全体を対角化できます。しかし、行列が大きくなるにつれて、このアプローチは計算コストが高く(場合によっては不可能に)なります。例えば、小さな化学分子であっても、 は非常に大きくなることがあります(たとえば、cc-PVDZ基底を用いた 分子のハミルトニアンの次元は です)。
幸いなことに、ハミルトニアン のすべての固有値と固有ベクトルが常に必要なわけではないため、多くの実際の場面では全行列の対角化は不要です。例えば、基底状態推定の場合、最小の固有値とそれに対応する固有ベクトルにのみ関心があります。これにより、(有用な)部分空間への射影という概念を適用できます。
行列 を考えます。完全なベクトル空間(ヒルベルト空間)の次元は ( は大きい値)です。次に、完全なヒルベルト空間の部分集合である部分空間()を次元 ( は十分に小さい)として選択します。 をこの部分空間に射影すると、射影された行列( とします)はより小さい()ものになります。小さくなった は適切な古典的数値法を用いて対角化でき、その部分空間の固有値と固有ベクトルを生成できます。
部分空間は、目的の(例えば基底)固有状態の サポート に含まれていなければなりません。 言い換えると、射影されたハミルトニアン は最小固有値を含む部分空間内になければなりません。
2. 射影と対角化
次の ハミルトニアン行列 の最小固有値とそれに対応する固有ベクトルを求めたいとします。
全行列とともに、異なる部分空間に対する複数の射影版()を対角化し、スケーラビリティと部分空間選択の重要性を示します。
行列 の基底状態エネルギー(最小固有値)は であり、正確な 基底状態波動関数(固有ベクトル)は次のとおりです:
つまり、行列の基底状態は2つの計算基底状態(ベクトル) と によって張られています。
# Added by doQumentation — required packages for this notebook
!pip install -q numpy scipy
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 @ H @ x1.T, x1 @ H @ x2.T], [x2 @ H @ x1.T, x2 @ H @ x2.T]])
print(Hs)
[[-0.1773 -0.4778]
[-0.4778 0.1014]]
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 @ H @ x1.T, x1 @ H @ x2.T, x1 @ H @ x3.T],
[x2 @ H @ x1.T, x2 @ H @ x2.T, x2 @ H @ x3.T],
[x3 @ H @ x1.T, x3 @ H @ x2.T, x3 @ H @ x3.T],
]
)
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 @ H @ x1.T, x1 @ H @ x2.T, x1 @ H @ x3.T],
[x2 @ H @ x1.T, x2 @ H @ x2.T, x2 @ H @ x3.T],
[x3 @ H @ x1.T, x3 @ H @ x2.T, x3 @ H @ x3.T],
]
)
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では、パラメータ化された局所ユニタリ結合ヤストロウ(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 @ H_new @ x1.T, x1 @ H_new @ x2.T, x1 @ H_new @ x3.T, x1 @ H_new @ x4.T],
[x2 @ H_new @ x1.T, x2 @ H_new @ x2.T, x2 @ H_new @ x3.T, x2 @ H_new @ x4.T],
[x3 @ H_new @ x1.T, x3 @ H_new @ x2.T, x3 @ H_new @ x3.T, x3 @ H_new @ x4.T],
[x4 @ H_new @ x1.T, x4 @ H_new @ x2.T, x4 @ H_new @ x3.T, x4 @ H_new @ x4.T],
]
)
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に似ているため、これらの手法の違いは何か、SQD の VQE に対する利点は何かという疑問が生じます。このセクションでは、最小基底セット(sto-3g)で記述された 分子を例として、両手法を比較し SQD の利点を議論します。
| VQE | SQD | |
|---|---|---|
| 測定のオーバーヘッド | 多くのパウリ項、多くの測定回路: 分子のハミルトニアンには 個のユニークなパウリ項があります。パウリ項には および 項が含まれることがあり、典型的な量子測定は 基底で行われるため、それらの項を評価するには測定基底の変換が必要です。測定用に最適化すると、 項は グループにまとめられ、各グループは単一回路で評価できます。したがって、すべてのパウリ項を評価するには少なくとも 個のユニークな回路が必要です。さらに、より厳しい分散のために1回路あたり多くのショット数が必要。 また、各パウリ項の評価された期待値には分散が伴い、それは に反比例します。したがって、各項を正確に推定するには、1回路あたり多くのショット数を割り当てる必要があります。例えば、化学的精度( kcal/mol)を達成するには、通常1回路あたり 〜 オーダーのショット数が必要です。つまり、VQEは多くの測定回路を必要とし、各回路に一定数のショット数が必要です。実際のケースでは、この測定オーバーヘッドが制限的になる可能性があります。 | SQD では、グループ化されたパウリ項ごとに異なる測定回路は必要ありません。通常、固定のショット数で単一の回路を測定します。問題に応じてショット数を大きな値に設定することもありますが、オーバーヘッドはVQEよりはるかに小さいままです。また、対角化プロセスを用いたエネルギー推定は正確であり、計算された固有値はその部分空間において正確で、VQEのような分散を伴いません(レッスン5のクリロフ基底状態サンプリングの場合は複数回路の測定が必要ですが、回路数はVQEよりはるかに少ないままです)。 |
| 推定エネルギーの上界 | VQEでは、エネルギー推定は有界でなく、ノイズにより真の最小値より低くなる可能性があります。 | SQD のエネルギー推定プロセスは常に基底状態エネルギーの上界を生成し、推定エネルギーが真の基底状態エネルギーより低くなることはありません。 |
| ノイズ耐性 | VQEのエネルギー推定は、誤り訂正前の量子コンピュー タからのノイズの影響を受けやすいです。 | SQD は固有のノイズ耐性を持っています。誤り訂正前の量子コンピュータはノイズのあるサンプルを生成する可能性があります。それらのサンプルを部分空間に含めても、後続の対角化がそれらのサンプルの振幅をゼロに設定することで抑制できます。また、SQD に関連して 配置回復 と呼ばれる手法があり、SQD のノイズ耐性をさらに向上させます。 |
6. まとめ
- SQD では、量子コンピュータがサンプルを生成し、古典コンピュータがそのサンプルによって張られる部分空間にハミルトニアンを射影して対角化し、固有値と固有ベクトルを計算します。
- 生成されるサンプルは、ターゲット(基底)状態サポートから来るものでなければなりません。
- 問題によっては、量子状態の準備とサンプル生成フローが反復的であったり非反復的であったりします。
- SQD はスパースな波動関数に対して最もよく機能します。広い波動関数では正確な解のために大きな部分空間が必要となり、古典的な射影と対角化の操作のコストが高くなります。
- SQD はVQEに比べて、測定オーバーヘッドの低さや推定基底状態エネルギーの上界などの利点があり、よりスケーラブルです。