주 콘텐츠로 건너뛰기

샘플 기반 양자 대각화 (SQD)

샘플 기반 양자 대각화(SQD)는 고전 선형 대수학과 양자 컴퓨팅의 강점을 결합하여 해밀토니안(행렬)을 대각화하고 그 고유값과 고유벡터를 계산합니다. 행렬 대각화는 과학, 계산, 최적화 분야의 많은 문제에서 활용되는 중요한 수학적 연산입니다.

아래 동영상에서는 SQD의 개요, SQD의 유용성을 결정하는 요소, 그리고 다른 접근법보다 빠른 이유를 설명합니다. 이후 본문에서 더 자세한 내용을 다룹니다.

1. 소개 및 동기

슈뢰딩거가 유명하게 만든 에너지 고유값 방정식을 예시로 살펴보겠습니다.

Hψ=EψH \vert \psi \rangle = E \vert \psi \rangle

HH는 시스템의 해밀토니안, ψ|\psi\rangle은 파동 함수(고유 상태라고도 함), EE는 고유값입니다. 행렬 HH의 고유값은 시스템의 에너지 준위를 나타냅니다. 예를 들어, 시스템이 분자인 경우 가장 낮은 고유값은 분자의 바닥 상태 에너지를 나타냅니다. 많은 문제에서 우리는 바닥 상태 에너지 추정에 관심을 갖습니다.

선형 대수학의 완전 대각화 기법을 적용하면 전체 HH 행렬을 대각화할 수 있습니다. 그러나 행렬이 커질수록 이 접근법은 계산 비용이 매우 높아집니다(심지어 불가능해질 수도 있습니다). 예를 들어, 작은 화학 분자에서도 HH는 매우 커질 수 있습니다(예: cc-PVDZ 기저를 사용한 N2N_2 분자의 해밀토니안은 차원이 65780×6578065780 \times 65780에 달합니다).

다행히, 해밀토니안 HH의 모든 고유값과 고유벡터가 항상 필요한 것은 아니므로, 실제 적용 사례에서 전체 행렬의 대각화는 필수적이지 않습니다. 예를 들어, 바닥 상태 추정의 경우 가장 낮은 고유값과 이에 대응하는 고유벡터에만 관심이 있습니다. 이를 통해 (유용한) 부분 공간으로의 투영 개념을 적용할 수 있습니다.

크기가 N×NN \times N인 행렬 HH를 생각해 봅시다. 완전한 벡터 공간(힐베르트 공간)의 차원은 NN입니다(NN은 큰 수). 다음으로, 전체 힐베르트 공간의 부분 집합인 차원 MM의 부분 공간(S\mathcal{S})을 선택합니다(MM은 충분히 작은 수). HH를 이 부분 공간에 투영하면, 투영된 행렬(예: HSH_\mathcal{S})은 더 작은 크기(M×MM \times M)가 됩니다. 이 작은 HSH_\mathcal{S}는 적합한 고전 수치 방법을 사용하여 대각화할 수 있으며, 해당 부분 공간의 고유값과 고유벡터를 구할 수 있습니다.

부분 공간은 목표(예: 바닥) 고유 상태의 지지 안에 있어야 합니다. 다시 말해, 투영된 해밀토니안 HSH_\mathcal{S}는 가장 낮은 고유값을 포함하는 부분 공간 안에 있어야 합니다.

2. 투영과 대각화

다음 8×88 \times 8 해밀토니안 행렬 HH의 최솟값 고유값과 이에 대응하는 고유벡터를 구하려 한다고 가정해 봅시다.

H=[0.22350.03900.10350.08180.17460.10910.11650.01040.03900.66210.07060.19640.07820.26190.10950.00290.10350.07060.99610.17240.10670.22990.18170.15710.08180.19640.17240.17730.10190.47780.12720.04140.17460.07820.10670.10190.14180.13590.17930.07660.10910.26190.22990.47780.13590.10140.16960.05520.11650.10950.18170.12720.17930.16960.42270.27020.01040.00290.15710.04140.07660.05520.27020.4456]H = \begin{bmatrix} 0.2235 & -0.0390 & -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 \\ \end{bmatrix}

