ข้ามไปยังเนื้อหาหลัก

Ansaetze และรูปแบบ variational

แกนกลางของอัลกอริทึม variational ทุกตัวคือแนวคิดสำคัญในการวิเคราะห์ความแตกต่างระหว่างสถานะ ซึ่งเชื่อมโยงกันอย่างสะดวกผ่านการแมปที่มีพฤติกรรมดี (เช่น ต่อเนื่อง หาอนุพันธ์ได้) จากชุดพารามิเตอร์หรือตัวแปร ซึ่งเป็นที่มาของชื่อ

ก่อนอื่น เราจะสำรวจวิธีสร้าง Circuit แบบมีพารามิเตอร์ด้วยมือ เราจะใช้ Circuit เหล่านี้เพื่อกำหนด variational form ที่แทนชุดของสถานะแบบมีพารามิเตอร์สำหรับอัลกอริทึม variational ของเราในการสำรวจ จากนั้นเราจะสร้าง ansatz โดยการนำ variational form นี้ไปใช้กับ reference state ของเรา

เราจะสำรวจวิธีแลกเปลี่ยนระหว่างความเร็วและความแม่นยำในการสำรวจพื้นที่การค้นหานี้ด้วย

A diagram showing key components of the ansatz discussion, including heuristic ansaetze and problem-specific ansaetze.

Quantum Circuit แบบมีพารามิเตอร์

อัลกอริทึม variational ทำงานโดยการสำรวจและเปรียบเทียบช่วงของสถานะเชิงควอนตัม ψ(θ)|\psi(\vec{\theta})\rangle ซึ่งขึ้นอยู่กับชุดพารามิเตอร์จำนวนจำกัด kk ตัว คือ θ=(θ0,,θk1)\vec{\theta} = (\theta^0, \ldots, \theta^{k-1}) สถานะเหล่านี้สามารถเตรียมได้โดยใช้ Circuit ควอนตัมแบบมีพารามิเตอร์ โดย Gate ถูกกำหนดด้วยพารามิเตอร์ที่ปรับได้ สามารถสร้าง Circuit แบบมีพารามิเตอร์นี้โดยไม่ต้องผูกมุมที่ระบุก่อน:

# 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")

Output of the previous code cell

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"))

Output of the previous code cell

Output of the previous code cell

Variational Form และ Ansatz

เพื่อปรับแต่งซ้ำจาก reference state ρ|\rho\rangle ไปยังสถานะเป้าหมาย ψ(θ)|\psi(\vec\theta)\rangle เราต้องกำหนด variational form UV(θ)U_V(\vec{\theta}) ที่แทนชุดของสถานะแบบมีพารามิเตอร์สำหรับอัลกอริทึม variational ของเราในการสำรวจ:

0URUR0=ρUV(θ)UA(θ)0=UV(θ)UR0=UV(θ)ρ=ψ(θ)\begin{aligned} |0\rangle \xrightarrow{U_R} U_R|0\rangle & = |\rho\rangle \xrightarrow{U_V(\vec{\theta})} U_A(\vec{\theta})|0\rangle \\[1mm] & = U_V(\vec{\theta})U_R|0\rangle \\[1mm] & = U_V(\vec{\theta})|\rho\rangle \\[1mm] & = |\psi(\vec{\theta})\rangle \\[1mm] \end{aligned}

โปรดสังเกตว่าสถานะแบบมีพารามิเตอร์ขึ้นอยู่กับทั้ง reference state ρ|\rho\rangle ซึ่งไม่ขึ้นอยู่กับพารามิเตอร์ใด และ variational form UV(θ)U_V(\vec{\theta}) ซึ่งขึ้นอยู่กับพารามิเตอร์เสมอ เราเรียกการรวมกันของสองส่วนนี้ว่า ansatz: UA(θ):=UV(θ)URU_A(\vec\theta) := U_V(\vec\theta)U_R

