참고
이 페이지는 `tutorials/algorithms/04_vqd.ipynb`__ 로부터 생성되었다.
Variational Quantum Deflation (VQD) 알고리즘¶
이 노트북은 〈reference paper <https://arxiv.org/abs/1805.08138>`에 소개된 바와 같이 Qiskit의 `Variational Quantum Deflation (VQD)<https://qiskit.org/documentation/stubs/qiskit.algorithms.eigensolvers.VQD.html>`__ 알고리즘을 이용하여 Hamiltonian의 보다 높은 에너지 상태를 계산하는 알고리즘을 사용하는 방법을 시연한다.
도입¶
VQD는 주어진 시스템의 Hamiltonian H*의 *k 고유값을 찾기 위해 다양한 기술을 사용하는 양자 알고리즘이다.
알고리즘은 변형된 함수에 걸쳐 최적화함으로써 일반화된 해밀토니언들의 들뜬 상태 에너지들을 계산한다. 각각의 연속 고유값은 최소화되어야 하는 이전에 계선된 모든 고유 상태를 갖는 중첩 항을 도입함으로써 반복적으로 계산된다. 이를 통해 더 높은 에너지 고유 상태를 찾을 수 있습니다.
VQD에 대한 작업 예제를 완료하자¶
VQD 워크플로우의 첫 번째 단계는 큐비트 연산자, 안사츠 및 최적화 도구를 만드는 것이다. 이 예에서는 H2 분자를 사용한다. H2 분자는 이전 VQE 튜토리얼을 완료한 경우 익숙할 것이다.
[1]:
from qiskit.quantum_info import SparsePauliOp
H2_op = SparsePauliOp.from_list(
[
("II", -1.052373245772859),
("IZ", 0.39793742484318045),
("ZI", -0.39793742484318045),
("ZZ", -0.01128010425623538),
("XX", 0.18093119978423156),
]
)
예를 들어, TwoLocal
안사츠를 세개의 큐비트로 구현하거나, 최적화 방법으로 ``SLSQP``를 선택할 수 있다.
[2]:
from qiskit.circuit.library import TwoLocal
from qiskit.algorithms.optimizers import SLSQP
ansatz = TwoLocal(3, rotation_blocks=["ry", "rz"], entanglement_blocks="cz", reps=1)
optimizer = SLSQP()
ansatz.decompose().draw('mpl')
[2]:

워크플로의 다음 단계는 VQD
실행에 필요한 프리미티브를 정의하는 것이다. 이 알고리듬은 “VQE part” 에 대한 기대값을 계산하기 위한 Estimator``와 ``Sampler``라는 두 가지 기본 인스턴스가 필요하다. 샘플러는 더 높은 에너지 상태에 대한 비용을 계산하는 데 사용되는 ``StateFidelity
서브루틴으로 전달된다. 상태 충실도는 여러 방법으로 계산되지만 간단하게 유지하기 위해 qiskit.algorithm.state_fidelities``에서 이미 사용 가능한 ``ComputeUncompute
방법을 사용할 수 있다.
[3]:
from qiskit.primitives import Sampler, Estimator
from qiskit.algorithms.state_fidelities import ComputeUncompute
estimator = Estimator()
sampler = Sampler()
fidelity = ComputeUncompute(sampler)
VQD 알고리듬을 설정하려면 계산할 에너지 상태의 수(k
)와 원본 VQD 논문에 정의된 betas``라는 두 가지 추가 입력을 정의하는 것이 중요하다. 이 예에서 상태 수(``k
)는 3으로 설정되며, 이는 바닥 상태 외에 두 개의 여기 상태가 계산됨을 나타낸다.
betas``는 비용 함수에 대한 각 중첩 항의 기여도의 균형을 맞추며 ``VQD
구성의 선택적 인수이다. 사용자가 설정하지 않으면 SparsePauliOp
유형의 입력 연산자에 대해 자동 평가된다. 자신만의 betas``를 설정하려면 길이 ``k
값 목록을 제공해야 한다.
[4]:
k = 3
betas = [33, 33, 33]
VQD 알고리즘을 실행할 준비가 거의 되었지만, 먼저 중간 값을 저장하기 위한 콜백을 정의하겠다:
[5]:
counts = []
values = []
steps = []
def callback(eval_count, params, value, meta, step):
counts.append(eval_count)
values.append(value)
steps.append(step)
최종적으로 VQD
를 인스턴스화하고 선택한 연산자의 고유값을 계산할 수 있다.
[6]:
from qiskit.algorithms.eigensolvers import VQD
vqd = VQD(estimator, fidelity, ansatz, optimizer, k=k, betas=betas, callback=callback)
result = vqd.compute_eigenvalues(operator = H2_op)
vqd_values = result.optimal_values
VQD
결과의 일부로 세 가지 상태 에너지를 확인할 수 있다:
[7]:
print(vqd_values)
[-1.85727464 -1.2445845 -0.88272229]
콜백에 저장된 값을 사용하여 각 상태에 대한 에너지 수렴을 표시할 수 있다:
[8]:
import numpy as np
import pylab
pylab.rcParams["figure.figsize"] = (12, 8)
steps = np.asarray(steps)
counts = np.asarray(counts)
values = np.asarray(values)
for i in range(1,4):
_counts = counts[np.where(steps == i)]
_values = values[np.where(steps == i)]
pylab.plot(_counts, _values, label=f"State {i-1}")
pylab.xlabel("Eval count")
pylab.ylabel("Energy")
pylab.title("Energy convergence for each computed state")
pylab.legend(loc="upper right");

이 분자는 NumPyEigensolver
클래스를 사용하여 정확히 풀 수 있으며, VQD
결과와 비교를 위한 기준값을 제공한다:
[9]:
from qiskit.algorithms.eigensolvers import NumPyEigensolver
from qiskit.opflow import PauliSumOp
exact_solver = NumPyEigensolver(k=3)
exact_result = exact_solver.compute_eigenvalues(PauliSumOp(H2_op))
ref_values = exact_result.eigenvalues
정확한 결과를 이전에 계산된 VQD
고유값과 비교해 보자:
[10]:
print(f"Reference values: {ref_values}")
print(f"VQD values: {vqd_values}")
Reference values: [-1.85727503 -1.24458455 -0.88272215]
VQD values: [-1.85727464 -1.2445845 -0.88272229]
보시다시피 VQD의 결과는 정확한 솔루션의 값과 일치하며 VQE를 확장하여 들뜬 상태도 계산한다.
[11]:
import qiskit.tools.jupyter
%qiskit_version_table
%qiskit_copyright
Version Information
Qiskit Software | Version |
---|---|
qiskit-terra | 0.22.2 |
qiskit-aer | 0.11.1 |
qiskit-ignis | 0.7.1 |
qiskit-ibmq-provider | 0.19.2 |
qiskit | 0.39.2 |
System information | |
Python version | 3.10.2 |
Python compiler | Clang 13.0.0 (clang-1300.0.29.30) |
Python build | v3.10.2:a58ebcc701, Jan 13 2022 14:50:16 |
OS | Darwin |
CPUs | 8 |
Memory (Gb) | 64.0 |
Fri Dec 09 14:27:13 2022 CET |
This code is a part of Qiskit
© Copyright IBM 2017, 2022.
This code is licensed under the Apache License, Version 2.0. You may
obtain a copy of this license in the LICENSE.txt file in the root directory
of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.
Any modifications or derivative works of this code must retain this
copyright notice, and modified files need to carry a notice indicating
that they have been altered from the originals.