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 dikembalikan.
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")
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 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 ) ke atas set vektor parameter 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 berdasarkan pengoptimuman sebelumnya, boleh membantu pengoptimum kita menumpu kepada penyelesaian dengan lebih cepat. Kita merujuknya sebagai titik awal , dan sebagai keadaan awal. Keadaan awal ini berbeza daripada keadaan rujukan kita , 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 (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 kita, jika kita mempunyai akses kepada kecerunan fungsi 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 , di mana ialah kadar pembelajaran — hiperparameter kecil dan positif yang mengawal saiz kemas kini. Kita terus melakukan ini sehingga menumpu kepada minimum lokal fungsi kos, . 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.
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.
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.
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_leveldanresilience_settingmasing-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
COBYLAtidak 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:
Seterusnya, kita akan meneroka algoritma variasikal tertentu dengan kerangka ini dalam fikiran.