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 ∣ρ⟩=UR∣0⟩|\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: ∣0⟩⊗n|0\rangle^{\otimes n}. Dla stanu domyślnego nasz operator unitarny UR≡IU_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⟩=X0∣000⟩|001\rangle = X_0 |000\rangle.

W tym przypadku nasz operator unitarny to UR≡X0U_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 UR≡X2CNOT01H0∣000⟩U_{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ł.