Korean
언어
English
Japanese
German
Korean
Portuguese, Brazilian
French
Shortcuts

참고

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

IBM 퀀텀 랩 에서 대화식으로 실행하십시오.

키스킷의 알고리즘 소개

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

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

Qiskit은 다수의 알고리즘들 을 제공하며, 이들은 수행할 수 있는 작업에 따라 카테고리별로 그룹화되어 있다. 예를 들어, Minimum Eigensolvers 는 작동/연산자의 가장 작은 고유값, 예를 들어, 화학 해밀턴의 접지 상태 에너지, 또는 Ising Hamiltonian 으로 표현되는 최적화 문제에 대한 해법을 찾는다. 그 중에는 머신러닝의 분류 문제를 해결하기 위한 Classifiers 와, 금융 애플리케이션에서 활용될 수 있는 Amplitude Estimators 가 존재한다. 전체 카테고리는 위의 알고리즘 문서 링크에서 확인 가능하다.

알고리즘은 구성 가능하며 구성의 일부는 종종 빌딩블록 유형의 다른 인스턴스를 제공 할 수 있는 더 작은 빌딩블록의 형태로 되어 있다. 예를 들어, Variational Quantum Eigensolver인 VQE``는 ``QuantumCircuit 형태의 시험 파동(trial wavefunction)과 고전적인 옵티마이저(optimizer)를 인자로 갖는다. 이와 같은 빌딩블록은 컴포넌트회로 라이브러리 의 회로로 찾을 수 있다.

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

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

num_qubits = 2
ansatz = TwoLocal(num_qubits, 'ry', 'cz')
opt = SLSQP(maxiter=1000)
vqe = VQE(var_form=ansatz, optimizer=opt)

Ansatz를 그려서(draw) QuantumCircuit임을 확인해 보자. 여기서 θ[0] 부터 θ[7] 는 VQE 옵티마이저가 최소 고유값을 찾음에 따라 변화하는 매개 변수이다. 아래의 작업 예제에서 매개변수로 다시 돌아올 것이다.

[2]:
ansatz.draw()
[2]:
../../_images/tutorials_algorithms_01_algorithms_introduction_4_0.png

하지만 알고리즘을 실행하려면 몇 가지 일들이 필요하므로 다음 단계로 넘어가도록 하겠다.

알고리즘을 실행하는 방법은 무엇입니까?

알고리즘을 실행하기 위해, 알고리즘을 구성하는 회로가 실행될 수 있는 백엔드, 시뮬레이터 또는 실제 장치가 있어야 한다. 예를 들어, statevector_simulator 를 BasicAer 에서 가져다 사용할 수 있다.

[3]:
from qiskit import BasicAer

backend = BasicAer.get_backend('statevector_simulator')

이제 백엔드 자체에는 회로를 실행하는 방법 등에 대한 정보가 없다. 예를 들어, 얼마나 많은 샷, 노이즈 모델을 원하는가? 회로의 transpiling에 대한 옵션이 필요한가? 키스킷 아쿠아에는 백엔드 뿐만 아니라 회로 처리 및 실행에 대한 다양한 설정을 제공하는 QuantumInstance 가 있다.

[4]:
from qiskit.aqua import QuantumInstance

backend = BasicAer.get_backend('qasm_simulator')
quantum_instance = QuantumInstance(backend=backend, shots=800, seed_simulator=99)

참고: 백엔드를 직접적으로 제공하면 내부적으로 QuantumInstance가 기본 설정으로 생성되므로, 알고리즘은 항상 QuantumInstance를 통해 작동한다.

그래서 이제 모든 알고리즘에 공통적인 run() 메서드를 호출하고 알고리즘에 특정한 결과를 반환할 수 있게 되었다. 이 경우, VQE는 MinimumEigensolver 이기 때문에, compute_mininum_eigenvalue() 메소드를 사용할 수 있다. 후자는 특정 카테고리 내의 임의의 알고리즘과 상호교환가능하게 동작할 수 있도록, 화학 및 최적화와 같은 애플리케이션 모듈에 대한 선택의 인터페이스이다.

완전한 작업 예제

Let’s put what we have learned from above together and create a complete working example. VQE will find the minimum eigenvalue, i.e. minimum energy value of a Hamiltonian operator and hence we need such an operator for VQE to work with. Such an operator is given below. This was originally created by the Chemistry application module as the Hamiltonian for an H2 molecule at 0.735A interatomic distance. It’s a sum of Pauli terms as below, but for now I am not going to say anything further about it since the goal is to run the algorithm, but further information on operators can be found in other tutorials.

[5]:
from qiskit.aqua.operators import X, Z, I

H2_op = (-1.052373245772859 * I ^ I) + \
        (0.39793742484318045 * I ^ Z) + \
        (-0.39793742484318045 * Z ^ I) + \
        (-0.01128010425623538 * Z ^ Z) + \
        (0.18093119978423156 * X ^ X)

따라서 연산자를 전달하는 VQE 인스턴스와 QuantumInstance를 사용하는 백엔드를 생성자에 빌드하자. 이제 VQE에는 연산자 및 백엔드가 나중에 전달될 수 있도록 설정이 맞추어져 있다. 이들을 나중에 설정하면 이 문제에 대한 특정 정보 없이 알고리즘을 작성한 후 추후 이를 사용할 때 요긴하게 쓰인다. 예를 들어 특정 화학 문제를 해결하는 연산자를 작성하는 화학 애플리케이션 모듈 같은 것이 있다. 결국 해야 하는 일은 동일한 셈이다.

