Korean
언어
English
Bengali
French
German
Japanese
Korean
Portuguese
Spanish
Tamil

참고

이 페이지는 tutorials/algorithms/01_algorithms_introduction.ipynb 에서 생성되었다.

Qiskit의 알고리즘 소개

이는 Qiskit의 알고리즘에 대한 소개로, 시작할 기능의 다양한 측면을 이해하는 데 도움이 되는 고급 개요를 제공한다. 다른 학습서에서는 보다 상세한 자료, 주어진 알고리즘 및 이들을 사용하는 방법 등을 제공한다.

알고리즘 라이브러리는 어떻게 구성되어 있을까?

Qiskit은 다양한 알고리즘 을 제공하며, 목적에 따라 카테고리별로 그룹화되어 있다. 예를 들어, Minimum Eigensolvers 는 연산자의 가장 작은 고유값, 예를 들어, 화학 Hamiltonian의 바닥 상태 에너지, 또는 Ising Hamiltonian 으로 표현되는 최적화 문제에 대한 해법을 찾는다. 그 중에는 양자 시스템의 시간 진화를 위한 Time Evolvers 와 금융 애플리케이션 등에서 가치 추정을 위해 활용될 수 있는 Amplitude Estimators 가 있다. 전체 목차는 위의 알고리즘 문서 링크에서 확인 가능하다.

알고리즘은 구성 가능하며 구성의 일부는 종종 더 작은 빌딩 블록의 형태로 이루어지며, 그 중 다른 빌딩 블록 유형의 인스턴스들이 제공될 수 있다. 예를 들어 변분화된 양자 고윳값 해석기 (Variational Quantum Eigensolver) 인 VQE 에서는 시행 파동 함수가 필요한데, 이는 무엇보다도 QuantumCircuit 와 고전적인 최적화기 형태이다.

VQE 인스턴스를 구성하는 예제를 살펴보자. 여기서 TwoLocal 은 다양한 형태 (시험 파동), 다양할 수 있는 매개화된 회로, 그리고 고전적인 최적화 프로그램인 SLSQP 이다. 이들은 별개의 인스턴스로서 생성되고, 구성될 때 VQE로 전달된다. 예를 들어, 다른 고전적 최적화 프로그램 또는 다양한 양식은 단순히 원하는 것의 인스턴스를 작성하여 VQE에 전달하는 경우이다.

[1]:
from qiskit.algorithms.optimizers import SLSQP
from qiskit.circuit.library import TwoLocal

num_qubits = 2
ansatz = TwoLocal(num_qubits, "ry", "cz")
optimizer = SLSQP(maxiter=1000)

가설을 그려보면 θ[0] 부터 θ[7] 는 VQE 옵티마이저가 최소 고유값을 찾음에 따라 변화하는 매개 변수 QuantumCircuit 을 확인 할 수 있다. 아래의 작업 예제에서 매개변수로 다시 돌아올 것이다.

[2]:
ansatz.decompose().draw("mpl", style="iqx")
[2]:
../../_images/tutorials_algorithms_01_algorithms_introduction_4_0.png

하지만 알고리즘을 실행하려면 몇 가지 일들이 필요하기 때문에 다음으로 가려고 한다.

알고리즘을 어떻게 실행할까?

알고리즘은 기대값 또는 샘플 회로를 평가하기 위해 pritmitive에 의존한다. Primitive는 시뮬레이터나 실제 장치를 기반으로 할 수 있으며 모두 같은 인터페이스를 구현하기 때문에 알고리즘에서 상호 교환적으로 사용할 수 있다.

VQE에서는 기대값을 평가해야 하므로, 예를 들면 평가를 위해 기본 Qiskit Terra 설치와 함께 제공되는 qiskit.primitives.Estimator 를 사용할 수 있다.

[3]:
from qiskit.primitives import Estimator

estimator = Estimator()

이 estimator은 정확한 상태 벡터 시뮬레이션을 사용하여 기대치를 평가 한다. 또한 샷 기반의 노이즈가 있는 시뮬레이터나 실제 백엔드를 대신 사용할 수 있다. 시뮬레이터에 대한 자세한 내용은 Qiskit Aer 와 실제 하드웨어에 대한 내용은 Qiskit IBM Runtime 를 확인할 수 있다.

모든 준비가 되었으므로 이제 VQE를 인턴스화할 수 있다:

[4]:
from qiskit.algorithms.minimum_eigensolvers import VQE

vqe = VQE(estimator, ansatz, optimizer)

이제 compute_mininum_eigenvalue() 메서드를 호출할 수 있다. 후자는 특정 범주 내의 모든 알고리즘과 상호 호환될 수 있도록 네이처 및 최적화와 같은 애플리케이션 모듈들을 위해 선택된 인터페이스이다.

완전한 작업 예제

위에서부터 배운 것을 토대로 완벽한 작업 예제를 만들어 보자. VQE는 최소 고윳값 (eigenvalue), 즉, Hamiltonian 연산자의 최소 에너지 값을 찾을 것이며, 따라서 우리는 VQE와 작업하기 위한 연산자가 필요하다. 이러한 연산자는 아래에 주어진다. 이는 원래의 Nature 적용 모듈에 의해 0.735A 원자간 거리에서 H2 분자에 대한 Hamiltonian으로 생성되었다. 이는 아래와 같은 파울리 용어의 합이지만, 지금은 알고리즘을 실행하는 것이 목표이기 때문에 이에 관한 추가적인 내용을 덧붙이지 않을 것이며, 연산자에 대한 추가 정보는 다른 튜토리얼에서 찾을 수 있다.