전체 행렬과 다양한 부분 공간에 대한 투영 버전(HSH_\mathcal{S})을 함께 대각화하여 부분 공간 선택의 확장성과 중요성을 살펴봐요.

행렬 HH의 바닥 상태 에너지(최솟값 고유값)는 0.5357-0.5357이며, 정확한 바닥 상태 파동 함수(고유벡터)는 다음과 같습니다:

GSexact=0.8011+0.6101.\text{GS}_{\text{exact}} = 0.8 * |011\rangle + 0.6 * |101\rangle.

즉, 행렬의 바닥 상태는 두 계산 기저 상태(벡터) 011\vert 011 \rangle101\vert 101 \rangle에 걸쳐 있습니다.

# 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. ]

다음으로, 행렬 HH를 다양한 부분 공간에 투영하여 정확한 바닥 상태를 구할 수 있는지 확인해 보겠습니다. 구체적으로는 다음 벡터들로 이루어진 부분 공간에 행렬을 투영해 봅니다:

  1. 정확한 바닥 상태 벡터들(011\vert 011 \rangle101\vert 101 \rangle)로 구성된 부분 공간.
  2. 일부 또는 모든 정확한 바닥 상태 벡터를 제외한 벡터들(예: 000\vert 000 \rangle, 011\vert 011 \rangle, 110\vert 110 \rangle)로 구성된 부분 공간.
  3. 정확한 바닥 상태 벡터와 바닥 상태 외의 벡터를 모두 포함하되, 힐베르트 공간의 모든 가능한 벡터를 포함하지 않는 부분 공간.

2.1 경우 1: 부분 공간이 바닥 상태를 포함하는 경우

x1=011x_1 = |011\ranglex2=101x_2 = |101\rangle의 두 벡터로 이루어진 부분 공간(S\mathcal{S})에 HH를 투영한다고 가정합시다. 투영된 해밀토니안은 다음과 같이 정의됩니다:

HS=[x1Hx1x1Hx2x2Hx1x2Hx2]H_\mathcal{S} = \begin{bmatrix} \langle x1 | H | x1 \rangle & \langle x1 | H | x2 \rangle \\ \langle x2 | H | x1 \rangle & \langle x2 | H | x2 \rangle \end{bmatrix}
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]

여기서 몇 가지 핵심 관찰을 할 수 있습니다.

  • 두 벡터로 부분 공간을 구성했으므로, 투영된 행렬(HSH_\mathcal{S})의 차원은 2×22 \times 2로, 전체 행렬 HH(8×88 \times 8)보다 작습니다.
  • 투영된 행렬의 최솟값 고유값은 정확한 바닥 상태의 고유값과 일치합니다.
  • eigvecs 변수의 값은 부분 공간 생성 벡터의 진폭을 나타내며, 이를 사용하여 고유 상태(바닥 상태)를 재구성할 수 있습니다. 이 경우 정확한 바닥 상태를 (전역 위상까지) 얻을 수 있습니다:
ψ=(0.8011+0.6101)|\psi \rangle = - (0.8 |011\rangle + 0.6 |101\rangle)

2.2 경우 2: 부분 공간이 일부 또는 모든 바닥 상태 벡터를 제외하는 경우

다음으로, x1=000x_1 = |000\rangle, x2=011x_2 = |011\rangle, x3=110x_3 = |110\rangle의 세 벡터로 이루어진 부분 공간에 HH를 투영합니다. 여기서는 바닥 상태 벡터(101\vert 101 \rangle)가 제외되도록 의도적으로 벡터를 선택하였습니다. 투영된 해밀토니안은 다음과 같이 정의됩니다:

HS=[x1Hx1x1Hx2x1Hx3x2Hx1x2Hx2x2Hx3x3Hx1x3Hx2x3Hx3]H_\mathcal{S} = \begin{bmatrix} \langle x1 | H | x1 \rangle & \langle x1 | H | x2 \rangle & \langle x1 | H | x3 \rangle\\ \langle x2 | H | x1 \rangle & \langle x2 | H | x2 \rangle & \langle x2 | H | x3 \rangle \\ \langle x3 | H | x1 \rangle & \langle x3 | H | x2 \rangle & \langle x3 | H | x3 \rangle \\ \end{bmatrix}
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

이 경우 고유값 0.2111-0.2111은 전체 해밀토니안의 최솟값 고유값 0.5357-0.5357과 일치하지 않습니다. 핵심 관찰 사항은, 목표(바닥) 상태의 기저 상태를 일부 또는 전부 제외한 부분 공간에 투영하면 추정된 바닥 상태가 정확한 값과 달라진다는 것입니다.

2.3 경우 3: 부분 공간이 바닥 상태 벡터와 비(非)바닥 상태 벡터를 모두 포함하는 경우

다음으로, 정확한 바닥 상태 벡터와 원치 않는 벡터를 모두 포함하는 벡터로 부분 공간을 구성하는 경우를 살펴봅니다. 부분 공간이 x1=011x_1 = |011\rangle, x2=101x_2 = |101\rangle(정확한 바닥 상태에 존재), x3=111x_3 = |111\rangle(정확한 바닥 상태에 부재)로 구성된다고 가정합시다.

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. ]

이 경우에도 최솟값 고유값으로 0.5357-0.5357을 얻으며, 이는 전체 행렬(즉, 정확한 바닥 상태)과 일치합니다. 또 다른 흥미로운 결과는 투영 및 대각화 과정에서 반환된 x3x_3의 진폭입니다. 진폭이 00이며, 계산된 진폭과 벡터로 파동 함수(고유 상태)를 재구성하면 다음과 같은 결과를 얻습니다:

ψ=0.8011+0.6101+0.0111=0.8011+0.6101(exact ground state)\vert \psi \rangle = 0.8 |011\rangle + 0.6 |101\rangle + 0.0 |111\rangle = 0.8 |011\rangle + 0.6 |101\rangle \left( \text{exact ground state} \right)

따라서, 부분 공간에 일부 목표가 아닌 벡터가 포함되더라도(목표 벡터 전체가 포함된 경우), 투영 및 대각화 과정이 원치 않는 벡터의 진폭을 00으로 설정하여 걸러내기 때문에 올바른 고유값과 고유 상태를 계산할 수 있습니다. SQD의 이 특성이 본질적인 잡음 허용성을 제공합니다.

3. SQD에서 양자의 역할

위의 분석은 부분 공간을 구성하는 벡터들이 얼마나 중요한지를 보여줍니다. 이 벡터들은 반드시 목표 상태의 support 안에 있어야 합니다. 이로 인해 다음과 같은 중요한 질문이 생깁니다: 목표 상태의 support를 갖는 벡터들을 어떻게 선택할 수 있을까요?

바로 여기서 양자 컴퓨터가 등장합니다. SQD 패러다임에서 양자-고전 시너지는 다음과 같이 작동합니다:

  1. 적절한 양자 Circuit을 사용해 양자 컴퓨터에서 상태를 준비합니다. 이 상태는 목표 파동 함수(예: 바닥 상태)가 유의미한 support를 갖는 기저 상태들을 생성합니다. 샘플링된 기저 상태(비트 문자열)들이 해밀토니안 투영을 위한 부분 공간을 구성합니다.
  2. 고전 컴퓨터는 (양자 컴퓨터에서 얻은 샘플/벡터들로 구성된) 부분 공간에 해밀토니안을 투영하고, 적절한 수치 방법을 사용해 이를 대각화하여 고유값과 고유벡터를 계산합니다.