ขณะที่เราสร้าง ansatz เพื่อแทนชุดของสถานะแบบมีพารามิเตอร์สำหรับอัลกอริทึม variational ในการสำรวจ เราพบปัญหาสำคัญ: มิติของปัญหา ระบบ nn-Qubit (หรือ Hilbert space) มีสถานะควอนตัมที่แตกต่างกันมากมายในพื้นที่การกำหนดค่า เราจะต้องใช้พารามิเตอร์จำนวนมากมายในการสำรวจอย่างครบถ้วน ในเชิงปริมาณ มิติของมันคือ D=22nD = 2^{2n} ยิ่งไปกว่านั้น ความซับซ้อนของรันไทม์ของอัลกอริทึมการค้นหาและอื่น ๆ เติบโตแบบเอกซ์โพเนนเชียลตามมิตินี้ ซึ่งเป็นปรากฏการณ์ที่มักเรียกในวรรณกรรมว่า "คำสาปแห่งมิติ"

เพื่อรับมือกับข้อจำกัดนี้ จึงนิยมกำหนดข้อจำกัดที่สมเหตุสมผลบน variational form เพื่อให้สำรวจเฉพาะสถานะที่เกี่ยวข้องมากที่สุด การค้นหา ansatz แบบย่อที่มีประสิทธิภาพยังเป็นพื้นที่วิจัยที่ยังคงดำเนินอยู่ แต่เราจะครอบคลุมสองแบบที่ใช้กันทั่วไป

Heuristic ansaetze และการแลกเปลี่ยน

หากคุณไม่มีข้อมูลใด ๆ เกี่ยวกับปัญหาเฉพาะที่จะช่วยลดมิติ คุณสามารถลองใช้กลุ่มของ Circuit แบบมีพารามิเตอร์ที่มีพารามิเตอร์น้อยกว่า 22n2^{2n} ตัวตามอำเภอใจ อย่างไรก็ตาม มีการแลกเปลี่ยนที่ต้องพิจารณา:

  • ความเร็ว: การลดพื้นที่การค้นหาช่วยให้อัลกอริทึมทำงานเร็วขึ้น
  • ความแม่นยำ: การลดพื้นที่อาจเสี่ยงต่อการตัดคำตอบที่แท้จริงออก นำไปสู่วิธีแก้ปัญหาที่ไม่ดีที่สุด
  • สัญญาณรบกวน: Circuit ที่ลึกขึ้นจะได้รับผลกระทบจากสัญญาณรบกวน ดังนั้นเราต้องทดลองกับการเชื่อมต่อ Gate และความเที่ยงตรงของ Gate ใน ansatz ของเรา

มีการแลกเปลี่ยนพื้นฐานระหว่างคุณภาพ (หรือแม้แต่ความสามารถในการแก้ปัญหา) และความเร็ว: ยิ่งมีพารามิเตอร์มากขึ้น ยิ่งมีโอกาสพบผลลัพธ์ที่แม่นยำ แต่ก็ใช้เวลาในการรันอัลกอริทึมนานขึ้น

N-local circuits

หนึ่งในตัวอย่างที่ใช้กันอย่างแพร่หลายของ heuristic ansaetze คือ N-local circuits ด้วยเหตุผลหลายประการ:

  • การใช้งานที่มีประสิทธิภาพ: N-local ansatz มักประกอบด้วย Gate ง่าย ๆ แบบ local ที่สามารถนำไปใช้อย่างมีประสิทธิภาพบนคอมพิวเตอร์ควอนตัม โดยใช้ Qubit จริงจำนวนน้อย ทำให้ง่ายต่อการสร้างและปรับแต่ง Circuit ควอนตัม
  • จับความสัมพันธ์สำคัญได้: N-local ansatz สามารถจับความสัมพันธ์สำคัญระหว่าง Qubit ในระบบควอนตัมได้ แม้จะมี Gate จำนวนน้อย เนื่องจาก Gate แบบ local สามารถทำงานบน Qubit ที่อยู่ใกล้เคียงและสร้างการพัวพันระหว่างกัน ซึ่งสำคัญสำหรับการจำลองระบบควอนตัมที่ซับซ้อน

