Langkau ke kandungan utama

Gelung pengoptimuman

Dalam pelajaran ini, kita akan belajar cara menggunakan pengoptimum untuk meneroka keadaan kuantum berparameter pada ansatz kita secara berulang:

  • Mulakan gelung pengoptimuman
  • Fahami pertukaran rugi-untung semasa menggunakan pengoptimum lokal dan global
  • Terokai dataran tandus dan cara mengelakkannya

Secara ringkas, pengoptimum adalah teras kepada penerokaan ruang carian kita. Pengoptimum menggunakan penilaian fungsi kos untuk memilih set parameter seterusnya dalam gelung variasikal, dan mengulangi proses itu sehingga mencapai keadaan stabil. Pada peringkat ini, set nilai parameter optimum θ\vec\theta^* dikembalikan.

Rajah beberapa faktor penting dalam pengoptimuman, termasuk dataran tandus, pengoptimum berasaskan kecerunan lwn. tanpa kecerunan, dan pemulaan.

Pengoptimum Lokal dan Global

Kita akan sediakan masalah kita terlebih dahulu sebelum meneroka setiap kelas pengoptimum. Kita akan mulakan dengan Circuit yang mengandungi lapan parameter variasikal:

# Added by doQumentation — required packages for this notebook
!pip install -q numpy qiskit 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([("XX", 1), ("YY", -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")

Output sel kod sebelumnya

def cost_func_vqe(params, 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
"""
pub = (ansatz, hamiltonian, params)
cost = estimator.run([pub]).result()[0].data.evs
return cost
from qiskit.primitives import StatevectorEstimator

estimator = StatevectorEstimator()

Pengoptimum Lokal

Pengoptimum lokal mencari titik yang meminimumkan fungsi kos bermula dari titik awal C(θ0)C(\vec{\theta_0}) dan bergerak ke titik lain berdasarkan apa yang diperhatikan di kawasan yang sedang dinilai pada setiap lelaran. Ini bermakna penumpuan algoritma ini biasanya cepat, tetapi boleh bergantung sangat kepada titik awal. Pengoptimum lokal tidak dapat melihat melampaui kawasan penilaian mereka dan sangat terdedah kepada minimum lokal — mereka melaporkan penumpuan apabila menemuinya dan mengabaikan keadaan lain dengan penilaian yang lebih baik.

# SciPy minimizer routine
from scipy.optimize import minimize

x0 = np.ones(8)

result = minimize(
cost_func_vqe, x0, args=(ansatz, observable, estimator), method="SLSQP"
)

result
message: Optimization terminated successfully
success: True
status: 0
fun: -3.9999999964520634
x: [ 1.000e+00 1.000e+00 -1.571e+00 -4.556e-05 -1.207e+00
-1.935e+00 4.079e-01 -4.079e-01]
nit: 12
jac: [ 0.000e+00 0.000e+00 -7.957e-04 2.543e-04 1.381e-03
1.381e-03 5.430e-04 5.431e-04]
nfev: 112
njev: 12

Pengoptimum Global

Pengoptimum global mencari titik yang meminimumkan fungsi kos merentasi beberapa kawasan domainnya (iaitu, bukan lokal), menilainya secara berulang (iaitu, pada lelaran ii) ke atas set vektor parameter Θi:=θi,jjJopti\Theta_i := \\{ {\vec\theta_{i,j} | j \in \mathcal{J}_\text{opt}^i} \\} yang ditentukan oleh pengoptimum. Ini menjadikannya kurang terdedah kepada minimum lokal dan agak bebas daripada permulaan, tetapi juga jauh lebih perlahan untuk menumpu kepada penyelesaian yang dicadangkan.

Pemulaan Pengoptimuman

Pemulaan, atau menetapkan nilai awal untuk parameter θ\vec\theta berdasarkan pengoptimuman sebelumnya, boleh membantu pengoptimum kita menumpu kepada penyelesaian dengan lebih cepat. Kita merujuknya sebagai titik awal θ0\vec\theta_0, dan ψ(θ0)=UV(θ0)ρ|\psi(\vec\theta_0)\rangle = U_V(\vec\theta_0)|\rho\rangle sebagai keadaan awal. Keadaan awal ini berbeza daripada keadaan rujukan kita ρ|\rho\rangle, kerana yang pertama memfokus pada parameter awal yang ditetapkan semasa gelung pengoptimuman, manakala yang kedua memfokus pada penggunaan penyelesaian "rujukan" yang diketahui. Keduanya mungkin bertepatan jika UV(θ0)IU_V(\vec\theta_0) \equiv I (iaitu, operasi identiti).

Apabila pengoptimum lokal menumpu kepada minimum lokal yang tidak optimum, kita boleh cuba memulakan pengoptimuman secara global dan memperhalusi penumpuan secara lokal. Walaupun ini memerlukan penyediaan dua beban kerja variasikal, ia membolehkan pengoptimum mencari penyelesaian yang lebih optimum berbanding pengoptimum lokal sahaja.

Pengoptimum Berasaskan Kecerunan dan Tanpa Kecerunan

Berasaskan Kecerunan

Untuk fungsi kos C(θ)C(\vec\theta) kita, jika kita mempunyai akses kepada kecerunan fungsi C(θ)\vec{\nabla} C(\vec\theta) bermula dari titik awal, cara paling mudah untuk meminimumkan fungsi ialah mengemas kini parameter ke arah keturunan paling curam fungsi tersebut. Iaitu, kita mengemas kini parameter sebagai θn+1=θnηC(θ)\vec\theta_{n+1} = \vec\theta_n - \eta \vec{\nabla} C(\vec\theta), di mana η\eta ialah kadar pembelajaran — hiperparameter kecil dan positif yang mengawal saiz kemas kini. Kita terus melakukan ini sehingga menumpu kepada minimum lokal fungsi kos, C(θ)C({\vec\theta^*}). Kita boleh menggunakan fungsi kos ini dan pengoptimum untuk mengira parameter optimum

# SciPy minimizer routine
from scipy.optimize import minimize

x0 = np.ones(8)

result = minimize(
cost_func_vqe, x0, args=(ansatz, observable, estimator), method="BFGS"
)

result
message: Optimization terminated successfully.
success: True
status: 0
fun: -3.9999999999997025
x: [ 1.000e+00 1.000e+00 1.571e+00 3.220e-07 2.009e-01
-2.009e-01 6.342e-01 -6.342e-01]
nit: 14
jac: [-1.192e-07 -2.980e-08 8.345e-07 1.103e-06 5.960e-08
0.000e+00 -5.960e-08 2.980e-08]
hess_inv: [[ 1.000e+00 1.872e-10 ... 5.077e-05 3.847e-05]
[ 1.872e-10 1.000e+00 ... -5.208e-05 -4.060e-05]
...
[ 5.077e-05 -5.208e-05 ... 7.243e-01 -2.604e-01]
[ 3.847e-05 -4.060e-05 ... -2.604e-01 8.179e-01]]
nfev: 144
njev: 16

Kelemahan utama jenis pengoptimuman ini ialah kelajuan penumpuan yang boleh menjadi sangat perlahan, dan tiada jaminan untuk mencapai penyelesaian optimum.

Graf f(theta) berbanding theta, beberapa titik menunjukkan keadaan berbeza algoritma keturunan kecerunan mencari minimum lengkung.

Tanpa Kecerunan

Algoritma pengoptimuman tanpa kecerunan tidak memerlukan maklumat kecerunan dan berguna dalam situasi di mana mengira kecerunan adalah sukar, mahal, atau terlalu bising. Ia juga cenderung lebih teguh dalam mencari optima global, sedangkan kaedah berasaskan kecerunan cenderung menumpu kepada optima lokal. Kita akan meneroka beberapa keadaan di mana pengoptimum tanpa kecerunan boleh membantu mengelakkan dataran tandus. Namun, kaedah tanpa kecerunan memerlukan sumber pengiraan yang lebih tinggi, terutamanya untuk masalah dengan ruang carian berdimensi tinggi.

Berikut adalah contoh yang menggunakan pengoptimum COBYLA:

# 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: -3.999999973369678
x: [ 1.631e+00 1.492e+00 1.571e+00 3.142e+00 1.375e+00
-1.767e+00 1.484e+00 1.658e+00]
nfev: 137
maxcv: 0.0

Dataran Tandus

Sebenarnya, landskap kos boleh menjadi agak rumit, seperti yang ditunjukkan oleh bukit-bukau dan lembah dalam contoh di bawah. Kaedah pengoptimuman mengemudi kita merentasi landskap kos, mencari minimum, seperti yang ditunjukkan oleh titik dan garis hitam. Kita dapat melihat bahawa dua daripada tiga pencarian berakhir di minimum lokal landskap, bukan minimum global.

Manifold berlengkung yang rumit dengan banyak puncak dan lembah.

Tanpa mengira jenis kaedah pengoptimuman yang digunakan, jika landskap kos agak rata, kaedah tersebut mungkin sukar menentukan arah carian yang sesuai. Senario ini dirujuk sebagai dataran tandus, di mana landskap kos menjadi semakin rata (dan dengan itu semakin sukar untuk menentukan arah ke minimum). Untuk pelbagai litar kuantum berparameter, kebarangkalian bahawa kecerunan di mana-mana arah yang munasabah bukan sifar kepada ketepatan tetap tertentu berkurangan secara eksponen apabila bilangan Qubit meningkat.

Rajah dataran geografi berbanding cerun gunung, untuk menjelaskan mengapa kecerunan membantu kita mencari minimum dan dataran menghalang usaha kita.

Walaupun kawasan ini masih dalam penyelidikan aktif, kita ada beberapa cadangan untuk meningkatkan prestasi pengoptimuman:

  • Pemulaan boleh membantu gelung pengoptimuman mengelak daripada tersekat dalam ruang parameter di mana kecerunan adalah kecil.
  • Bereksperimen dengan ansatz cekap perkakasan: Memandangkan kita menggunakan sistem kuantum berbising sebagai oracle kotak hitam, kualiti penilaian tersebut boleh mempengaruhi prestasi pengoptimum. Menggunakan ansatz cekap perkakasan, seperti EfficientSU2, mungkin dapat mengelakkan penjanaan kecerunan yang kecil secara eksponen.
  • Bereksperimen dengan penindasan ralat dan pengurangan ralat: primitif Qiskit Runtime menyediakan antara muka mudah untuk bereksperimen dengan pelbagai nilai optimization_level dan resilience_setting masing-masing. Ini boleh mengurangkan kesan bunyi dan menjadikan proses pengoptimuman lebih cekap.
  • Bereksperimen dengan pengoptimum tanpa kecerunan: Tidak seperti algoritma pengoptimuman berasaskan kecerunan, pengoptimum seperti COBYLA tidak bergantung pada maklumat kecerunan untuk mengoptimumkan parameter dan oleh itu kurang mungkin dipengaruhi oleh dataran tandus.

Ringkasan

Dengan pelajaran ini, kamu telah belajar cara menentukan gelung pengoptimuman:

  • Mulakan gelung pengoptimuman
  • Fahami pertukaran rugi-untung semasa menggunakan pengoptimum lokal dan global
  • Terokai dataran tandus dan cara mengelakkannya

Beban kerja variasikal peringkat tinggi kita sudah lengkap:

Circuit kuantum kini dengan unit untuk menyediakan keadaan rujukan, dan unit kedua untuk mengubah keadaan menggunakan parameter variasikal.

Seterusnya, kita akan meneroka algoritma variasikal tertentu dengan kerangka ini dalam fikiran.