참고: 이 노트북을 실행하고 aqua_globals의 Aqua에서 사용되는 난수 생성기와 정확히 동일한 출력을 확인하려면 QuantumInstance를 통해 전송자 및 시뮬레이터를 시딩한다. 이 작업은 선택사항이며, 매번 정확히 동일한 결과를 재생할 수 있기를 원할 경우에 이 작업을 수행하면 된다.

따라서 VQE를 실행하고 반환한 결과 오브젝트를 출력한다.

[6]:
from qiskit.aqua import aqua_globals
seed = 50
aqua_globals.random_seed = seed
qi = QuantumInstance(BasicAer.get_backend('statevector_simulator'), seed_transpiler=seed, seed_simulator=seed)

ansatz = TwoLocal(rotation_blocks='ry', entanglement_blocks='cz')
slsqp = SLSQP(maxiter=1000)
vqe = VQE(operator=H2_op, var_form=ansatz, optimizer=slsqp, quantum_instance=qi)
result = vqe.run()

import pprint
pp = pprint.PrettyPrinter(indent=4)
pp.pprint(result)
{   'cost_function_evals': 72,
    'eigenstate': array([-9.55448660e-05+2.12037105e-17j,  9.93766273e-01+2.25293943e-16j,
       -1.11483565e-01+1.52657541e-16j, -1.77521351e-05+3.71607315e-17j]),
    'eigenvalue': (-1.857275017559769+0j),
    'optimal_parameters': {   Parameter(θ[0]): 4.296520551468743,
                              Parameter(θ[1]): 4.426962086704216,
                              Parameter(θ[2]): 0.5470753710293924,
                              Parameter(θ[7]): 0.3602072316165878,
                              Parameter(θ[6]): -4.717618235040379,
                              Parameter(θ[5]): 1.5683261371389359,
                              Parameter(θ[3]): 6.09294789784282,
                              Parameter(θ[4]): -2.598325857134344},
    'optimal_point': array([ 4.29652055,  4.42696209,  0.54707537,  6.0929479 , -2.59832586,
        1.56832614, -4.71761824,  0.36020723]),
    'optimal_value': -1.857275017559769,
    'optimizer_evals': 72,
    'optimizer_time': 1.310880184173584}

위의 결과에서 주어진 H2 분자의 전자 접지 상태 에너지(electronic ground state energy) 인 -1.85727``의 최소 고유값을 찾을 때까지, 옵티마이저가 매개 변수 값을 ``72 평가한 것을 확인할 수 있다. 또한, Ansatz의 최적 매개 변수는 ansatz의 매개 변수들 중 최소값을 갖는 매개변수 임을 확인할 수 있다.

VQE를 MinimumEigensolver로 사용하기

이를 닫기 위해서, 최소치 (MinimumEigensolver) 인터페이스를 사용하고, 오퍼레이터 또는 QuantumInstance를 제공하지 않고 VQE 인스턴스를 생성한다. 나중에 퀀텀 인스턴스를 설정하고 마지막으로 compute_minimum_eigenvalue 메소드에서 연산자를 전달한다 (이 메소드는 VQE가 실행하는 시간에 의해 작동하는 연산자를 갖는다).

[7]:
aqua_globals.random_seed = seed
qi = QuantumInstance(BasicAer.get_backend('statevector_simulator'), seed_transpiler=seed, seed_simulator=seed)

ansatz = TwoLocal(rotation_blocks='ry', entanglement_blocks='cz')
slsqp = SLSQP(maxiter=1000)
vqe = VQE(var_form=ansatz, optimizer=slsqp)

vqe.quantum_instance = qi
result = vqe.compute_minimum_eigenvalue(operator=H2_op)

pp.pprint(result)
{   'cost_function_evals': 72,
    'eigenstate': array([-9.55448660e-05+2.12037105e-17j,  9.93766273e-01+2.25293943e-16j,
       -1.11483565e-01+1.52657541e-16j, -1.77521351e-05+3.71607315e-17j]),
    'eigenvalue': (-1.857275017559769+0j),
    'optimal_parameters': {   Parameter(θ[4]): -2.598325857134344,
                              Parameter(θ[5]): 1.5683261371389359,
                              Parameter(θ[6]): -4.717618235040379,
                              Parameter(θ[7]): 0.3602072316165878,
                              Parameter(θ[1]): 4.426962086704216,
                              Parameter(θ[0]): 4.296520551468743,
                              Parameter(θ[2]): 0.5470753710293924,
                              Parameter(θ[3]): 6.09294789784282},
    'optimal_point': array([ 4.29652055,  4.42696209,  0.54707537,  6.0929479 , -2.59832586,
        1.56832614, -4.71761824,  0.36020723]),
    'optimal_value': -1.857275017559769,
    'optimizer_evals': 72,
    'optimizer_time': 2.8010470867156982}

이전 예로서 동일한 시딩(seeding) 이 사용되었기 때문에, 결과는 동일한 것으로 보일 수 있다.

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

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

Version Information

Qiskit SoftwareVersion
Qiskit0.23.1
Terra0.16.1
Aer0.7.1
Ignis0.5.1
Aqua0.8.1
IBM Q Provider0.11.1
System information
Python3.7.8 | packaged by conda-forge | (default, Jul 31 2020, 02:25:08) [GCC 7.5.0]
OSLinux
CPUs8
Memory (Gb)31.40900421142578
Fri Jan 15 12:11:24 2021 UTC

This code is a part of Qiskit

© Copyright IBM 2017, 2021.

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.

[ ]: