접근법과 변분형
모든 가변 알고리즘의 핵심은 매개변수 또는 변수 집합에서 잘 동작하는 매핑(예: 연속, 가변)을 통해 편리하게 연관된 상태 간의 차이를 분석하는 핵심 아이디어에 있습니다 - 그래서 이름입니다.
먼저 매개변수화된 회로를 직접 구성하는 방법을 살펴보겠습니다. 이 회로를 사용하여 변형 알고리즘에서 탐색할 매개변수화된 상태의 모음을 나타내는 일정 횟수 반복되는 매개변수화된 게이트의 레이어와 비용 함수를 최소화하기 위해 알고리즘 중에 게이트의 매개변수가 최적화됩니다. 을 정의하겠습니다. 그런 다음 이 변형 양식을 참조 상태에 적용하여 참조 연산자와 변형 형식의 조합으로, 탐색 중인 검색 공간을 설명합니다. 을 구성합니다.
또한 이 검색 공간을 탐색하면서 속도와 정확성의 균형을 맞추는 방법도 살펴볼 것입니다.
매개변수화된 양자 회로
가변 알고리즘은 유한한 파라미터 세트 에 따라 달라지는 다양한 양자 상태 를 탐색하고 비교하는 방식으로 작동합니다. 이러한 상태는 매개변수화된 양자 회로를 사용하여 준비할 수 있으며, 여기서 게이트는 조정 가능한 매개변수로 정의됩니다. 아직 특정 각도를 바인딩하지 않고도 이 파라미터화된 회로를 만들 수 있습니다:
from qiskit.circuit import QuantumCircuit, Parameter
theta = Parameter("θ")
qc = QuantumCircuit(3)
qc.rx(theta, 0)
qc.cx(0, 1)
qc.x(2)
qc.draw("mpl")Output:
from math import pi
angle_list = [pi / 3, pi / 2]
circuits = [qc.assign_parameters({theta: angle}) for angle in angle_list]
for circuit in circuits:
display(circuit.draw("mpl"))Output:
변분형식 및 가정
참조 상태 에서 대상 상태 로 반복적으로 최적화하려면 변형 알고리즘이 탐색할 매개변수화된 상태의 모음을 나타내는 변형 형식 을 정의해야 합니다:
매개변수화된 상태는 매개변수에 의존하지 않는 참조 상태 와 항상 매개변수에 의존하는 변형 형식 모두에 의존한다는 점에 유의하세요. 우리는 이 두 반쪽의 조합을 안사츠라고 합니다: .
가변 알고리즘이 탐색할 매개변수화된 상태의 모음을 표현하기 위해 앙사츠를 구성하면서 중요한 문제, 즉 차원성을 깨닫게 됩니다. -큐비트 시스템(즉, 힐베르트 공간)은 구성 공간에 수많은 고유한 양자 상태가 존재합니다. 이를 완전히 탐색하려면 다루기 힘든 수의 매개변수가 필요합니다. 정량적으로, 그 차원은 입니다. 설상가상으로 검색 알고리즘 등의 런타임 복잡성은 이 차원성에 따라 기하급수적으로 증가하며, 이러한 현상은 종종 문헌에서 '차원성의 저주'라고 불립니다.
이러한 문제를 해결하기 위해 가장 관련성이 높은 상태만 탐색되도록 변형 양식에 몇 가지 합리적인 제약을 가하는 것이 일반적인 관행입니다. 효율적인 잘린 안사츠를 찾는 것은 활발한 연구 분야이지만, 여기서는 두 가지 일반적인 디자인을 다뤄보겠습니다.
휴리스틱 접근법과 절충점
차원을 제한하는 데 도움이 되는 특정 문제에 대한 정보가 없는 경우 매개변수보다 적은 임의의 매개변수화된 회로 제품군을 사용해 볼 수 있습니다. 하지만 고려해야 할 몇 가지 장단점이 있습니다:
- 속도 : 검색 공간을 줄임으로써 알고리즘이 더 빠르게 실행될 수 있습니다.
- 정확성 : 공간을 줄이면 문제에 대한 실제 해결책이 제외되어 차선의 해결책이 나올 위험이 있습니다.
- 노이즈 : 더 깊은 회로는 노이즈의 영향을 받으므로 안사츠의 연결성, 게이트 및 게이트 충실도를 실험해야 합니다.
품질(또는 해결 가능성)과 속도 사이에는 근본적인 상충 관계가 있습니다. 매개변수가 많을수록 정확한 결과를 찾을 가능성은 높아지지만 알고리즘을 실행하는 데 시간이 더 오래 걸립니다.
N-로컬 회로
휴리스틱 안새체의 가장 널리 사용되는 예 중 하나는 몇 가지 이유로 N-로컬 회로입니다 :
- 효율적인 구현 : N-로컬 안사츠는 일반적으로 적은 수의 물리적 큐비트를 사용하여 양자 컴퓨터에서 효율적으로 구현할 수 있는 간단한 로컬 게이트로 구성됩니다. 이를 통해 양자 회로를 더 쉽게 구성하고 최적화할 수 있습니다.
- 중요한 상관관계를 포착합니다 : N-로컬 안사츠는 적은 수의 게이트로도 양자 시스템에서 큐비트 간의 중요한 상관관계를 포착할 수 있습니다. 로컬 게이트는 인접한 큐비트에 작용하여 이들 사이에 얽힘을 일으킬 수 있으며, 이는 복잡한 양자 시스템을 시뮬레이션하는 데 중요할 수 있기 때문입니다.
이러한 회로는 다음과 같이 한 번 이상 번갈아 반복되는 회전 및 얽힘 레이어로 구성됩니다:
- 각 레이어는 최대 크기의 게이트로 구성되며, 여기서 은 큐비트 수보다 작아야 합니다.
- 회전 레이어의 경우 게이트가 서로 겹쳐져 있습니다. 다음과 같은 표준 회전 작업을 사용할 수 있습니다
RX또는CRZ. - 인탱글 레이어의 경우,
Toffoli게이트 또는CX와 같은 게이트를 사용할 수 있습니다. - 두 가지 유형의 레이어 모두 매개변수화할 수 있지만 둘 중 하나 이상은 매개변수를 포함해야 합니다. 그렇지 않으면 적어도 하나의 매개 변수가 없으면 변형이 없을 것입니다!
- 선택적으로 회로의 끝에 추가 회전 레이어를 추가할 수 있습니다.
예를 들어, 5개의 큐비트 NLocal 회전 블록으로 구성된 RX 과 CRZ 게이트, 큐비트에 작용하는 Toffoli 게이트, , , 및 및 로 구성된 얽힘 블록이 각 레이어의 반복으로 구성된 5개의 큐비트 회로를 만들어 보겠습니다.
from qiskit.circuit.library import NLocal, CCXGate, CRZGate, RXGate
from qiskit.circuit import Parameter
theta = Parameter("θ")
ansatz = NLocal(
num_qubits=5,
rotation_blocks=[RXGate(theta), CRZGate(theta)],
entanglement_blocks=CCXGate(),
entanglement=[[0, 1, 2], [0, 2, 3], [4, 2, 1], [3, 1, 0]],
reps=2,
insert_barriers=True,
)
ansatz.decompose().draw("mpl")Output:
위의 예에서 가장 큰 게이트는 토폴리 게이트로, 3개의 큐비트에 작용하여 -로컬 회로를 만듭니다. 가장 일반적으로 사용되는 -로컬 회로 유형은 단일 큐비트 회전 게이트가 있는 -로컬 회로와 -큐비트 얽힘 게이트입니다.
키스킷의 클래스를 사용하여 -로컬 회로를 만들어 보겠습니다 TwoLocal 클래스를 사용합니다. 구문은 NLocal 과 동일하지만 몇 가지 차이점이 있습니다. 예를 들어 RX, RZ, CNOT 와 같은 대부분의 게이트는 게이트를 가져오거나 Parameter 인스턴스를 만들지 않고 문자열로 전달할 수 있습니다.
from qiskit.circuit.library import TwoLocal
ansatz = TwoLocal(
num_qubits=5,
rotation_blocks=["rx", "rz"],
entanglement_blocks="cx",
entanglement="linear",
reps=2,
insert_barriers=True,
)
ansatz.decompose().draw("mpl")Output:
이 경우, 각 큐비트가 다음 큐비트와 얽혀 있는 선형 얽힘 분포를 사용했습니다. 다른 전략에 대해 알아보려면 TwoLocal 문서를 참조하세요.
효율적인 SU2
efficient_su2 는 SU(2) 및 CX 얽힘에 걸친 단일 큐비트 연산 레이어로 구성된 하드웨어 효율적 회로입니다. 이는 가변 양자 알고리즘을 위한 시험 파동 함수를 준비하거나 머신 러닝을 위한 분류 회로로 사용할 수 있는 휴리스틱 패턴입니다.
from qiskit.circuit.library import efficient_su2
ansatz = efficient_su2(4, su2_gates=["rx", "y"], entanglement="linear", reps=1)
ansatz.decompose().draw("mpl")Output:
문제 특이적 접근법
휴리스틱과 하드웨어적으로 효율적인 앤셋은 순진한 방식으로 문제를 해결하는 데 도움이 되지만, 문제별 지식을 사용하여 회로 검색 공간을 특정 유형으로 제한할 수 있습니다. 이렇게 하면 검색 프로세스의 정확성을 잃지 않으면서도 속도를 높일 수 있습니다.
최적화
최대 절단 문제에서는 서로 다른 그룹에 있는 노드 사이의 가장자리 수를 최대화하는 방식으로 그래프의 노드를 분할하려고 합니다. 아래 그래프에서 원하는 최대 컷 파티션은 왼쪽의 0번째 노드가 오른쪽의 나머지 노드와 컷으로 분리되어야 합니다.
import rustworkx as rx
from rustworkx.visualization import mpl_draw
n = 4
G = rx.PyGraph()
G.add_nodes_from(range(n))
# The edge syntax is (start, end, weight)
edges = [(0, 1, 1.0), (0, 2, 1.0), (0, 3, 1.0), (1, 2, 1.0), (2, 3, 1.0)]
G.add_edges_from(edges)
mpl_draw(
G, pos=rx.shell_layout(G), with_labels=True, edge_labels=str, node_color="#1192E8"
)Output:
최대 절단 문제에 QAOA 알고리즘을 활용하려면 연산자의 최소 기대값이 서로 다른 두 그룹의 노드 간 최대 에지 수에 대응하는 방식으로 비용을 인코딩하는 폴리 해밀턴이 필요합니다.
이 간단한 예에서 연산자는 에지로 연결된 노드에서 Z 연산자를 사용한 용어의 선형 조합입니다(0번째 큐비트가 가장 오른쪽에 있다는 것을 기억하세요): . 연산자가 구성되면, QAOA 알고리즘의 연산자는 키스킷 회로 라이브러리의 QAOAAnsatz 회로를 사용하여 쉽게 구축할 수 있습니다.
# Pre-defined ansatz circuit, operator class and visualization tools
from qiskit.circuit.library import QAOAAnsatz
from qiskit.quantum_info import SparsePauliOp
# Problem to Hamiltonian operator
hamiltonian = SparsePauliOp.from_list(
[("ZZII", 1), ("IZZI", 1), ("ZIIZ", 1), ("IZIZ", 1), ("IIZZ", 1)]
)
# QAOA ansatz circuit
ansatz = QAOAAnsatz(hamiltonian, reps=2)
# Draw
ansatz.decompose(reps=3).draw("mpl")Output:
이전 이미지에서는 이해를 돕기 위해 기본 게이트의 안사츠를 설명했습니다. 그러나 reps 인수를 변경하거나 분해 방법을 사용하지 않고 회로를 그려서 여러 단계로 분해하여 표현할 수 있습니다. 예를 들어 다음 표현은 기본 담당자 값인 reps=1 이 있는 QAOA 구조를 직접 보여줍니다.
ansatz.decompose(reps=2).draw("mpl")Output:
Quantum Machine Learning
머신 러닝에서는 데이터를 두 가지 이상의 카테고리로 분류하는 것이 일반적인 응용 분야입니다. 여기에는 데이터 포인트를 기존 특징 벡터를 양자 힐버트 공간에 매핑하는 특징 맵으로 인코딩하는 작업이 포함됩니다. 고전적으로 시뮬레이션하기 어려운 매개변수화된 양자 회로를 기반으로 양자 특징 맵을 구축하는 것은 기존 머신러닝 접근 방식보다 잠재적인 이점을 얻기 위한 중요한 단계이며 현재 활발히 연구되고 있는 분야입니다.
zz_feature_map 을 사용하여 파라미터화된 회로를 만들 수 있습니다. 데이터 포인트를 피처 맵( )에 전달하고 별도의 변형 양식을 사용하여 가중치를 매개변수로 전달할 수 있습니다( ).
from qiskit.circuit.library import zz_feature_map, TwoLocal
data = [0.1, 0.2]
zz_feature_map_reference = zz_feature_map(feature_dimension=2, reps=2)
zz_feature_map_reference = zz_feature_map_reference.assign_parameters(data)
variation_form = TwoLocal(2, ["ry", "rz"], "cz", reps=2)
vqc_ansatz = zz_feature_map_reference.compose(variation_form)
vqc_ansatz.decompose().draw("mpl")Output:
요약
이 단원에서는 변형 양식으로 검색 공간을 정의하는 방법을 배웠습니다:
- 조정 가능한 파라미터로 게이트를 정의하는 파라미터화된 양자 회로로 상태를 준비합니다
- 속도와 정확성의 균형을 맞추는 앤셋을 구축하는 방법
- 휴리스틱 분석
- 문제별 분석
높은 수준의 변형 워크로드는 다음과 같습니다:
각 변형 매개변수 에 대해 다른 양자 상태가 생성됩니다. 최적의 파라미터를 찾으려면 문제별 비용 함수를 정의하여 앤사츠의 파라미터를 반복적으로 업데이트해야 합니다.