Przejdź do głównej treści

Stany referencyjne

W tej lekcji zbadamy, jak możemy zainicjalizować nasz układ za pomocą stanu referencyjnego, aby pomóc naszemu algorytmowi wariacyjnemu szybciej osiągnąć zbieżność. Najpierw nauczymy się, jak ręcznie zbudować stan referencyjny, a następnie poznamy kilka standardowych opcji, które można wykorzystać w algorytmie wariacyjnym.

Diagram opcji stanów referencyjnych, w tym domyślnego, specyficznego dla aplikacji i kwantowego.

Stan domyślny

Stan referencyjny to stały punkt startowy dla naszego problemu. Aby przygotować stan referencyjny, musimy zastosować odpowiedni, nieparametryzowany operator unitarny URU_R na początku naszego Circuit kwantowego, tak że ρ=UR0|\rho\rangle = U_R |0\rangle. Jeśli masz uzasadnione przypuszczenie lub punkt danych z istniejącego optymalnego rozwiązania, algorytm wariacyjny prawdopodobnie szybciej osiągnie zbieżność, jeśli użyjesz go jako punktu startowego.

Najprostszym możliwym stanem referencyjnym jest stan domyślny, w którym korzystamy ze stanu startowego nn-qubitowego Circuit kwantowego: 0n|0\rangle^{\otimes n}. Dla stanu domyślnego nasz operator unitarny URIU_R \equiv I. Dzięki swojej prostocie stan domyślny jest prawidłowym stanem referencyjnym stosowanym w wielu scenariuszach.

Klasyczny stan referencyjny

Załóżmy, że masz układ trzech qubitów i chcesz zacząć od stanu 001|001\rangle zamiast domyślnego stanu 000|000\rangle. Jest to przykład czysto klasycznego stanu referencyjnego, a żeby go skonstruować, wystarczy zastosować bramkę X do qubitu 00 (zgodnie z porządkiem qubitów w Qiskit), gdyż 001=X0000|001\rangle = X_0 |000\rangle.

W tym przypadku nasz operator unitarny to URX0U_R \equiv X_0, co prowadzi do stanu referencyjnego ρ001|\rho\rangle \equiv |001\rangle.

# Added by doQumentation — required packages for this notebook
!pip install -q qiskit
from qiskit import QuantumCircuit

qc = QuantumCircuit(3)
qc.x(0)

qc.draw("mpl")

Wynik poprzedniej komórki kodu

Kwantowy stan referencyjny

Załóżmy, że chcesz zacząć od bardziej złożonego stanu, który obejmuje superpozycję i/lub splątanie, na przykład 12(100+111)\frac{1}{\sqrt{2}}(|100\rangle+|111\rangle).

Aby uzyskać ten stan z 000|000\rangle, jednym z podejść jest zastosowanie bramki Hadamard na qubicie 00 (H0H_0), bramki CNOT (CX) z qubitem 00 jako qubitem kontrolnym i qubitem 11 jako qubitem docelowym (CNOT01CNOT_{01}), a na końcu bramki XX zastosowanej do qubitu 22 (X2X_2).

W tym scenariuszu nasz operator unitarny to URX2CNOT01H0000U_{R} \equiv X_2CNOT_{01}H_0|000\rangle, a nasz stan referencyjny to ρ12(100+111)|\rho\rangle \equiv \frac{1}{\sqrt{2}}(|100\rangle+|111\rangle).

qc = QuantumCircuit(3)
qc.h(0)
qc.cx(0, 1)
qc.x(2)

qc.draw("mpl")

Wynik poprzedniej komórki kodu

Tworzenie stanów referencyjnych za pomocą szablonów Circuit

Możemy również korzystać z różnych szablonów Circuit, takich jak TwoLocal, który pozwala na łatwe wyrażenie wielu sterowalnych parametrów i splątań. Omówimy te szablony Circuit bardziej szczegółowo w następnej lekcji, ale możemy ich używać dla naszych stanów referencyjnych pod warunkiem przypisania parametrów:

from qiskit.circuit.library import TwoLocal
from math import pi

reference_circuit = TwoLocal(2, "rx", "cz", entanglement="linear", reps=1)
theta_list = [pi / 2, pi / 3, pi / 3, pi / 2]

reference_circuit = reference_circuit.assign_parameters(theta_list)

reference_circuit.decompose().draw("mpl")

Wynik poprzedniej komórki kodu

Stany referencyjne specyficzne dla aplikacji

Kwantowe uczenie maszynowe

W kontekście kwantowego klasyfikatora wariacyjnego (VQC) dane treningowe są kodowane w stan kwantowy za pomocą parametryzowanego Circuit zwanego feature map, gdzie każda wartość parametru reprezentuje punkt danych ze zbioru treningowego. zz_feature_map to rodzaj parametryzowanego Circuit, który można wykorzystać do przekazywania naszych punktów danych (xx) do tej feature map.

from qiskit.circuit.library import zz_feature_map

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)
zz_feature_map_reference.decompose().draw("mpl")

Wynik poprzedniej komórki kodu

Podsumowanie

Dzięki tej lekcji nauczyłeś się, jak inicjalizować swój układ przy użyciu:

  • Domyślnego stanu referencyjnego
  • Klasycznych stanów referencyjnych
  • Kwantowych stanów referencyjnych
  • Stanów referencyjnych specyficznych dla aplikacji

Nasz ogólny wariant wariacyjny wygląda następująco:

Diagram Circuit z operatorem unitarnym przygotowującym stan referencyjny.

Choć stany referencyjne są stałymi, początkowymi punktami startowymi, możemy używać formy wariacyjnej do zdefiniowania ansatz, aby reprezentować zbiór parametryzowanych stanów, które nasz algorytm wariacyjny będzie eksplorował.