Circuit เหล่านี้ประกอบด้วยชั้น rotation และ entanglement ที่สลับกันทำซ้ำหนึ่งครั้งหรือมากกว่า ดังนี้:

  • แต่ละชั้นประกอบด้วย Gate ขนาดไม่เกิน NN โดย NN ต้องน้อยกว่าจำนวน Qubit
  • สำหรับชั้น rotation Gate จะถูกวางซ้อนกัน เราสามารถใช้การดำเนินการ rotation มาตรฐาน เช่น RX หรือ CRZ
  • สำหรับชั้น entanglement เราสามารถใช้ Gate เช่น Toffoli gates หรือ CX พร้อมกลยุทธ์ entanglement
  • ทั้งสองประเภทของชั้นอาจมีพารามิเตอร์หรือไม่ก็ได้ แต่อย่างน้อยหนึ่งชั้นต้องมีพารามิเตอร์ มิฉะนั้นจะไม่มีการเปลี่ยนแปลงใด ๆ!
  • ตัวเลือกเพิ่มเติม: สามารถเพิ่มชั้น rotation พิเศษที่ปลาย Circuit

ตัวอย่างเช่น มาสร้าง Circuit NLocal ที่มี 5 Qubit โดยมี rotation blocks ที่ประกอบด้วย Gate RX และ CRZ, entanglement blocks ที่ประกอบด้วย Toffoli gates ที่ทำงานบน Qubit [0,1,2][0,1,2], [0,2,3][0,2,3], [4,2,1][4,2,1] และ [3,1,0][3,1,0] และ 22 การทำซ้ำของแต่ละชั้น

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")

Output of the previous code cell

ในตัวอย่างข้างต้น Gate ที่ใหญ่ที่สุดคือ Toffoli gate ซึ่งทำงานบน 3 Qubit ทำให้ Circuit เป็น 33-local ประเภทที่ใช้กันทั่วไปที่สุดของ NN-local circuits คือ 22-local circuits ที่มี Gate rotation แบบ single-Qubit และ Gate entanglement แบบ 22-Qubit

มาสร้าง Circuit 22-local โดยใช้คลาส TwoLocal ของ Qiskit ไวยากรณ์เหมือนกับ NLocal แต่มีความแตกต่างบางอย่าง ตัวอย่างเช่น Gate ส่วนใหญ่ เช่น RX, RZ และ CNOT สามารถส่งเป็น string โดยไม่ต้องนำเข้า Gate หรือสร้าง 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")

Output of the previous code cell

ในกรณีนี้ เราใช้การกระจาย entanglement แบบ linear โดยแต่ละ Qubit จะพัวพันกับ Qubit ถัดไป เพื่อเรียนรู้เกี่ยวกับกลยุทธ์อื่น ๆ ดูได้ที่เอกสาร TwoLocal

Efficient SU2

efficient_su2 เป็น Circuit ที่มีประสิทธิภาพสำหรับฮาร์ดแวร์ ประกอบด้วยชั้นของการดำเนินการ single-Qubit ที่ครอบคลุม SU(2) และ entanglement แบบ CX นี่เป็นรูปแบบ heuristic ที่สามารถใช้เพื่อเตรียม trial wave functions สำหรับอัลกอริทึมควอนตัม variational หรือเป็น Circuit สำหรับการจำแนกในการเรียนรู้ของเครื่อง

from qiskit.circuit.library import efficient_su2

ansatz = efficient_su2(4, su2_gates=["rx", "y"], entanglement="linear", reps=1)
ansatz.decompose().draw("mpl")

Output of the previous code cell

Ansaetze เฉพาะปัญหา

ในขณะที่ heuristic และ hardware-efficient ansaetze ช่วยให้เราแก้ปัญหาในแบบที่ไม่ซับซ้อน เราสามารถใช้ความรู้เฉพาะปัญหาเพื่อจำกัดพื้นที่การค้นหา Circuit ของเราให้เฉพาะเจาะจงยิ่งขึ้น ซึ่งจะช่วยให้เราได้ความเร็วโดยไม่สูญเสียความแม่นยำในกระบวนการค้นหา

การปรับแต่ง

ในปัญหา max-cut เราต้องการแบ่งโหนดของกราฟในลักษณะที่เพิ่มจำนวนขอบระหว่างโหนดในกลุ่มต่าง ๆ ให้มากที่สุด การแบ่ง max-cut ที่ต้องการสำหรับกราฟด้านล่างชัดเจน: โหนดที่ 0 ทางด้านซ้ายควรถูกแยกออกจากโหนดที่เหลือทางด้านขวาโดย cut

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"
)

Output of the previous code cell

