Ansaetze dan bentuk variasi
Inti kepada semua algoritma variasi ialah idea utama menganalisis perbezaan antara keadaan, yang dihubungkan secara mudah melalui pemetaan bersifat baik (contohnya, selanjar, boleh dibezakan) daripada satu set parameter atau pemboleh ubah — itulah sebabnya ia dinamakan sedemikian.
Pertama, kita akan terokai cara membina litar berparameter secara manual. Kita akan gunakan litar ini untuk mentakrifkan bentuk variasi yang mewakili koleksi keadaan berparameter untuk diteroka oleh algoritma variasi kita. Kemudian, kita akan bina ansatz dengan menggunakan bentuk variasi ini pada keadaan rujukan kita.
Kita juga akan terokai cara mengimbangi antara kelajuan dan ketepatan semasa menerokai ruang carian ini.
Litar Kuantum Berparameter
Algoritma variasi beroperasi dengan menerokai dan membandingkan julat keadaan kuantum , yang bergantung pada set terhingga parameter . Keadaan-keadaan ini boleh disediakan menggunakan litar kuantum berparameter, di mana gate-gate ditakrifkan dengan parameter yang boleh dilaras. Ia mungkin untuk mencipta litar berparameter ini tanpa mengikat sudut tertentu dahulu:
# Added by doQumentation — required packages for this notebook
!pip install -q qiskit rustworkx
from qiskit.circuit import QuantumCircuit, Parameter
theta = Parameter("θ")
qc = QuantumCircuit(3)
qc.rx(theta, 0)
qc.cx(0, 1)
qc.x(2)
qc.draw("mpl")
from math import pi
angle_list = [pi / 3, pi / 2]
circuits = [qc.assign_parameters({theta: angle}) for angle in angle_list]
for circuit in circuits:
display(circuit.draw("mpl"))
Bentuk Variasi dan Ansatz
Untuk mengoptimumkan secara berulang daripada keadaan rujukan ke keadaan sasaran , kita perlu mentakrifkan bentuk variasi yang mewakili koleksi keadaan berparameter untuk diteroka oleh algoritma variasi kita:
Perlu diingat bahawa keadaan berparameter bergantung pada kedua-dua keadaan rujukan , yang tidak bergantung pada sebarang parameter, dan bentuk variasi , yang sentiasa bergantung pada parameter. Kita merujuk kepada gabungan dua bahagian ini sebagai ansatz: .
Semasa kita membina ansatz untuk mewakili koleksi keadaan berparameter bagi algoritma variasi kita, kita menyedari satu isu penting: dimensi. Sistem -Qubit (iaitu, ruang Hilbert) mempunyai bilangan keadaan kuantum yang sangat banyak dalam ruang konfigurasi. Kita memerlukan bilangan parameter yang sangat besar untuk menerokai keseluruhannya. Secara kuantitatif, dimensinya ialah . Lebih teruk lagi, kerumitan masa operasi algoritma carian, dan yang seumpamanya, berkembang secara eksponen dengan dimensi ini, satu fenomena yang sering dirujuk dalam literatur sebagai kutukan dimensi.
Untuk mengatasi masalah ini, adalah amalan biasa untuk mengenakan beberapa kekangan yang munasabah pada bentuk variasi supaya hanya keadaan yang paling relevan sahaja diteroka. Mencari ansatz terpotong yang cekap adalah bidang penyelidikan yang aktif, tetapi kita akan membincangkan dua reka bentuk yang biasa digunakan.
Heuristic ansaetze dan pertukaran
Jika kamu tidak mempunyai sebarang maklumat tentang masalah tertentu yang boleh membantu mengehadkan dimensi, kamu boleh mencuba satu keluarga litar berparameter sewenang-wenangnya dengan kurang daripada parameter. Walau bagaimanapun, terdapat beberapa pertukaran yang perlu dipertimbangkan:
- Kelajuan: Dengan mengurangkan ruang carian, algoritma boleh berjalan lebih cepat.
- Ketepatan: Mengurangkan ruang boleh berisiko mengecualikan penyelesaian sebenar kepada masalah, yang membawa kepada penyelesaian yang tidak optimum.
- Hingar: Litar yang lebih dalam terjejas oleh hingar, jadi kita perlu bereksperimen dengan sambungan, gate-gate, dan kesetiaan gate ansatz kita.
Terdapat pertukaran asas antara kualiti (atau bahkan kebolehselesaian) dan kelajuan: lebih banyak parameter, lebih besar kemungkinan kamu akan menemui hasil yang tepat, tetapi lebih lama masa yang diperlukan untuk menjalankan algoritma.
Litar N-lokal
Salah satu contoh heuristic ansaetze yang paling banyak digunakan ialah litar N-lokal, atas beberapa sebab:
- Pelaksanaan yang cekap: Ansatz N-lokal biasanya terdiri daripada gate-gate lokal yang mudah dan boleh dilaksanakan dengan cekap pada komputer kuantum, menggunakan bilangan Qubit fizikal yang kecil. Ini memudahkan pembinaan dan pengoptimuman litar kuantum.
- Menangkap korelasi penting: Ansatz N-lokal boleh menangkap korelasi penting antara Qubit-Qubit dalam sistem kuantum, walaupun dengan bilangan gate yang kecil. Ini kerana gate-gate lokal boleh bertindak pada Qubit-Qubit bersebelahan dan mencipta keterikatan antara mereka, yang boleh menjadi penting untuk mensimulasikan sistem kuantum yang kompleks.
Litar-litar ini terdiri daripada lapisan putaran dan lapisan keterikatan yang diulang secara berselang-seli satu atau lebih kali seperti berikut:
- Setiap lapisan dibentuk oleh gate-gate bersaiz paling banyak , di mana mesti lebih rendah daripada bilangan Qubit.
- Untuk lapisan putaran, gate-gate ditindih di atas antara satu sama lain. Kita boleh menggunakan operasi putaran standard, seperti
RXatauCRZ. - Untuk lapisan keterikatan, kita boleh menggunakan gate-gate seperti gate
ToffoliatauCXdengan strategi keterikatan. - Kedua-dua jenis lapisan boleh berparameter atau tidak, tetapi sekurang-kurangnya satu daripadanya perlu mengandungi parameter. Jika tidak, tanpa sekurang-kurangnya satu parameter, tidak akan ada sebarang variasi!
- Secara pilihan, lapisan putaran tambahan ditambah pada penghujung litar.
Sebagai contoh, mari kita cipta litar NLocal lima-Qubit dengan blok putaran yang dibentuk oleh gate-gate RX dan CRZ, blok keterikatan yang dibentuk oleh gate Toffoli yang bertindak pada Qubit , , dan dan pengulangan bagi setiap lapisan.
from qiskit.circuit.library import NLocal, CCXGate, CRZGate, RXGate
from qiskit.circuit import Parameter
theta = Parameter("θ")
ansatz = NLocal(
num_qubits=5,
rotation_blocks=[RXGate(theta), CRZGate(theta)],
entanglement_blocks=CCXGate(),
entanglement=[[0, 1, 2], [0, 2, 3], [4, 2, 1], [3, 1, 0]],
reps=2,
insert_barriers=True,
)
ansatz.decompose().draw("mpl")
Dalam contoh di atas, gate terbesar ialah gate Toffoli, yang bertindak pada tiga Qubit, menjadikan litar tersebut -lokal. Jenis litar -lokal yang paling kerap digunakan ialah litar -lokal dengan gate putaran satu-Qubit dan gate keterikatan -Qubit.
Mari kita cipta litar -lokal menggunakan kelas TwoLocal Qiskit. Sintaksnya sama dengan NLocal, tetapi ada beberapa perbezaan. Contohnya, kebanyakan gate, seperti RX, RZ, dan CNOT, boleh dihantar sebagai rentetan tanpa mengimport gate-gate atau mencipta contoh Parameter.
from qiskit.circuit.library import TwoLocal
ansatz = TwoLocal(
num_qubits=5,
rotation_blocks=["rx", "rz"],
entanglement_blocks="cx",
entanglement="linear",
reps=2,
insert_barriers=True,
)
ansatz.decompose().draw("mpl")
Dalam kes ini, kita menggunakan taburan keterikatan linear, di mana setiap Qubit diikat dengan Qubit seterusnya. Untuk mengetahui strategi lain, rujuk dokumentasi TwoLocal.
Efficient SU2
efficient_su2 ialah litar yang cekap dari segi perkakasan yang terdiri daripada lapisan operasi satu-Qubit yang merentangi SU(2) dan keterikatan CX. Ini adalah corak heuristik yang boleh digunakan untuk menyediakan fungsi gelombang percubaan bagi algoritma kuantum variasi atau sebagai Circuit pengelasan untuk pembelajaran mesin.
from qiskit.circuit.library import efficient_su2
ansatz = efficient_su2(4, su2_gates=["rx", "y"], entanglement="linear", reps=1)
ansatz.decompose().draw("mpl")
Ansaetze khusus masalah
Walaupun heuristic ansaetze dan ansaetze cekap perkakasan membantu kita menyelesaikan masalah secara naif, kita boleh menggunakan pengetahuan khusus masalah untuk mengehadkan ruang carian litar kita kepada jenis tertentu. Ini akan membantu kita mendapatkan kelajuan tanpa kehilangan ketepatan dalam proses carian kita.
Pengoptimuman
Dalam masalah max-cut, kita ingin membahagikan nod graf dengan cara yang memaksimumkan bilangan tepi antara nod dalam kumpulan yang berbeza. Pembahagian max-cut yang dikehendaki untuk graf di bawah adalah jelas: nod ke-0 di sebelah kiri harus dipisahkan dari baki nod di sebelah kanan oleh satu potongan.
import rustworkx as rx
from rustworkx.visualization import mpl_draw
n = 4
G = rx.PyGraph()
G.add_nodes_from(range(n))
# The edge syntax is (start, end, weight)
edges = [(0, 1, 1.0), (0, 2, 1.0), (0, 3, 1.0), (1, 2, 1.0), (2, 3, 1.0)]
G.add_edges_from(edges)
mpl_draw(
G, pos=rx.shell_layout(G), with_labels=True, edge_labels=str, node_color="#1192E8"
)
Untuk menggunakan algoritma QAOA bagi masalah max-cut, kita memerlukan Hamiltonian Pauli yang mengekodkan kos sedemikian rupa sehingga nilai jangkaan minimum operator sepadan dengan bilangan maksimum tepi antara nod dalam dua kumpulan yang berbeza.
Untuk contoh mudah ini, operatornya ialah gabungan linear bagi sebutan dengan operator Z pada nod yang dihubungkan oleh tepi (ingat bahawa Qubit ke-0 berada paling jauh ke kanan): . Setelah operator dibina, ansatz untuk algoritma QAOA boleh dengan mudah dibina menggunakan Circuit QAOAAnsatz dari perpustakaan Circuit Qiskit.
# Pre-defined ansatz circuit, operator class and visualization tools
from qiskit.circuit.library import QAOAAnsatz
from qiskit.quantum_info import SparsePauliOp
# Problem to Hamiltonian operator
hamiltonian = SparsePauliOp.from_list(
[("ZZII", 1), ("IZZI", 1), ("ZIIZ", 1), ("IZIZ", 1), ("IIZZ", 1)]
)
# QAOA ansatz circuit
ansatz = QAOAAnsatz(hamiltonian, reps=2)
# Draw
ansatz.decompose(reps=3).draw("mpl")
Imej sebelumnya menggambarkan ansatz dalam gate asas untuk kejelasan. Walau bagaimanapun, ia boleh dinyatakan dalam pelbagai peringkat penguraian dengan mengubah argumen reps atau dengan melukis litar tanpa kaedah decompose. Sebagai contoh, representasi berikut secara langsung menunjukkan struktur QAOA dengan nilai reps lalai, iaitu reps=1.
ansatz.decompose(reps=2).draw("mpl")
Pembelajaran Mesin Kuantum
Dalam pembelajaran mesin, aplikasi yang biasa ialah pengelasan data ke dalam dua atau lebih kategori. Ini melibatkan pengekodkan titik data ke dalam peta ciri yang memetakan vektor ciri klasik ke dalam ruang Hilbert kuantum. Membina peta ciri kuantum berdasarkan litar kuantum berparameter yang sukar untuk disimulasikan secara klasik adalah langkah penting ke arah mendapatkan kelebihan potensial berbanding pendekatan pembelajaran mesin klasik dan merupakan bidang penyelidikan semasa yang aktif.
zz_feature_map boleh digunakan untuk mencipta litar berparameter. Kita boleh memasukkan titik data kita ke dalam peta ciri () dan bentuk variasi berasingan untuk memasukkan pemberat sebagai parameter ().
from qiskit.circuit.library import zz_feature_map, TwoLocal
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)
variation_form = TwoLocal(2, ["ry", "rz"], "cz", reps=2)
vqc_ansatz = zz_feature_map_reference.compose(variation_form)
vqc_ansatz.decompose().draw("mpl")
Ringkasan
Dengan pelajaran ini, kamu telah belajar cara mentakrifkan ruang carian kamu dengan bentuk variasi:
- Sediakan keadaan dengan litar kuantum berparameter, di mana gate-gate ditakrifkan dengan parameter yang boleh dilaras
- Cara membina ansaetze yang mengimbangi antara kelajuan dan ketepatan
- Heuristic ansaetze
- Ansaetze khusus masalah
Beban kerja variasi peringkat tinggi kita kelihatan seperti berikut:
Bagi setiap parameter variasi , keadaan kuantum yang berbeza akan dihasilkan. Untuk mencari parameter yang optimum, kita perlu mentakrifkan fungsi kos khusus masalah untuk mengemas kini parameter ansatz kita secara berulang.