Lewati ke konten utama

Ansatz

Saksikan Victoria Lipinska menjelaskan apa itu ansatz dan mengapa kita peduli tentangnya dalam konteks variational quantum eigensolver (VQE).

Referensi​

Artikel-artikel berikut dirujuk dalam video di atas.

Kode Ansatz​

Pada pelajaran sebelumnya kamu membuat sebuah Hamiltonian yang menggambarkan energi molekul yang kamu minati, dan memetakannya ke format yang berguna untuk komputer kuantum. VQE menggunakan variational circuit untuk menyiapkan keadaan kuantum. Kita kemudian menggunakan keadaan-keadaan tersebut untuk menentukan nilai ekspektasi Hamiltonian (energi). Parameter dalam variational circuit diubah-ubah sampai kalkulasi konvergen pada nilai ekspektasi minimum. Dalam konteks kimia kuantum, ini seharusnya adalah energi ground state. Pelajaran ini berfokus pada variational circuit, yang juga disebut ansatz (kata Jerman yang berarti "pendekatan" atau "metode"). Dalam pelajaran ini kamu akan belajar

  • himpunan ansaetze yang sudah jadi yang tersedia di circuit library
  • Cara menentukan atau memodifikasi fitur dari sebuah ansatz
  • Cara membangun ansatz sendiri
  • contoh ansaetze yang baik dan buruk

Circuit library Qiskit memiliki banyak kategori circuit yang dapat digunakan sebagai ansatz. Di sini, kita akan membatasi diskusi kita pada circuit two-local (circuit yang terdiri dari gate yang bekerja pada paling banyak dua qubit sekaligus). Efficient SU2 adalah ansatz yang umum digunakan.

Circuit efficient_su_2 terdiri dari lapisan operasi qubit tunggal yang direntangkan oleh SU(2) (special unity group of degree 2, seperti gate rotasi Pauli) dan keterikatan CX. Ini adalah pola heuristik yang dapat berguna dalam algoritma kuantum variasional seperti VQE dan circuit klasifikasi dalam quantum machine learning (QML).

Kita akan mulai dengan contoh circuit efficient_su2 empat-qubit dengan dua jenis gate SU(2), misalnya rx dan y. Kita juga menentukan skema keterikatan dan jumlah repetisi. Jika kamu hanya .draw() circuit-nya, kamu akan mendapatkan representasi yang cukup abstrak. Diagram circuit yang lebih mudah dipahami diperoleh dengan menggunakan .decompose().draw(), dan di sini kita akan menggunakan `output = "mpl"'.

# Added by doQumentation β€” required packages for this notebook
!pip install -q qiskit
from qiskit.circuit.library import efficient_su2

SU2_ansatz = efficient_su2(4, su2_gates=["rx", "y"], entanglement="linear", reps=1)
print(SU2_ansatz.draw())
SU2_ansatz.decompose().draw(output="mpl")
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”β”Œβ”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”Œβ”€β”€β”€β”
q_0: ─ Rx(ΞΈ[0]) β”œβ”€ Y β”œβ”€β”€β– β”€β”€β”€ Rx(ΞΈ[4]) β”œβ”€β”€β”€β”€ Y β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”œβ”€β”€β”€β”€β”Œβ”€β”΄β”€β”β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜β”Œβ”€β”€β”΄β”€β”€β”€β”΄β”€β”€β”€β” β”Œβ”€β”€β”€β”
q_1: ─ Rx(ΞΈ[1]) β”œβ”€ Y β”œβ”€ X β”œβ”€β”€β”€β”€β”€β– β”€β”€β”€β”€β”€β”€β”€ Rx(ΞΈ[5]) β”œβ”€β”€β”€β”€ Y β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”œβ”€β”€β”€β”€β””β”€β”€β”€β”˜ β”Œβ”€β”΄β”€β” β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜β”Œβ”€β”€β”΄β”€β”€β”€β”΄β”€β”€β”€β”β”Œβ”€β”€β”€β”
q_2: ─ Rx(ΞΈ[2]) β”œβ”€ Y β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€ X β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β– β”€β”€β”€β”€β”€β”€β”€ Rx(ΞΈ[6]) β”œβ”€ Y β”œ
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”œβ”€β”€β”€β”€ β””β”€β”€β”€β”˜ β”Œβ”€β”΄β”€β” β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”œβ”€β”€β”€β”€
q_3: ─ Rx(ΞΈ[3]) β”œβ”€ Y β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ X β”œβ”€β”€β”€β”€β”€ Rx(ΞΈ[7]) β”œβ”€ Y β”œ
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜β””β”€β”€β”€β”˜ β””β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜β””β”€β”€β”€β”˜

Output of the previous code cell

Gate SU(2) muncul di awal dan akhir dengan urutan dan elemen seperti yang ditentukan dalam su2_gates = [...]. Skema keterikatan linear berarti gate CX melangkah melalui qubit bernomor, menjalin 0 & 1, kemudian 1 & 2, dan seterusnya, ke bawah garis diagonal dalam circuit. Seperti yang mungkin kamu duga, mengatur reps = 2 hanya menambahkan lapisan keterikatan dan lapisan SU(2) akhir. Pengaturan reps = n bersesuaian dengan n lapisan keterikatan, dengan lapisan SU(2) di antara keduanya dan di setiap ujungnya.

SU2_ansatz2 = efficient_su2(
4, su2_gates=["rx", "y", "z"], entanglement="linear", reps=2
)
SU2_ansatz2.decompose().draw(output="mpl")

Output of the previous code cell

Ada beberapa skema keterikatan lainnya. Dua yang layak diperhatikan adalah circular dan full. Keterikatan circular identik dengan keterikatan linear, tetapi dengan gate CX tambahan yang menjalin qubit pertama dan terakhir. Skema keterikatan full mencakup gate CX antara setiap pasang qubit. Perhatikan bahwa untuk circuit N-qubit, ini adalah N(Nβˆ’1)/2N(N-1)/2 gate CXCX, dan bisa menjadi mahal secara komputasi.

SU2_ansatz3 = efficient_su2(
4, su2_gates=["rx", "y", "z"], entanglement="circular", reps=1
)
SU2_ansatz3.decompose().draw(output="mpl")

Output of the previous code cell

SU2_ansatz4 = efficient_su2(4, su2_gates=["rx", "y", "z"], entanglement="full", reps=1)
SU2_ansatz4.decompose().draw(output="mpl")

Output of the previous code cell

Kamu bisa memantau kedalaman circuit dengan menggunakan .depth(), atau terkadang .decompose().depth().

print(SU2_ansatz4.decompose().depth())
11

Generalisasi dari efficient_su2 adalah circuit two-local, yang itu sendiri merupakan kasus khusus dari n-local circuits. Circuit two-local juga mengandung blok SU(2) (atau blok rotasi) dan blok keterikatan. Di sini, kita bebas menentukan jenis gate keterikatan yang ingin kita gunakan, misalnya gate CRX. Dalam contoh ini, semua gate menerima parameter, tetapi itu tidak harus demikian. Seseorang bisa menggunakan gate rotasi Y dan gate keterikatan CX, misalnya.

from qiskit.circuit.library import n_local

rotation_blocks = ["ry"]
entanglement_blocks = ["crx"]
two_ansatz = n_local(
4, rotation_blocks, entanglement_blocks, "linear", insert_barriers=True, reps=2
)
two_ansatz.decompose().draw(output="mpl")

Output of the previous code cell

Ansatz terakhir yang akan kita bahas namanya adalah Pauli-two-design. Circuit ini mengandung rotasi awal RY(pi/4)RY(pi/4), dan lapisan rotasi mengandung rotasi Pauli qubit tunggal, di mana sumbu dipilih secara seragam secara acak menjadi X, Y, atau Z. Lapisan keterikatan terdiri dari gate CZ berpasangan dengan total kedalaman dua. Perhatikan perbedaan dalam keterikatan (dan total circuit) kedalaman antara pauli_two_design ini dan, misalnya, efficient_su2.

from qiskit.circuit.library import pauli_two_design

PtwoD_ansatz = pauli_two_design(5, reps=1, seed=10599, insert_barriers=True)
PtwoD_ansatz.decompose().draw(output="mpl")

Output of the previous code cell

Circuit yang sudah jadi ini berguna sebagai heuristik baik dalam hal mencapai tingkat keterikatan yang diinginkan maupun dalam membatasi kedalaman circuit. Tetapi tidak ada yang ajaib tentang keduanya. Kamu bebas membuat variational circuit sendiri. Memang itu mungkin menguntungkan dalam kasus di mana kamu mengetahui sesuatu tentang keterikatan dari keadaan target sistemmu.

Untuk membuat ansatz sendiri, kamu cukup membangun quantum circuit dengan beberapa subset gate yang merupakan fungsi dari elemen vektor parameter ("theta" dalam contoh tiga-qubit di bawah ini).

from qiskit import QuantumCircuit
from qiskit.circuit import ParameterVector

n = 3

theta = ParameterVector("ΞΈ", length=n)
qc = QuantumCircuit(n)
qc.h(0)
qc.h(2)
for i in range(n - 1):
qc.cx(i, i + 1)
qc.cz(0, n - 1)
qc.barrier()
for i in range(n):
qc.ry(theta[i], i)
qc.barrier()
qc.cz(0, n - 1)
for i in reversed(range(n - 1)):
qc.cx(i, i + 1)
qc.h(0)
qc.h(1)
own_ansatz = qc
print(own_ansatz.depth())
qc.draw("mpl")
9

Output of the previous code cell

Secara umum, memilih ansatz terbaik adalah sebuah seni; ansatz terbaik adalah ansatz mana pun yang membantu kamu mencapai target dalam langkah optimisasi paling sedikit. Lebih mudah untuk mengidentifikasi ansaetze yang kemungkinan buruk. Misalnya, kedalaman circuit yang lebih besar cenderung menghasilkan akumulasi kesalahan. Mitigasi kesalahan dapat membantu ini, tetapi merupakan praktik yang baik untuk menjaga kedalaman circuit serendah yang masuk akal. Tapi jangan lewatkan keterikatan yang diperlukan. Kamu mungkin memiliki keadaan target yang memerlukan skema keterikatan penuh. Dua contoh ditampilkan di bawah ini yang kemungkinan menjadi pilihan buruk karena alasan yang cukup jelas. Memilih ansatz yang baik akan ditinjau kembali di bagian selanjutnya dalam konteks uji konvergensi.

Circuit pertama ini kemungkinan menjadi pilihan buruk karena qubit terakhir sama sekali tidak terjerat dengan yang lainnya. Memang tidak ada aksi yang bermakna secara komputasi pada qubit terakhir. Kemungkinan besar, qubit terakhir seharusnya baik terjerat dengan yang lainnya atau dihapus dari kalkulasi.

n = 4

theta = ParameterVector("ΞΈ", length=n)
qc = QuantumCircuit(n)
qc.h(0)
qc.h(2)
for i in range(n - 2):
qc.cx(i, i + 1)
qc.cz(0, n - 2)
qc.barrier()
for i in range(n):
qc.ry(theta[i], i)
qc.barrier()
qc.cz(0, n - 2)
for i in reversed(range(n - 2)):
qc.cx(i, i + 1)
qc.h(0)
qc.h(1)
own_ansatz2 = qc
print(own_ansatz2.depth())
qc.draw("mpl")
9

Output of the previous code cell

Circuit terakhir ini kemungkinan pilihan yang buruk, karena kedalaman gate sangat tinggi, dan mengulang lapisan keterikatan empat kali tidak mungkin menghasilkan kecocokan yang jauh lebih baik dengan keadaan target dibandingkan dua atau tiga repetisi.

su2_ansatz_long = efficient_su2(
4, su2_gates=["rx", "y", "z"], entanglement="linear", reps=4
)
print(su2_ansatz_long.decompose().depth())
su2_ansatz_long.decompose().draw(output="mpl")
24

Output of the previous code cell

Circuit-circuit ini tidak "lengkap" dalam arti bahwa masih ada parameter yang tidak diketahui dan variabel yang harus dimasukkan ke banyak gate. Parameter-parameter tersebut dipilih dengan membuat tebakan berturut-turut, dan memperbarui parameter untuk menurunkan nilai ekspektasi fungsi biaya (dalam konteks kimia, biasanya energi ground state). Dalam satu, atau bahkan beberapa dimensi, ini sangat mudah. Tetapi circuit di atas memiliki 20 parameter variasional, artinya menemukan keadaan target dengan energi minimal berarti mencari keadaan 20-dimensi (alasan lain untuk tidak memasukkan gate circuit yang tidak perlu). Di sinilah algoritma pengoptimalan klasik berperan, dan itulah subjek pelajaran berikutnya.

Source: IBM Quantum docs β€” updated 9 Feb 2026
English version on doQumentation β€” updated 7 Mei 2026
This translation based on the English version of approx. 27 Mar 2026