Mga Instance at Extension
Tatalakayin ng kabanatang ito ang ilang quantum variational algorithm, kasama ang mga sumusunod:
- Variational Quantum Eigensolver (VQE)
- Subspace Search VQE (SSVQE)
- Variational Quantum Deflation (VQD)
- Quantum Sampling Regression (QSR)
Sa pamamagitan ng mga algorithm na ito, matututunan natin ang ilang ideya sa disenyo na maaaring isama sa mga custom variational algorithm, tulad ng mga timbang (weights), mga parusa (penalties), over-sampling, at under-sampling. Hinihikayat namin kayo na mag-eksperimento sa mga konseptong ito at ibahagi ang inyong mga natuklasan sa komunidad.
Naaangkop ang Qiskit patterns framework sa lahat ng mga algorithm na ito — ngunit tahasang bibanggit lang natin ang mga hakbang sa unang halimbawa.
Variational Quantum Eigensolver (VQE)
Ang VQE ay isa sa mga pinaka-ginagamit na variational quantum algorithm, na nagtatakda ng template para sa ibang mga algorithm na maaaring itayo dito.
Hakbang 1: I-map ang mga klasikal na input sa quantum na problema
Teoretikal na layout
Simple ang layout ng VQE:
- I-prepare ang reference operators na
- Magsisimula tayo mula sa estado at pupunta sa reference state na
- I-apply ang variational form na para lumikha ng ansatz na
- Pupunta tayo mula sa estado patungo sa
- Mag-bootstrap sa kung mayroon kang katulad na problema (karaniwang nahahanap sa pamamagitan ng klasikal na simulation o sampling)
- Bawat optimizer ay mag-bo-bootstrap nang iba-iba, na magreresulta sa isang paunang hanay ng mga parameter vector na (halimbawa, mula sa isang paunang punto ).
- Suriin ang cost function na para sa lahat ng inihanda na estado sa isang quantum computer.
- Gumamit ng klasikal na optimizer para pumili ng susunod na hanay ng mga parameter na .
- Ulitin ang proseso hanggang maabot ang convergence.
Ito ay isang simpleng klasikal na optimization loop kung saan sinusuri natin ang cost function. Maaaring mangailangan ang ilang optimizer ng maraming evaluasyon para kalkulahin ang gradient, tukuyin ang susunod na iterasyon, o tasahin ang convergence.
Narito ang halimbawa para sa sumusunod na observable:
Implementasyon
# Added by doQumentation — required packages for this notebook
!pip install -q numpy qiskit qiskit-ibm-runtime scipy
from qiskit import QuantumCircuit
from qiskit.quantum_info import SparsePauliOp
from qiskit.circuit.library import TwoLocal
import numpy as np
theta_list = (2 * np.pi * np.random.rand(1, 8)).tolist()
observable = SparsePauliOp.from_list([("II", 2), ("XX", -2), ("YY", 3), ("ZZ", -3)])
reference_circuit = QuantumCircuit(2)
reference_circuit.x(0)
variational_form = TwoLocal(
2,
rotation_blocks=["rz", "ry"],
entanglement_blocks="cx",
entanglement="linear",
reps=1,
)
ansatz = reference_circuit.compose(variational_form)
ansatz.decompose().draw("mpl")
def cost_func_vqe(parameters, ansatz, hamiltonian, estimator):
"""Return estimate of energy from estimator
Parameters:
params (ndarray): Array of ansatz parameters
ansatz (QuantumCircuit): Parameterized ansatz circuit
hamiltonian (SparsePauliOp): Operator representation of Hamiltonian
estimator (Estimator): Estimator primitive instance
Returns:
float: Energy estimate
"""
estimator_job = estimator.run([(ansatz, hamiltonian, [parameters])])
estimator_result = estimator_job.result()[0]
cost = estimator_result.data.evs[0]
return cost
from qiskit.primitives import StatevectorEstimator
estimator = StatevectorEstimator()
Maaari nating gamitin ang cost function na ito para kalkulahin ang pinakamainam na mga parameter.
# SciPy minimizer routine
from scipy.optimize import minimize
x0 = np.ones(8)
result = minimize(
cost_func_vqe, x0, args=(ansatz, observable, estimator), method="COBYLA"
)
result
message: Optimization terminated successfully.
success: True
status: 1
fun: -5.999999982445723
x: [ 1.741e+00 9.606e-01 1.571e+00 2.115e-05 1.899e+00
1.243e+00 6.063e-01 6.063e-01]
nfev: 136
maxcv: 0.0
Hakbang 2: I-optimize ang problema para sa quantum execution
Pipili tayo ng least-busy na backend, at ia-import ang mga kinakailangang component mula sa qiskit_ibm_runtime.
from qiskit_ibm_runtime import SamplerV2 as Sampler
from qiskit_ibm_runtime import EstimatorV2 as Estimator
from qiskit_ibm_runtime import Session, EstimatorOptions
from qiskit_ibm_runtime import QiskitRuntimeService
service = QiskitRuntimeService()
backend = service.least_busy(operational=True, simulator=False)
print(backend)
<IBMBackend('ibm_brisbane')>
I-transpile natin ang Circuit gamit ang preset pass manager na may optimization level 3, at ia-apply natin ang kaukulang layout sa observable.
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
pm = generate_preset_pass_manager(backend=backend, optimization_level=3)
isa_ansatz = pm.run(ansatz)
isa_observable = observable.apply_layout(layout=isa_ansatz.layout)
Hakbang 3: I-execute gamit ang Qiskit Runtime primitives
Handa na tayong patakbuhin ang ating kalkulasyon sa IBM Quantum® hardware. Dahil napaka-iteratibo ng pag-minimize ng cost function, magsisimula tayo ng Runtime session. Sa ganitong paraan, isang beses lang tayong maghihintay sa pila. Kapag nagsimula nang tumakbo ang job, bawat iterasyon na may mga update sa mga parameter ay tatakbo agad.
x0 = np.ones(8)
estimator_options = EstimatorOptions(resilience_level=1, default_shots=10_000)
with Session(backend=backend) as session:
estimator = Estimator(mode=session, options=estimator_options)
result = minimize(
cost_func_vqe,
x0,
args=(isa_ansatz, isa_observable, estimator),
method="COBYLA",
options={"maxiter": 200, "disp": True},
)
session.close()
print(result)
Hakbang 4: Post-process, ibalik ang resulta sa klasikal na format
Makikita natin na matagumpay na natapos ang minimization routine, ibig sabihin naabot natin ang default na toleransya ng COBYLA klasikal na optimizer. Kung kailangan ng mas tumpak na resulta, maaari tayong magtakda ng mas maliit na toleransya. Maaari ngang kailanganin ito, dahil ilang porsyentong kaibahan ang resulta kumpara sa resulta na nakuha ng simulator sa itaas.
Ang halaga ng x na nakuha ay ang pinakamainam na hula sa kasalukuyan para sa mga parameter na nagpapaliit ng cost function. Kung nagtatasa para makakuha ng mas mataas na katumpakan, ang mga halagang iyon ay dapat gamitin kapalit ng x0 na unang ginamit (isang vector ng mga isa).
Sa huli, dapat nating tandaan na 96 beses na sinuri ang function sa proseso ng optimization. Maaaring mag-iba ito mula sa bilang ng mga optimization step, dahil ang ilang optimizer ay nangangailangan ng maraming evaluasyon ng function sa isang hakbang, tulad ng kapag tinatantiya ang gradient.
Subspace Search VQE (SSVQE)
Ang SSVQE ay isang variant ng VQE na nagpapahintulot sa pagkuha ng unang eigenvalue ng isang observable na na may mga eigenvalue na , kung saan . Nang walang pagkawala ng pangkalahatan, ipinapalagay natin na . Nagpapakilala ang SSVQE ng bagong ideya sa pamamagitan ng pagdaragdag ng mga timbang upang matulungang bigyang-priyoridad ang pag-optimize para sa term na may pinakamalaking timbang.
Para maipatupad ang algorithm na ito, kailangan natin ng na magkaparehong ortogonal na reference state na , ibig sabihin para sa . Ang mga estadong ito ay maaaring itayo gamit ang mga Pauli operator. Ang cost function ng algorithm na ito ay:
kung saan ang ay isang arbitraryong positibong numero na kung ay , at ang ay ang variational form na tinukoy ng gumagamit.
Ang SSVQE algorithm ay nakasalalay sa katotohanang ang mga eigenstate na naaayon sa iba't ibang eigenvalue ay magkaparehong ortogonal. Partikular, ang inner product ng at ay maaaring ipahayag bilang:
Ang unang pagkakapantay-pantay ay totoo dahil ang ay isang quantum operator at samakatuwid ay unitary. Ang huling pagkakapantay-pantay ay totoo dahil sa ortogonalidad ng mga reference state na . Ang katotohanang napapanatili ang ortogonalidad sa pamamagitan ng mga unitary transformation ay malalim na nauugnay sa prinsipyo ng pangangalaga ng impormasyon, gaya ng ipinapahayag sa quantum information science. Sa pananaw na ito, ang mga non-unitary transformation ay kumakatawan sa mga proseso kung saan ang impormasyon ay nawawala o naiiniksyon.
Tinutulungan ng mga timbang na matiyak na lahat ng estado ay mga eigenstate. Kung sapat na magkaiba ang mga timbang, ang term na may pinakamalaking timbang (ibig sabihin, ) ay mabibigyan ng priyoridad sa panahon ng optimization kaysa sa iba. Bilang resulta, ang resultang estado ay magiging eigenstate na naaayon sa . Dahil ang ay magkaparehong ortogonal, ang natitirang mga estado ay magiging ortogonal dito at, samakatuwid, nakapaloob sa subspace na naaayon sa mga eigenvalue na .
Sa paglalapat ng parehong argumento sa natitirang mga term, ang susunod na priyoridad ay ang term na may timbang , kaya ang ay magiging eigenstate na naaayon sa , at ang ibang mga term ay mananatili sa eigenspace ng .
Sa pamamagitan ng inductive reasoning, natutukoy natin na ang ay magiging isang tinatayang eigenstate ng para sa
Teoretikal na layout
Ang SSVQE ay maaaring ibuod tulad ng sumusunod:
- Maghanda ng ilang reference state sa pamamagitan ng pag-apply ng unitary U_R sa k iba't ibang computational basis state
- Ang algorithm na ito ay nangangailangan ng paggamit ng magkaparehong ortogonal na reference state na , tulad na para sa .
- I-apply ang variational form na sa bawat reference state, na nagbubunga sa sumusunod na ansatz na .
- Mag-bootstrap sa kung mayroon kang katulad na problema (karaniwang nahahanap sa pamamagitan ng klasikal na simulation o sampling).
- Suriin ang cost function na para sa lahat ng inihanda na estado sa isang quantum computer.
- Maaari itong hatiin sa pagkalkula ng expectation value para sa isang observable na at pagpaparami ng resultang iyon sa .
- Pagkatapos, ibinabalik ng cost function ang kabuuan ng lahat ng weighted expectation value.
- Gumamit ng klasikal na optimizer para tukuyin ang susunod na hanay ng mga parameter na .
- Ulitin ang mga hakbang sa itaas hanggang maabot ang convergence.
Muling itatayo mo ang cost function ng SSVQE sa assessment, ngunit mayroon kaming sumusunod na snippet para gabayan ang iyong solusyon:
import numpy as np
def cost_func_ssvqe(
params, initialized_anastz_list, weights, ansatz, hamiltonian, estimator
):
# """Return estimate of energy from estimator
# Parameters:
# params (ndarray): Array of ansatz parameters
# initialized_anastz_list (list QuantumCircuit): Array of initialised ansatz with reference
# weights (list): List of weights
# ansatz (QuantumCircuit): Parameterized ansatz circuit
# hamiltonian (SparsePauliOp): Operator representation of Hamiltonian
# estimator (Estimator): Estimator primitive instance
# Returns:
# float: Weighted energy estimate
# """
energies = []
# Define SSVQE
weighted_energy_sum = np.dot(energies, weights)
return weighted_energy_sum
Variational Quantum Deflation (VQD)
Ang VQD ay isang iteratibong pamamaraan na nagpapalawak ng VQE para makuha ang unang eigenvalue ng isang observable na na may mga eigenvalue na , kung saan , sa halip na ang una lamang. Para sa natitirang bahagi ng seksyong ito, ipapalagay natin, nang walang pagkawala ng pangkalahatan, na . Nagpapakilala ang VQD ng konsepto ng penalty cost para gabayan ang proseso ng optimization.
Nagpapakilala ang VQD ng isang penalty term, na tinutukoy bilang , para balansehin ang kontribusyon ng bawat overlap term sa cost. Ang penalty term na ito ay nagsisilbing parusa sa proseso ng optimization kung hindi nakamit ang ortogonalidad. Ipinapataw natin ang hadlang na ito dahil ang mga eigenstate ng isang observable, o isang Hermitian operator, na naaayon sa iba't ibang eigenvalue ay palaging magkaparehong ortogonal, o maaaring gawing ganoon sa kaso ng degeneracy o mga paulit-ulit na eigenvalue. Kaya, sa pamamagitan ng pagpapatupad ng ortogonalidad sa eigenstate na naaayon sa , epektibo tayong nag-o-optimize sa subspace na naaayon sa natitirang mga eigenvalue na . Dito, ang ay ang pinakamababang eigenvalue mula sa natitirang mga eigenvalue at, samakatuwid, ang pinakamainam na solusyon ng bagong problema ay maaaring makuha gamit ang variational theorem.
Ang pangkalahatang ideya sa likod ng VQD ay ang paggamit ng VQE gaya ng dati para makuha ang pinakamababang eigenvalue na kasama ang kaukulang (tinatayang) eigenstate na para sa ilang pinakamainam na parameter vector na . Pagkatapos, para makuha ang susunod na eigenvalue na , sa halip na i-minimize ang cost function na , ino-optimize natin ang:
Ang positibong halaga ng ay dapat na mas malaki kaysa .
Nagpapakilala ito ng bagong cost function na maaaring tingnan bilang isang constrained problem, kung saan ini-minimize natin ang alinsunod sa hadlang na ang estado ay dapat na ortogonal sa dating nakuhang , na ang ay gumaganap bilang penalty term kung hindi natutupad ang hadlang.
Bilang kahalili, ang bagong problemang ito ay maaaring interpretahin bilang pagpapatakbo ng VQE sa bagong observable:
Ipagpalagay na ang solusyon sa bagong problema ay , ang inaasahang halaga ng (hindi ) ay dapat na .
Para makuha ang ikatlong eigenvalue na , ang cost function na ia-optimize ay:
kung saan ang ay isang positibong constant na sapat na malaki para ipatupad ang ortogonalidad ng solution state sa parehong at . Pinaparusahan nito ang mga estado sa search space na hindi nakakatugon sa kinakailangang ito, na epektibong pinipigilan ang search space. Kaya naman, ang pinakamainam na solusyon ng bagong problema ay dapat na ang eigenstate na naaayon sa .
Tulad ng nakaraang kaso, ang bagong problemang ito ay maaari ring interpretahin bilang VQE na may observable:
Kung ang solusyon sa bagong problemang ito ay , ang inaasahang halaga ng (hindi ) ay dapat na .
Sa katulad na paraan, para makuha ang -th eigenvalue na