SQD의 양자 및 고전 구성 요소 다이어그램. 양자 측에서는 목표 support에서 상태를 준비하고 샘플링하며, 고전 측에서는 샘플링된 부분 공간에 행렬을 투영하고 투영된 행렬을 대각화합니다.

이러한 양자 상태를 준비하는 방법은 여러 가지가 있으며, 문제에 따라 변분적(variational) 또는 비변분적(non-variational) 방식을 택할 수 있습니다.

다음 두 레슨에서는 상태를 준비하고 샘플링하는 두 가지 구체적인 예시를 살펴봐요.

  1. 레슨 4에서는 매개변수화된 지역 유니터리 결합 Jastrow (LUCJ) 안사츠(ansatz)를 사용하여 화학 문제(N2N_2 분자의 바닥 상태 에너지 추정)를 위한 샘플을 생성합니다. 고전적인 결합 클러스터 단일-이중 (CCSD) 계산에서 얻은 매개변수로 LUCJ 안사츠를 초기화합니다.
  2. 레슨 5에서는 응집 물질 물리 문제의 부분 공간을 구성하기 위해 Krylov 기저 상태에서 샘플링합니다. 이 접근 방식은 비변분적 방식입니다.

위의 문제별 접근 방식 외에도, 상태 준비를 위한 일반적인 방법으로는 변분 안사츠(variational ansatz)가 있습니다. 이 방식에서는 고전 최적화기를 사용해 안사츠 매개변수를 반복적으로 업데이트합니다.

변분 양자 Circuit에서 양자 샘플링을 거쳐 고전 컴퓨팅으로 흐르는 순서도. 고전 컴퓨팅에서는 행렬이 투영되고 대각화됩니다. 그 결과는 고전 최적화기로 전달되어 새로운 변분 매개변수를 선택하고, 다시 변분 양자 Circuit으로 돌아갑니다.

결함 허용(fault-tolerant) 이전 단계의 양자 컴퓨터에서 얻은 샘플에는 잡음이 포함될 수 있습니다. SQD는 자기 일관적 구성 복원(self-consistent configuration recovery) 과정을 통해 잡음이 있는 샘플을 보정합니다 [1]. 구성 복원 과정에 대해서는 레슨 4에서 더 자세히 다루며, 이를 반복적으로 적용하여 잡음 있는 샘플을 보정하고 화학 문제의 바닥 상태 에너지 추정을 정교화합니다.

3.1 바닥 상태 support에 관한 참고 사항

바닥 상태 support 개념을 더 자세히 설명하겠습니다. 바닥 상태 support는 바닥 상태가 0이 아닌 진폭(특정 임계값 이상)을 갖는 기저 상태들의 집합으로 정의할 수 있습니다.

33-Qubit 문제의 정확한 바닥 상태가 다음과 같다고 가정해 봅시다:

ψ=12000+12111\vert \psi \rangle = \frac{1}{\sqrt{2}} \vert 000 \rangle + \frac{1}{\sqrt{2}} \vert 111 \rangle

위 상태를 샘플링하면 계산 기저 상태들의 집합 {000\{\vert 000 \rangle, 111}\vert 111 \rangle \}을 얻을 수 있습니다 (다른 계산 기저 상태들은 바닥 상태에서 진폭이 0이므로, 이상적으로는 샘플링 시 나타나지 않습니다).

이상적으로, 이 상태의 기저 벡터 집합은 {000,111}\{ \vert 000 \rangle, \vert 111 \rangle \}으로 구성됩니다 (즉, 이 상태의 부분 공간은 이 두 기저 벡터로 생성됩니다).

실제로는 정확한 바닥 상태를 준비할 필요가 없습니다. 다른 여러 상태를 샘플링해도 동일한 벡터 집합을 얻을 수 있기 때문입니다. 예를 들어:

ψa=0.8000+0.6111Sampling{000,111}ψb=12000+32111Sampling{000,111}ψc=12000+12111+12101Sampling{000,101,111}\begin{align} \vert \psi_a \rangle = 0.8 \vert 000 \rangle + 0.6 \vert 111 \rangle &\xrightarrow{\text{Sampling}} \{ \vert 000 \rangle, \vert 111 \rangle \} \\ \vert \psi_b \rangle = \frac{1}{2} \vert 000 \rangle + \frac{\sqrt{3}}{2} \vert 111 \rangle &\xrightarrow{\text{Sampling}} \{ \vert 000 \rangle, \vert 111 \rangle \} \\ \vert \psi_c \rangle = \frac{1}{2} \vert 000 \rangle + \frac{1}{2} \vert 111 \rangle + \frac{1}{\sqrt{2}} \vert 101 \rangle &\xrightarrow{\text{Sampling}} \{ \vert 000 \rangle, \vert 101 \rangle, \vert 111 \rangle \} \end{align}

위의 어떤 상태를 준비하여 샘플링해도 바닥 상태에서 0이 아닌 진폭을 갖는 벡터들을 생성할 수 있으며, 이들 모두 _바닥 상태 support_를 갖는다고 볼 수 있습니다. 참고로, ψc\vert \psi_c \rangle를 샘플링하면 정확한 바닥 상태에서 진폭이 00101\vert 101 \rangle이라는 여분의 벡터가 포함됩니다. 그러나 앞서 보였듯이, 이러한 벡터들을 부분 공간에 포함시켜도 문제가 되지 않습니다. 투영 및 대각화 연산이 원하지 않는 벡터들의 진폭을 00으로 설정하므로, 기대하는 고유값을 얻고 올바른 고유 상태를 재구성할 수 있습니다.

좋은 안사츠 support와 나쁜 안사츠 support의 다이어그램. 좋은 안사츠는 바닥 상태 support를 완전히 포함하는 support를 갖습니다. 부실한 안사츠는 바닥 상태 support의 일부만 포함하거나 전혀 포함하지 않습니다.

따라서, 정확한 바닥 상태를 준비하고 샘플링하는 것은 필수가 아닙니다. 사실, 정확한 바닥 상태는 사전에 알 수 없기 때문에 이를 준비하고 샘플링하는 것 자체가 어려울 수 있습니다. 특히 일부 기저 상태가 매우 높은 확률을 갖는 편향된 파동 함수의 경우, 정확한 바닥 상태에서 준비하고 샘플링하지 않는 것이 오히려 유리한 경우가 많습니다. 다음 파동 함수를 생각해 보세요:

ψ=0.70000.7010+0.11010.01111\vert \psi \rangle = 0.7 \vert 000 \rangle - 0.7 \vert 010 \rangle + 0.1 \vert 101 \rangle - 0.01 \vert 111 \rangle

이것은 000\vert 000 \rangle010\vert 010 \rangle의 진폭이 101\vert 101 \rangle111\vert 111 \rangle에 비해 훨씬 큰 편향된 파동 함수입니다. 샘플링하면 000\vert 000 \rangle010\vert 010 \rangle이 더 자주 나타나게 됩니다(샘플링 확률=진폭2\text{샘플링 확률} = \vert \text{진폭} \vert^{2}, 000\vert 000 \rangle010\vert 010 \rangle 각각 약 49%49\%, 101\vert 101 \rangle1%1\%, 111\vert 111 \rangle0.01%0.01\%). 유한한 샘플링 예산(shots)으로는 샘플링된 집합에 000\vert 000 \rangle010\vert 010 \rangle만 포함될 가능성이 매우 높습니다. 앞서 보였듯이, 이렇게 일부 벡터가 누락된 집합으로 부분 공간을 구성하면 진정한 최솟값 고유값을 찾을 수 없습니다. 따라서, 바닥 상태 support를 갖는 상태에서 샘플링하는 것이 유리하며 필수적입니다.

3.2 균등 샘플링에 반대하는 이유