เพื่อใช้อัลกอริทึม QAOA สำหรับปัญหา max-cut เราต้องการ Pauli Hamiltonian ที่เข้ารหัสต้นทุนในลักษณะที่ค่าความคาดหวังต่ำสุดของตัวดำเนินการสอดคล้องกับจำนวนขอบสูงสุดระหว่างโหนดในสองกลุ่มที่แตกต่างกัน

สำหรับตัวอย่างง่าย ๆ นี้ ตัวดำเนินการคือการรวมเชิงเส้นของพจน์ที่มีตัวดำเนินการ Z บนโหนดที่เชื่อมต่อด้วยขอบ (โปรดจำไว้ว่า Qubit ที่ 0 อยู่ด้านขวาสุด): ZZII+IZZI+ZIIZ+IZIZ+IIZZZZII + IZZI + ZIIZ + IZIZ + IIZZ เมื่อสร้างตัวดำเนินการแล้ว ansatz สำหรับอัลกอริทึม QAOA สามารถสร้างได้ง่าย ๆ โดยใช้ Circuit QAOAAnsatz จาก Qiskit circuit library

# 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")

Output of the previous code cell

ภาพก่อนหน้าแสดง ansatz ใน Gate พื้นฐานเพื่อความชัดเจน อย่างไรก็ตาม สามารถแสดงในหลายระดับของการแยกย่อยโดยการเปลี่ยนอาร์กิวเมนต์ reps หรือโดยการวาด Circuit โดยไม่ใช้ method decompose ตัวอย่างเช่น การแสดงผลต่อไปนี้แสดงโครงสร้าง QAOA โดยตรงด้วยค่า reps ดีฟอลต์ ซึ่งคือ reps=1

ansatz.decompose(reps=2).draw("mpl")

Output of the previous code cell

Quantum Machine Learning

ในการเรียนรู้ของเครื่อง การประยุกต์ใช้ทั่วไปคือการจำแนกข้อมูลออกเป็นสองหมวดหมู่หรือมากกว่า ซึ่งเกี่ยวข้องกับการเข้ารหัสจุดข้อมูลเป็น feature map ที่แมป feature vector แบบคลาสสิกเข้าสู่ Hilbert space ของควอนตัม การสร้าง quantum feature map บน Circuit ควอนตัมแบบมีพารามิเตอร์ที่ยากต่อการจำลองแบบคลาสสิกเป็นขั้นตอนสำคัญสู่การได้เปรียบที่เป็นไปได้เหนือวิธีการเรียนรู้ของเครื่องแบบคลาสสิก และเป็นพื้นที่วิจัยที่ยังดำเนินอยู่

zz_feature_map สามารถใช้สร้าง Circuit แบบมีพารามิเตอร์ได้ เราสามารถส่งข้อมูลของเราให้กับ feature map (xx) และ variational form แยกต่างหากเพื่อส่งน้ำหนักเป็นพารามิเตอร์ (θ\theta)

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")

Output of the previous code cell

สรุป

ในบทเรียนนี้ คุณได้เรียนรู้วิธีกำหนดพื้นที่การค้นหาด้วย variational form:

  • เตรียมสถานะด้วย Circuit ควอนตัม_แบบมีพารามิเตอร์_ โดย Gate ถูกกำหนดด้วยพารามิเตอร์ที่ปรับได้
  • วิธีสร้าง ansaetze ที่แลกเปลี่ยนระหว่างความเร็วกับความแม่นยำ
  • Heuristic ansaetze
  • Ansaetze เฉพาะปัญหา

งาน variational ระดับสูงของเราเป็นดังนี้:

A circuit diagram showing two unitaries: one preparing the reference state and another preparing the ansatz.

สำหรับแต่ละพารามิเตอร์ variational θ\vec\theta จะผลิตสถานะควอนตัมที่แตกต่างกัน เพื่อค้นหาพารามิเตอร์ที่เหมาะสมที่สุด เราต้องกำหนดฟังก์ชันต้นทุนเฉพาะปัญหาเพื่อปรับพารามิเตอร์ของ ansatz ซ้ำ ๆ

Source: IBM Quantum docs — updated 15 ม.ค. 2569
English version on doQumentation — updated 7 พ.ค. 2569
This translation based on the English version of approx. 26 มี.ค. 2569