Tvůj první kvantový experiment
Úvod
V následujícím videu tě Olivia Lanes provede obsahem této lekce. Případně si můžeš otevřít video na YouTube pro tuto lekci v samostatném okně.
Teď už jsi spustil/a svůj první kvantový Circuit a naučil/a ses základy kvantového výpočetnictví: jak jsou kvantové stavy reprezentovány, jak na ně Gate působí a jak jsou do toho zapojeny kvantové vlastnosti jako superpozice a entanglement. Je čas to všechno uvést do praxe a vyřešit svůj první problém na kvantovém počítači.
Širší krajinu problémů vhodných pro kvantové počítače prozkoumáme v pozdější lekci. Nyní se zaměříme na problém z oblasti simulace přírody: použití kvantového počítače jako čistší a lépe ovladatelné náhrady za přirozený kvantový systém. Ve skutečnosti to byla první aplikace, kterou Richard Feynman v 80. letech pro kvantové počítače předpokládal. Jak slavně řekl: „Příroda není klasická, do háje, a pokud chceš simulaci přírody, musíš ji udělat kvantově mechanicky..."
V této lekci budeme tento princip sledovat a simulovat interakci mezi dvěma spiny, které si můžeš představit jako malé magnety. V závislosti na znaménku jejich interakce se mohou rádi srovnat a ukazovat stejným směrem, nebo se rozladit a ukazovat opačnými směry. Zaměříme se na druhý případ, protože ten často vede k zajímavějšímu — a náročnějšímu — chování. Jakmile porozumíme tomuto malému dvouqubitovému systému, ukážeme, jak se stejné myšlenky škálují, což kvantovým počítačům umožní využít jejich exponenciální škálování při simulaci velkých spinových systémů.
Dva interagující magnety
Pro tento problém budeme používat dva qubity, jeden pro každý spin v našem modelu. Každý spin může ukazovat nahoru (stav qubitu ), dolů (stav qubitu ) nebo být v superpozici obou stavů.
Pokud mají spiny antiferomagnetickou interakci, znamená to, že se chtějí rozladit, takže když jeden ukazuje nahoru, druhý chce ukazovat dolů, a naopak.
Nyní předpokládejme, že v systému existuje také magnetické pole ukazující zleva doprava. Protože toto pole ukazuje napříč obvyklým směrem nahoru-dolů spinů, říká se mu transverzální pole. Toto pole může překlápět spiny, což způsobuje, že konfigurace s nejnižší energií je konkrétní superpozice uspořádání spinů nahoru-dolů, nikoli jakýkoliv jediný definitivní vzor spinů.
Všechny tyto efekty můžeme popsat pomocí matematického objektu zvaného Hamiltonian. Hamiltonian nám říká energii systému pro dané uspořádání spinů:
kde je koeficient řídící sílu interakce mezi spiny a je koeficient pro sílu vnějšího magnetického pole. odměňuje nebo trestá spiny v závislosti na tom, zda jsou srovnány nebo rozladěny, a a představují efekt překlápění spinů způsobený magnetickým polem.
Ve fyzice mají systémy tendenci usazovat se do stavu s nejnižší možnou energií, nazývaného základní stav. Nalezení tohoto stavu s nejnižší energií je běžný problém, ale vyžaduje optimalizační techniky, které jsou nad rámec této lekce.
Místo toho položíme jednodušší otázku: Pokud připravíme spiny v určitém stavu, jaká je energie tohoto stavu?
Abychom na to odpověděli:
- Připravíme spiny do stavu dle našeho výběru
- Změříme energii tohoto stavu pomocí výše uvedeného Hamiltonianu
Toto je přesně ten druh výpočtu, který se objevuje uvnitř větších kvantových algoritmů, jako jsou variační algoritmy, které lze prozkoumat v pozdějších kurzech.
Implementace v Qiski
Než se pustíme do psaní kódu, potřebujeme trochu kontextu. Když spouštíme kvantový Circuit, vždy končíme měřením qubitů. Ale existují dva různé druhy otázek, které bychom mohli chtít o výsledku tohoto měření položit: Někdy chceme jednoduše vědět, jaký je stav qubitu. Jindy chceme vědět, jaká je hodnota fyzikální veličiny, například energie, daná kvantovým stavem?
V Qiski jsou tyto dva typy otázek řešeny dvěma různými nástroji, nazývanými primitiva.
Sampler odpovídá na první druh otázky. Spouští Circuit mnohokrát a říká nám, jak často měříme každý možný výsledek, jako 00, 01, 10 nebo 11. Výsledkem je histogram ukazující pravděpodobnost každého výsledku měření.
Estimator odpovídá na druhý druh otázky. Místo histogramu kombinuje mnoho měření na pozadí k výpočtu jediného čísla, jako je energie stavu podle Hamiltonianu, který poskytneme.
Abychom ti pomohli pochopit, kdy a proč bychom každý z těchto nástrojů použili, projdeme dva kompletní pracovní postupy (nazývané „vzory Qiski") aplikované na stejný dvouqubitový systém.
Vzor pracovního postupu Qiski
Vzor pracovního postupu Qiski je obecný rámec, který používáme k řešení kvantových problémů pomocí Qiski. Rozděluje kvantovou výpočetní úlohu do čtyř kroků:
- Namapování problému na model, který může být reprezentován kvantovými obvody
- Optimalizace Circuit pro spuštění na konkrétním Backendu
- Spuštění optimalizovaného Circuit na vybraném Backendu
- Následné zpracování surových dat měření
Experiment 1: Použij Sampler k měření stavu
Mapování
Obecně je krok mapování místem, kde zjišťujeme, jak reprezentovat reálný problém z hlediska qubitů, operátorů a měření. V mnoha aplikacích jde o nejsložitější a nejnáročnější část pracovního postupu — i jednoduché otázky, jako „co každý qubit reprezentuje?", nemají vždy přímočaré odpovědi.
V tomto experimentu je však mapování záměrně jednoduché. Každý fyzický stupeň volnosti se mapuje přímo na jeden qubit. Díky tomuto jednoznačnému odpovídání se krok mapování redukuje na výběr kvantového stavu, který chceme připravit, a napsání Circuit, který tento stav připravuje a měří.
Zde připravíme provázaný Bellův stav, podobný tomu, který jsme vytvořili v úplně první lekci tohoto kurzu:
# Added by doQumentation — required packages for this notebook
!pip install -q qiskit qiskit-ibm-runtime
# Import Qiskit primitives
from qiskit import QuantumCircuit
# Make state
qc = QuantumCircuit(2)
qc.h(0)
qc.cx(0, 1)
qc.x(1)
qc.z(0)
# Measure state
qc.measure_all()
# Draw circuit
qc.draw("mpl")
Optimalizace
Než spustíme náš Circuit na kvantovém počítači (nebo na simulátoru, pokud jsi v daném měsíci vyčerpal/a svůj bezplatný čas na skutečných kvantových počítačích), potřebujeme ho připravit ke spuštění. Tento krok se nazývá optimalizace. (Poznámka: toto použití slova „optimalizace" může být matoucí. V kvantovém výpočetnictví označují optimalizační problémy konkrétní třídu problémů. Zde používáme optimalizaci k popisu nezbytného přípravného kroku, kterým každý kvantový Circuit prochází před tím, než může být efektivně spuštěn na hardwaru.)
Během optimalizace:
- Zvolíme Backend — buď skutečný kvantový počítač nebo simulátor.
- Přiřadíme qubity našeho Circuit k fyzickým qubitům na zařízení.
- Přepíšeme Circuit pouze pomocí hradel, která kvantový počítač skutečně umí provádět.
- Volitelně implementujeme techniky zmírňování a potlačování chyb ke snížení vlivů šumu.
V Qiski to obstarává automaticky Transpiler. Jakmile zvolíš svůj Backend, Transpiler odvede veškerou práci, aby byl tvůj Circuit připraven ke spuštění, takže nemusíš ručně upravovat hradla nebo přiřazení qubitů. Transpiler také nabízí různé úrovně optimalizace, které mohou v případě potřeby pomoci snížit chyby. Optimalizace se provádí ve fázích zvaných „průchody". Tuto optimalizaci bude tedy v kódu níže obstarávat pass_manager. Chceš-li se dozvědět více o chybách a jejich zmírňování, podívej se na kurz Olivie Lanes Kvantové výpočetnictví v praxi.
# Load the Qiskit Runtime service
from qiskit_ibm_runtime import QiskitRuntimeService
## Load the Qiskit Runtime service
# QiskitRuntimeService.save_account(
# channel="ibm_quantum_platform",
# token="YOUR_TOKEN_HERE",
# overwrite=True,
# set_as_default=True,
# )
# service = QiskitRuntimeService(channel="ibm_quantum_platform")
# Or load saved credentials
service = QiskitRuntimeService()
# Use the least busy backend, or uncomment the loading of a specific backend like "ibm_brisbane".
backend = service.least_busy(operational=True, simulator=False, min_num_qubits=127)
# backend = service.backend("ibm_brisbane")
print(backend.name)
ibm_fez
# Transpile the circuit and optimize for running on the quantum computer selected
# Step 2: Transpile
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
target = backend.target
pm = generate_preset_pass_manager(target=target, optimization_level=3)
qc_isa = pm.run(qc)
qc_isa.draw("mpl")
Spuštění
Nyní jsme připraveni ke spuštění! Načteme Sampler a poté pošleme úlohu Backendu.
# Load the Runtime primitive and session
from qiskit_ibm_runtime import SamplerV2 as Sampler
sampler = Sampler(mode=backend)
Nebo, pokud používáš simulátor, místo toho můžeš odkomentovat a spustit tuto buňku:
## Load the backend sampler
# from qiskit.primitives import BackendSamplerV2
## Load the Aer simulator and generate a noise model based on the currently-selected backend.
# from qiskit_aer import AerSimulator
# from qiskit_aer.noise import NoiseModel
# noise_model = NoiseModel.from_backend(backend)
## Define a simulator using Aer, and use it in Sampler.
# backend_sim = AerSimulator(noise_model=noise_model)
# sampler_sim = BackendSamplerV2(backend=backend_sim)
## Alternatively, load a fake backend with generic properties and define a simulator.
## backend_gen = GenericBackendV2(num_qubits=18)
## sampler_gen = BackendSamplerV2(backend=backend_gen)
job = sampler.run([qc_isa], shots=100)
# job = sampler_sim.run([qc_isa]) # uncomment if you want to run on a simulator
res = job.result()
counts = res[0].data.meas.get_counts()
Následné zpracování
from qiskit.visualization import plot_histogram
print("counts = ", counts)
plot_histogram(counts)
counts = {'10': 49, '01': 50, '11': 1}
Vidíme, že většina počtů je buď v 01 nebo 10, což znamená, že když byl jeden qubit změřen jako 0, druhý byl 1, a naopak. To je v souladu s Bellovým stavem , který jsme připravili.
Experiment 2: Použij Estimator k měření energie
Teď, když jsme viděli, jak vzorkovat kvantový stav, použijme Estimator k výpočtu energie našeho Bellova stavu .
Mapování
Připomínáme, že energie systému je určena interakcí mezi spiny () a vnějším magnetickým polem () zachycenou Hamiltonianem:
Každý člen Hamiltonianu nám říká, jak určitá kombinace spinů přispívá k energii. V Qiski můžeme tyto členy reprezentovat jako Pauliho operátory, což jsou jednoduše označení pro jednoduché akce na qubitech:
- působí na oba qubity.
- působí na qubit 0.
- působí na qubit 1.
SparsePauliOp v Qiski je způsob, jak uložit seznam těchto Pauliho operátorů spolu s jejich numerickými koeficienty. Tyto Pauliho operátory jsou pozorovatelné veličiny, které chceme, aby kvantový počítač měřil — veličiny, které nám říkají o systému. Pomocí Estimator můžeme vypočítat průměrnou hodnotu každé pozorovatelné veličiny na našem stavu a zkombinovat je podle koeficientů v Hamiltonianu, abychom získali celkovou energii.
# Import Qiskit primitives
from qiskit.quantum_info import SparsePauliOp
# Parameters
J = 1.0 # antiferromagnetic coupling (J<0)
hx = -0.5 # transverse field strength
# 1. Define the Hamiltonian H = J Z1 Z2 + hx (X1 + X2)
obs = SparsePauliOp.from_list([("ZZ", J), ("XI", hx), ("IX", hx)])
# Make state
qc = QuantumCircuit(2)
qc.h(0)
qc.cx(0, 1)
qc.x(1)
qc.z(0)
<qiskit.circuit.instructionset.InstructionSet at 0x1387ed630>
Všimni si, že jsme v našem kódu vynechali řádek qc.measure_all(). Je to proto, že u Estimator nemusíme specifikovat, kde v Circuit měřit. Jednoduše mu řekneme, které pozorovatelné veličiny chceme odhadnout, a Qiskit se postará o měření na pozadí.
Optimalizace
Krok optimalizace probíhá jako dříve, s tím rozdílem, že se ujistíme, že naše pozorovatelné veličiny jsou také zapsány způsobem, kterému kvantový počítač rozumí.
# Transpile the circuit and optimize for running on the quantum computer selected
# Step 2: Transpile
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
target = backend.target
pm = generate_preset_pass_manager(target=target, optimization_level=3)
qc_isa = pm.run(qc)
obs_isa = obs.apply_layout(layout=qc_isa.layout)
qc_isa.draw("mpl")
Spuštění
V kroku spuštění načteme Estimator a poté pošleme Circuit spolu se seznamem pozorovatelných veličin, které chceme, aby odhadl, kvantovému počítači.
# Load the Runtime primitive and session
from qiskit_ibm_runtime import EstimatorV2 as Estimator
estimator = Estimator(mode=backend)
# Load the backend sampler
# noise_model = NoiseModel.from_backend(backend)
# Use Aer simulator in Estimator
# estimator_sim = BackendEstimatorV2(backend=backend_sim)
# Alternatively, load a fake backend with generic properties and define a simulator.
# backend_gen = GenericBackendV2(num_qubits=18)
# estimator_gen = BackendEstimatorV2(backend=backend_gen)
pubs = [(qc_isa, obs_isa)]
job = estimator.run([[qc_isa, obs_isa]])
res = job.result()
# Uncomment lines below to run the job on the Aer simulator with noise model from real backend
# job = estimator_sim.run([[qc_isa,obs_isa]])
# res=job.result()
Následné zpracování
Nakonec v kroku následného zpracování jednoduše vytiskneme energii vypočítanou na pozadí pomocí Estimator.
print(res[0].data.evs)
-0.9934112021453058
Toto je energie našeho stavu!
Závěr
V této lekci jsme se naučili, jak připravit jednoduchý dvouqubitový kvantový stav reprezentující dva interagující spiny. Viděli jsme, jak použít Sampler k pozorování rozdělení výsledků měření a jak použít Estimator k výpočtu energie stavu podle Hamiltonianu. Cestou jsme viděli, jak Hamiltonian kóduje interakce mezi spiny a účinky vnějšího pole, a jak různé stavy mohou mít různé energie.
Rozšíření na mnoho spinů
Zatím jsme se dívali pouze na dva spiny, které jsou dostatečně jednoduché pro ruční analýzu. V reálných fyzikálních systémech, jako je magnet nebo jiný komplexní materiál, existuje často mnoho interagujících spinů. Když počet spinů roste, Hamiltonian se stává složitějším a hledání stavu s nejnižší energií je mnohem obtížnější. Zde mohou kvantové počítače pomoci: připravováním různých stavů a odhadováním jejich energií můžeme pro velké systémy prozkoumávat konfigurace s nízkou energií efektivněji než klasické počítače.
Přirozeným rozšířením tohoto experimentu by bylo zvýšení počtu qubitů pro reprezentaci více spinů a úprava způsobu, jakým jsou spiny připraveny, abychom se pokusili najít stav s nejnižší energií. Tento přístup je podstatou variačních metod, o kterých se můžeš dozvědět v kurzu Variační kvantové algoritmy.
Existují také další kvantové přístupy ke studiu energií základního stavu, které přesahují rámec variačních technik. Tyto metody zde nejsou pokryty, ale jsou představeny v kurzu Kvantové diagonalizační algoritmy, pokud máš zájem dozvědět se více.
Vzdělávací cíl
Vrať se na začátek Experimentu 2 a zkus ho znovu s jiným stavem superpozice. Dokážeš najít stav s ještě nižší energií, než byl ten, který jsme použili?