부분 공간을 구성하기 위해 균등 분포에서 샘플을 추출하고 싶은 유혹이 있을 수 있습니다. 작은 문제에서는 효과가 있을 수 있지만, 더 크고 실용적인 문제에서는 실패하기 시작합니다. Qubit 수가 많은 대규모 문제에서 힐베르트 공간은 감당하기 어려울 만큼 커집니다. 예를 들어, 32-Qubit 힐베르트 공간에는 4040억 개 이상의 가능한 기저 벡터가 존재합니다(232=4,294,967,2962^{32} = 4,294,967,296). 유한한 샘플링 예산(예: 대각화 과정을 실현 가능하게 유지하기 위해 1000010000개의 벡터)으로 해당 공간에서 균등하게 샘플링하면, 과정이 무작위적이기 때문에 바닥 상태 support를 갖는 벡터들을 부분 공간에서 제외하는 경우가 더 잦아집니다. 따라서, 양자 Circuit을 활용하여 바닥 상태 support에서 체계적으로 샘플링하는 방법이 필요합니다.

4. SQD와 파동 함수의 희소성

전체 힐베르트 공간 차원과 실현 가능한 부분 공간 차원 사이의 간격은 SQD의 또 다른 중요한 측면, 즉 파동 함수의 희소성을 부각시킵니다. SQD 접근법은 소수의 기저 상태만 무시할 수 없는 진폭을 갖는 희소하거나 집중된 파동 함수에 잘 작동합니다. 그 이유는 두 가지입니다.

  1. 파동 함수가 넓은 경우(즉, 많은 기저 상태가 무시할 수 없는 진폭을 가지는 경우), 부분 공간에 목표 상태 지지를 가진 벡터를 포함하지 못하면 잘못된 고유값과 고유벡터를 얻을 수 있습니다.
  2. 위 문제를 피하려면 부분 공간에 많은 벡터를 포함해야 합니다. 그러나 투영된 해밀토니안의 차원은 부분 공간 차원에 직접 비례합니다. 부분 공간이 커지면 해밀토니안도 커져 대각화가 불가능해질 수 있습니다.

아래 행렬(HnewH_{new})을 사용해 이 문제를 살펴보겠습니다. HnewH_{new}의 최솟값 고유값은 2.2081-2.2081이며, 대응하는 파동 함수(고유 상태)는 넓은 형태입니다.

ψ=000+001+010+011+100+101+110+1118|\psi\rangle = \frac{|000\rangle + |001\rangle + |010\rangle + |011\rangle + |100\rangle + |101\rangle + |110\rangle + |111\rangle}{\sqrt{8}}
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]

이제 HnewH_{new}를 네 개의 벡터 000|000\rangle, 010|010\rangle, 101|101\rangle, 110|110\rangle이 이루는 부분 공간에 투영하고 고유값을 계산해 보겠습니다.

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는 기저 상태 지지에서 준비하고 샘플링하기 위해 변분 양자 Circuit과 반복적인 파라미터 업데이트가 필요할 수 있습니다. 이 반복적인 파라미터 업데이트 절차가 VQE와 유사하기 때문에, 두 방법이 어떻게 다른지, 그리고 SQD가 VQE에 비해 어떤 장점이 있는지 궁금할 수 있습니다. 이 섹션에서는 최소 기저 집합(sto-3g)으로 기술된 N2N_2 분자를 예시로 두 방법을 비교하고 SQD의 장점을 설명합니다.

 VQESQD