[5]:
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)
])

따라서 VQE를 실행하고 반환된 결과 객체를 출력한다.

[6]:
result = vqe.compute_minimum_eigenvalue(H2_op)
print(result)
{   'aux_operators_evaluated': None,
    'cost_function_evals': 102,
    'eigenvalue': -1.857275020719397,
    'optimal_circuit': <qiskit.circuit.library.n_local.two_local.TwoLocal object at 0x7f96da26a470>,
    'optimal_parameters': {   ParameterVectorElement(θ[0]): -2.403507257619715,
                              ParameterVectorElement(θ[5]): 1.7060524493254914,
                              ParameterVectorElement(θ[1]): 3.085467047665086,
                              ParameterVectorElement(θ[2]): -2.1949965223522487,
                              ParameterVectorElement(θ[3]): 4.276089268519914,
                              ParameterVectorElement(θ[4]): -3.098644972035885,
                              ParameterVectorElement(θ[6]): 0.032773583818940334,
                              ParameterVectorElement(θ[7]): 2.8861019033185396},
    'optimal_point': array([-2.40350726,  3.08546705, -2.19499652,  4.27608927, -3.09864497,
        1.70605245,  0.03277358,  2.8861019 ]),
    'optimal_value': -1.857275020719397,
    'optimizer_evals': None,
    'optimizer_result': <qiskit.algorithms.optimizers.optimizer.OptimizerResult object at 0x7f96da2a4d60>,
    'optimizer_time': 0.29071593284606934}

위의 결과에서 주어진 H2 분자의 전자 바닥 상태 에너지(electronic ground state energy) 인 \(\approx -1.85727\) 의 최소 고윳값을 찾을 때까지, 옵티마이저가 비용 함수(=에너지) 평가의 수를 알 수 있다. 또한, Ansatz의 최적 매개변수는 ansatz의 매개변수들 중 최소값을 갖는 매개변수 임을 확인할 수 있다.

VQE 내부 primitive 업데이트

마치기 위해서 VQE 내부의 estimator primitive도 변경해본다. 아마 시뮬레이션 결과에 만족했으니 이제 shot-based 시뮬레이터를 사용하거나, 하드웨어로 실행해보자!

이 예시에서 아직 Qiskit Terra 기반인 primitive로 shot-based 추정기로 변경하고 있다. 그러나 primitive 를 예로 들어 Qiskit Aer의 estimator (qiskit_aer.primitives.Estimator) 또는 심지어 실제 백엔드 (qiskit_ibm_runtime.Estimator) 로도 대체할 수 있다.

노이즈 손실 함수의 경우 일반적으로 SPSA 옵티마이저가 잘 수행되므로 옵티마이저도 업데이트한다. 샷 기반 및 노이즈 시뮬레이션에 대한 자세한 내용은 noisy VQE tutorial 를 참조하자.

[7]:
from qiskit.algorithms.optimizers import SPSA

estimator = Estimator(options={"shots": 1000})

vqe.estimator = estimator
vqe.optimizer = SPSA(maxiter=100)
result = vqe.compute_minimum_eigenvalue(operator=H2_op)
print(result)
{   'aux_operators_evaluated': None,
    'cost_function_evals': 200,
    'eigenvalue': -1.8574503552440247,
    'optimal_circuit': <qiskit.circuit.library.n_local.two_local.TwoLocal object at 0x7f96da2f4250>,
    'optimal_parameters': {   ParameterVectorElement(θ[0]): -7.7940259581467375,
                              ParameterVectorElement(θ[5]): 0.28827257835035214,
                              ParameterVectorElement(θ[1]): -1.8091021117029589,
                              ParameterVectorElement(θ[2]): -2.460381278734678,
                              ParameterVectorElement(θ[3]): -7.725013961075425,
                              ParameterVectorElement(θ[4]): -1.3793338621798832,
                              ParameterVectorElement(θ[6]): -2.4148423942537587,
                              ParameterVectorElement(θ[7]): -1.8555574263247812},
    'optimal_point': array([-7.79402596, -1.80910211, -2.46038128, -7.72501396, -1.37933386,
        0.28827258, -2.41484239, -1.85555743]),
    'optimal_value': -1.8574503552440247,
    'optimizer_evals': None,
    'optimizer_result': <qiskit.algorithms.optimizers.optimizer.OptimizerResult object at 0x7f96da26a5f0>,
    'optimizer_time': 0.8142139911651611}

참고: 여기서는 시뮬레이터에서 랜덤 시드를 수정하지 않았으므로 재실행을 하게되면 약간 다른 결과가 나타난다.

이로써 Qiskit을 사용한 알고리즘 입문에 대하여 다루었다. 알고리즘에 대한 좀더 깊고 넓은 내용에 흥미가 있다면, 본 시리즈의 다른 알고리즘 사용 지침서들 또한 참고해 주시길 바란다.

[8]:
import qiskit.tools.jupyter
%qiskit_version_table
%qiskit_copyright

Version Information

Qiskit SoftwareVersion
qiskit-terra0.23.0.dev0+f52bb33
qiskit-aer0.11.1
qiskit-ignis0.7.1
qiskit-ibmq-provider0.19.2
qiskit-nature0.5.0
qiskit-optimization0.5.0
qiskit-machine-learning0.6.0
System information
Python version3.10.4
Python compilerClang 12.0.0
Python buildmain, Mar 31 2022 03:38:35
OSDarwin
CPUs4
Memory (Gb)32.0
Wed Dec 07 11:02:26 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.

[ ]: