Lumaktaw sa pangunahing nilalaman

Ang ansatz

Panoorin si Victoria Lipinska habang ipinapaliwanag niya kung ano ang isang ansatz at kung bakit ito mahalaga sa konteksto ng variational quantum eigensolver (VQE).

Mga Sanggunian​

Ang mga sumusunod na artikulo ay binanggit sa video sa itaas.

Code ng ansatz​

Sa nakaraang aralin, gumawa ka ng isang Hamiltonian na naglalarawan ng enerhiya ng molecule na iyong pinag-aaralan, at ini-map ito sa isang format na kapaki-pakinabang para sa isang quantum computer. Gumagamit ang VQE ng isang variational circuit para maghanda ng mga quantum state. Ginagamit natin ang mga state na iyon para matukoy ang expectation value ng Hamiltonian (ang enerhiya). Ang mga parameter sa variational circuit ay binabago hanggang sa mag-converge ang kalkulasyon sa isang minimum na expectation value. Sa konteksto ng quantum chemistry, ito dapat ay ang ground state energy. Ang araling ito ay nakatuon sa variational circuit, na tinatawag ding ansatz (isang salitang Aleman na nangangahulugang "diskarte" o "pamamaraan"). Sa araling ito, matututunan mo ang

  • ang hanay ng mga pre-made na ansaetze na available sa circuit library
  • Kung paano itakda o baguhin ang mga katangian ng isang ansatz
  • Kung paano gumawa ng sariling ansatz
  • mga halimbawa ng mabuti at masamang ansaetze

Ang Qiskit circuit library ay may maraming kategorya ng mga circuit na maaaring gamitin bilang ansatz. Dito, ilililmita natin ang talakayan sa two-local circuits (mga circuit na binubuo ng mga gate na kumikilos sa, pinakamarami, dalawang qubit sa isang pagkakataon). Ang Efficient SU2 ay isang karaniwang ginagamit na ansatz.

Ang isang efficient_su_2 circuit ay binubuo ng mga layer ng single qubit operations na sinasaklaw ng SU(2) (special unitary group ng degree 2, tulad ng Pauli rotation gates) at CX entanglements. Ito ay isang heuristic pattern na maaaring maging kapaki-pakinabang sa mga variational quantum algorithm tulad ng VQE at classification circuits sa quantum machine learning (QML).

Magsisimula tayo sa isang four-qubit na halimbawa ng efficient_su2 circuit na may dalawang uri ng SU(2) gates, halimbawa rx at y. Tutukuyin din natin ang entanglement scheme at ang bilang ng mga repetition. Kung gagamitin mo lang ang .draw() sa mga circuit, makakakuha ka ng medyo abstract na representasyon. Mas madaling maintindihan ang circuit diagram sa pamamagitan ng .decompose().draw(), at dito gagamitin natin ang 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

Ang mga SU(2) gate ay lumalabas sa simula at sa dulo ayon sa pagkakasunud-sunod at mga elemento na tinukoy sa su2_gates = [...]. Ang entanglement scheme na linear ay nangangahulugang ang mga CX gate ay dumadaan sa mga naka-number na qubit, nag-e-entangle ng 0 at 1, tapos 1 at 2, at iba pa, pababa sa isang diagonal na linya sa circuit. Gaya ng inaasahan, ang pagtakda ng reps = 2 ay nagdaragdag lang ng isang entanglement layer at isang panghuling SU(2) layer. Ang reps = n ay tumutugma sa n na entanglement layers, na may mga SU(2) layer sa pagitan nila at sa bawat dulo.

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

May ilang iba pang entanglement scheme. Dalawa ang kapansin-pansin: circular at full. Ang circular entanglement ay katulad ng linear entanglement, ngunit may karagdagang CX gate na nag-e-entangle sa unang at huling qubit. Ang full entanglement scheme ay may kasamang CX gate sa pagitan ng bawat pares ng qubit. Tandaan na para sa isang N-qubit circuit, ito ay N(Nβˆ’1)/2N(N-1)/2 na CXCX gates, at maaaring maging mahal sa computational cost.

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

Maaari mong subaybayan ang depth ng iyong circuit gamit ang .depth(), o kung minsan ay .decompose().depth().

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

Ang isang generalization ng efficient_su2 ay ang two-local circuit, na ito naman ay isang espesyal na kaso ng n-local circuits. Naglalaman din ang mga two-local circuit ng mga SU(2) block (o rotation block) at entanglement block. Dito, malaya tayong tukuyin ang uri ng entanglement gates na nais nating gamitin, halimbawa ang mga CRX gate. Sa halimbawang ito, lahat ng gate ay tumatanggap ng parameter, ngunit hindi ito palaging kailangan. Maaari ring gumamit ng Y rotation gates at CX entanglement gates, halimbawa.

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

Ang huling ansatz na tatalakayin natin ayon sa pangalan ay ang Pauli-two-design. Ang circuit na ito ay naglalaman ng isang paunang rotation na RY(pi/4)RY(pi/4), at ang mga rotation layer ay naglalaman ng mga single qubit Pauli rotation, kung saan ang axis ay pinili nang pantay-pantay sa random mula sa X, Y, o Z. Ang mga entanglement layer ay binubuo ng mga pairwise CZ gates na may kabuuang depth na dalawa. Tandaan ang pagkakaiba sa entanglement (at kabuuang circuit) depth sa pagitan ng pauli_two_design na ito at, halimbawa, ng 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

Ang mga pre-made na variational circuit na ito ay kapaki-pakinabang na mga heuristic β€” kapwa sa pagkamit ng nais na antas ng entanglement at sa paglilimita ng circuit depth. Ngunit walang espesyal na magic sa kanila. Malaya kang gumawa ng sarili mong variational circuit. Sa katunayan, maaaring mas maabante iyon sa mga kaso kung saan alam mo ang kaunti tungkol sa entanglement ng target state ng iyong sistema.

Para gumawa ng sarili mong ansatz, kailangan mo lang bumuo ng quantum circuit kung saan ang ilang subset ng mga gate ay mga function ng mga elemento ng isang parameter vector ("theta" sa three-qubit na halimbawa sa ibaba).

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

Sa pangkalahatan, ang pagpili ng pinakamainam na ansatz ay isang sining; ang pinakamainam na ansatz ay ang anumang ansatz na tumutulong sa iyo na maabot ang iyong target sa pinakamaliit na bilang ng optimization step. Mas madaling tukuyin ang mga ansaetze na malamang na magiging masamang pagpipilian. Halimbawa, ang mas malalim na circuit depth ay karaniwang nagdudulot ng akumulasyon ng mga error. Ang error mitigation ay makakatulong dito, ngunit magandang gawi na panatilihing mababa ang circuit depth hanggang sa makatwiran. Ngunit huwag alisin ang entanglement na kinakailangan. Maaari kang magkaroon ng target state na nangangailangan ng full entanglement scheme. Dalawang halimbawa ang ipinapakita sa ibaba na malamang na magiging masamang pagpipilian para sa halatang mga dahilan. Ang pagpili ng magandang ansatz ay babalikan sa mga susunod na seksyon sa konteksto ng mga convergence test.

Ang unang circuit na ito ay malamang na magiging masamang pagpipilian dahil ang huling qubit ay hindi na-entangle sa iba sa lahat. Sa katunayan, walang computationally meaningful na aksyon sa huling qubit. Malamang, ang huling qubit ay dapat na either na-entangle sa iba o inalis sa kalkulasyon.

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

Ang huling circuit na ito ay malamang na masamang pagpipilian, dahil napakataas ng gate depth, at ang pag-uulit ng entanglement layer nang apat na beses ay hindi malamang na magbigay ng mas magandang pagkatugma sa target state kaysa sa dalawa o tatlong repetition.

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

Ang mga circuit na ito ay hindi "kumpleto" sa kahulugang mayroon pa ring hindi alam at variable na mga parameter na ilalagay sa marami sa mga gate. Ang mga parameter na iyon ay pinipili sa pamamagitan ng sunud-sunod na mga hula, at pina-update ang mga parameter para mapababa ang expectation value ng cost function (sa konteksto ng chemistry, karaniwang ang ground state energy). Sa isa, o kahit ilang dimensyon, ito ay madali. Ngunit ang circuit sa itaas ay may 20 variational parameters, ibig sabihin ang paghahanap ng target state na may pinakamababang enerhiya ay nangangailangan ng paghahanap sa isang 20-dimensional na state (isa pang dahilan para huwag isama ang mga hindi kinakailangang circuit gate). Dito pumapasok ang mga classical optimization algorithm, at iyon ang paksa ng susunod na aralin.