측정 오버헤드많은 파울리 항, 많은 측정 Circuit: 해당 분자의 해밀토니안에는 29512951개의 고유 파울리 항이 있습니다. 파울리 항에 XXYY 항이 포함될 수 있으며, 일반적인 양자 측정은 ZZ-기저에서 이루어지므로 해당 항들을 평가하려면 측정 기저를 변환해야 합니다. 측정 최적화 시, 29512951개의 항은 11871187개의 그룹으로 묶일 수 있으며, 각 그룹은 단일 Circuit으로 평가할 수 있습니다. 따라서 모든 파울리 항을 평가하려면 최소 11871187개의 고유 Circuit이 필요합니다. 분산을 줄이기 위해 Circuit당 많은 샷이 필요합니다. 각 파울리 항의 기댓값에는 shots\sqrt{shots}에 반비례하는 분산이 있습니다. 따라서 각 항을 정확하게 추정하려면 Circuit당 많은 샷을 할당해야 합니다. 예를 들어, 화학적 정확도(11 kcal/mol)를 달성하려면 일반적으로 Circuit당 10510^5~10710^7 수준의 샷이 필요합니다. 즉, VQE는 많은 측정 Circuit이 필요하고 각 Circuit에 일정 수의 샷이 필요합니다. 실용적인 경우에는 이러한 측정 오버헤드가 제약이 될 수 있습니다.SQD에서는 각 파울리 항 그룹마다 다른 측정 Circuit이 필요하지 않습니다. 일반적으로 단일 Circuit을 고정된 샷 수로 측정합니다. 문제에 따라 샷 수를 크게 설정할 수 있지만, 오버헤드는 VQE보다 훨씬 작습니다. 또한 대각화 과정을 통한 에너지 추정은 정확하며, 계산된 고유값은 해당 부분 공간에서 정확하고 VQE처럼 분산이 없습니다. (크릴로프 기저 상태 샘플링(Lesson 5)의 경우 여러 Circuit을 측정해야 하지만, Circuit 수는 VQE보다 훨씬 적습니다.)
추정 에너지 하한VQE에서 에너지 추정값은 유계(bounded)가 아니며 노이즈로 인해 실제 최솟값보다 낮아질 수 있습니다.SQD의 에너지 추정 과정은 항상 바닥 상태 에너지의 상한값을 제공하며, 추정된 에너지가 실제 바닥 상태 에너지보다 낮아지는 일은 없습니다.
노이즈 허용 오차VQE 에너지 추정은 결함 전 허용(pre-fault-tolerant) 양자 컴퓨터의 노이즈에 취약합니다.SQD는 노이즈에 대한 고유한 허용 오차를 가집니다. 결함 전 허용 양자 컴퓨터는 노이즈가 있는 샘플을 생성할 수 있습니다. 그러한 샘플을 부분 공간에 포함하더라도 이후의 대각화 과정에서 해당 샘플의 진폭을 0으로 설정해 억제할 수 있습니다. 또한, SQD와 관련하여 구성 복원(configuration recovery) 이라는 방법을 설명할 예정인데, 이는 SQD의 노이즈 허용 오차를 더욱 향상시킵니다.

6. 요약

  1. SQD에서 양자 컴퓨터는 샘플을 생성하고, 고전 컴퓨터는 해밀토니안을 해당 샘플이 이루는 부분 공간에 투영한 뒤 대각화하여 고유값과 고유벡터를 계산합니다.
  2. 생성된 샘플은 목표(바닥) 상태의 지지에서 나온 것이어야 합니다.
  3. 문제에 따라, 양자 상태 준비 및 샘플 생성 흐름은 반복적이거나 비반복적일 수 있습니다.
  4. SQD는 희소한 파동 함수에 가장 잘 작동합니다. 넓은 파동 함수의 경우 정확한 해를 얻기 위해 큰 부분 공간이 필요하며, 이는 고전적 투영 및 대각화 연산을 비용이 크게 만듭니다.
  5. SQD는 낮은 측정 오버헤드, 추정 바닥 상태 에너지의 상한 보장 등 VQE에 비해 여러 장점이 있어 더 뛰어난 확장성을 제공합니다.

참고 문헌

[1] J. Robledo-Moreno et al., "Chemistry Beyond Exact Solutions on a Quantum-Centric Supercomputer" (2024). arXiv:quant-ph/2405.05068.