Ansaetze dan variational form
Di inti semua algoritma variasional terletak ide kunci untuk menganalisis perbedaan antara keadaan-keadaan, yang secara nyaman terhubung melalui pemetaan yang berperilaku baik (misalnya, kontinu, terdiferensialkan) dari sekumpulan parameter atau variabel — karenanya namanya.
Pertama, kita akan menjelajahi cara membangun parameterized circuit dengan tangan. Kita akan menggunakan circuit-circuit ini untuk mendefinisikan variational form yang merepresentasikan kumpulan keadaan berparameter untuk dijelajahi oleh algoritma variasional kita. Kemudian, kita akan membangun ansatz kita dengan menerapkan variational form ini pada reference state kita.
Kita juga akan menjelajahi cara menyeimbangkan kecepatan versus akurasi saat menjelajahi ruang pencarian ini.
Parameterized Quantum Circuit
Algoritma variasional beroperasi dengan menjelajahi dan membandingkan berbagai keadaan kuantum , yang bergantung pada himpunan terbatas parameter . Keadaan-keadaan ini dapat disiapkan menggunakan parameterized quantum circuit, di mana gate didefinisikan dengan parameter yang dapat disetel. Dimungkinkan untuk membuat parameterized circuit ini tanpa mengikat sudut spesifik terlebih 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"))
Variational Form dan Ansatz
Untuk mengiterasi secara optimal dari reference state ke keadaan target , kita perlu mendefinisikan variational form yang merepresentasikan kumpulan keadaan berparameter untuk dijelajahi oleh algoritma variasional kita:
Perhatikan bahwa keadaan berparameter bergantung pada reference state , yang tidak bergantung pada parameter mana pun, dan variational form , yang selalu bergantung pada parameter. Kita menyebut kombinasi dari dua bagian ini sebagai ansatz: .
Saat kita membangun ansatz kita untuk merepresentasikan kumpulan keadaan berparameter untuk dijelajahi oleh algoritma variasional kita, kita menyadari masalah penting: dimensionalitas. Sistem -qubit (yaitu, ruang Hilbert) memiliki sejumlah besar keadaan kuantum yang berbeda dalam ruang konfigurasi. Kita akan memerlukan sejumlah parameter yang tidak praktis untuk menjelajahinya sepenuhnya. Secara kuantitatif, dimensionalitasnya adalah . Memperburuk keadaan, kompleksitas runtime dari algoritma pencarian, dan yang serupa, tumbuh secara eksponensial dengan dimensionalitas ini, fenomena yang sering disebut dalam literatur sebagai kutukan dimensionalitas.
Untuk mengatasi kemunduran ini, adalah praktik umum untuk menerapkan beberapa batasan yang wajar pada variational form sehingga hanya keadaan yang paling relevan yang dijelajahi. Menemukan ansatz yang terpotong secara efisien adalah area penelitian aktif, tetapi kita akan membahas dua desain umum.
Heuristic ansaetze dan trade-off
Jika kamu tidak memiliki informasi tentang masalah khususmu yang dapat membantu membatasi dimensionalitas, kamu bisa mencoba keluarga circuit berparameter sembarang dengan kurang dari parameter. Namun ada beberapa trade-off yang perlu dipertimbangkan:
- Kecepatan: Dengan mengurangi ruang pencarian, algoritma dapat berjalan lebih cepat.
- Akurasi: Mengurangi ruang dapat berisiko mengecualikan solusi aktual dari masalah, yang menghasilkan solusi suboptimal.
- Kebisingan: Circuit yang lebih dalam terpengaruh oleh kebisingan, sehingga kita perlu bereksperimen dengan konektivitas, gate, dan fidelitas gate ansatz kita.
Ada trade-off fundamental antara kualitas (atau bahkan kemampuan penyelesaian) dan kecepatan: semakin banyak parameter, semakin besar kemungkinan kamu menemukan hasil yang tepat, tetapi semakin lama waktu yang dibutuhkan untuk menjalankan algoritma.
N-local circuit
Salah satu contoh heuristic ansaetze yang paling banyak digunakan adalah N-local circuits, karena beberapa alasan:
- Implementasi yang efisien: Ansatz N-local biasanya terdiri dari gate lokal sederhana yang dapat diimplementasikan secara efisien pada komputer kuantum, menggunakan sejumlah kecil qubit fisik. Ini membuatnya lebih mudah untuk membangun dan mengoptimalkan quantum circuit.
- Menangkap korelasi penting: Ansatz N-local dapat menangkap korelasi penting antara qubit dalam sistem kuantum, bahkan dengan sejumlah kecil gate. Ini karena gate lokal dapat bekerja pada qubit yang berdekatan dan menciptakan keterikatan di antara mereka, yang dapat penting untuk mensimulasikan sistem kuantum yang kompleks.
Circuit ini terdiri dari lapisan rotasi dan keterikatan yang diulang secara bergantian satu atau lebih kali sebagai berikut:
- Setiap lapisan dibentuk oleh gate berukuran paling banyak , di mana harus lebih rendah dari jumlah qubit.
- Untuk lapisan rotasi, gate ditumpuk di atas satu sama lain. Kita dapat menggunakan operasi rotasi standar, seperti
RXatauCRZ. - Untuk lapisan keterikatan, kita dapat menggunakan gate seperti gate
ToffoliatauCXdengan strategi keterikatan. - Kedua jenis lapisan dapat diparameterisasi atau tidak, tetapi setidaknya salah satunya harus mengandung parameter. Jika tidak, tanpa setidaknya satu parameter, tidak akan ada variasi!
- Opsional, lapisan rotasi tambahan ditambahkan ke akhir circuit.
Misalnya, mari kita buat circuit NLocal lima-qubit dengan blok rotasi yang dibentuk oleh gate RX dan CRZ, blok keterikatan yang dibentuk oleh gate Toffoli yang bekerja pada qubit , , dan dan repetisi dari 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 adalah gate Toffoli, yang bekerja pada tiga qubit, membuat circuit menjadi -local. Jenis circuit -local yang paling umum digunakan adalah circuit -local dengan gate rotasi qubit tunggal dan gate keterikatan -qubit.
Mari kita buat circuit -local menggunakan kelas TwoLocal Qiskit. Sintaksnya sama dengan NLocal, tetapi ada beberapa perbedaan. Misalnya, sebagian besar gate, seperti RX, RZ, dan CNOT, dapat dilewatkan sebagai string tanpa mengimpor gate atau membuat instance 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 kasus ini, kita menggunakan distribusi keterikatan linear, di mana setiap qubit terjerat dengan berikutnya. Untuk mempelajari tentang strategi lain, lihat dokumentasi TwoLocal.
Efficient SU2
efficient_su2 adalah circuit yang efisien secara perangkat keras yang terdiri dari lapisan operasi qubit tunggal yang merentangkan SU(2) dan keterikatan CX. Ini adalah pola heuristik yang dapat digunakan untuk menyiapkan trial wave function untuk algoritma kuantum variasional atau sebagai circuit klasifikasi untuk machine learning.
from qiskit.circuit.library import efficient_su2
ansatz = efficient_su2(4, su2_gates=["rx", "y"], entanglement="linear", reps=1)
ansatz.decompose().draw("mpl")
Problem-specific ansaetze
Sementara heuristic dan hardware efficient ansaetze membantu kita memecahkan masalah dengan cara yang naif, kita dapat menggunakan pengetahuan spesifik masalah untuk membatasi ruang pencarian circuit kita ke jenis tertentu. Ini akan membantu kita mendapatkan kecepatan tanpa kehilangan akurasi dalam proses pencarian kita.
Optimisasi
Dalam masalah max-cut, kita ingin mempartisi node grafik dengan cara yang memaksimalkan jumlah tepi antara node dalam kelompok yang berbeda. Partisi max-cut yang diinginkan untuk grafik di bawah ini jelas: node ke-0 di sebelah kiri harus dipisahkan dari node lainnya di sebelah kanan oleh 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 memanfaatkan algoritma QAOA untuk masalah max-cut, kita memerlukan Hamiltonian Pauli yang mengkodekan biaya sedemikian sehingga nilai ekspektasi minimum dari operator bersesuaian dengan jumlah maksimum tepi antara node dalam dua kelompok yang berbeda.
Untuk contoh sederhana ini, operatornya adalah kombinasi linear dari suku dengan operator Z pada node yang terhubung oleh tepi (ingat bahwa qubit ke-0 paling jauh ke kanan): . Setelah operator dibangun, ansatz untuk algoritma QAOA dapat dengan mudah dibangun menggunakan circuit QAOAAnsatz dari circuit library 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")
Gambar sebelumnya mengilustrasikan ansatz dalam gate dasar untuk kejelasan. Namun, ini dapat diekspresikan dalam beberapa tingkat dekomposisi dengan mengubah argumen reps atau dengan menggambar circuit tanpa metode decompose. Misalnya, representasi berikut langsung menampilkan struktur QAOA dengan nilai reps default, yaitu reps=1.
ansatz.decompose(reps=2).draw("mpl")
Quantum Machine Learning
Dalam machine learning, aplikasi umum adalah klasifikasi data ke dalam dua atau lebih kategori. Ini melibatkan pengkodean datapoint ke dalam feature map yang memetakan vektor fitur klasik ke ruang Hilbert kuantum. Membangun quantum feature map berdasarkan parameterized quantum circuit yang sulit disimulasikan secara klasik adalah langkah penting menuju mendapatkan keunggulan potensial atas pendekatan machine learning klasik dan merupakan area penelitian aktif saat ini.
zz_feature_map dapat digunakan untuk membuat parameterized circuit. Kita dapat memasukkan datapoint kita ke feature map () dan variational form terpisah untuk memasukkan bobot 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 mempelajari cara mendefinisikan ruang pencarianmu dengan variational form:
- Siapkan keadaan dengan parameterized quantum circuit, di mana gate didefinisikan dengan parameter yang dapat disetel
- Cara membangun ansaetze yang menyeimbangkan kecepatan vs akurasi
- Heuristic ansaetze
- Problem-specific ansaetze
Beban kerja variasional tingkat tinggi kita terlihat sebagai berikut:
Untuk setiap parameter variasional , keadaan kuantum yang berbeda akan dihasilkan. Untuk menemukan parameter optimal, kita perlu mendefinisikan fungsi biaya yang spesifik masalah untuk memperbarui parameter ansatz kita secara iteratif.