Ansaetze และรูปแบบ variational
แกนกลางของอัลกอริทึม variational ทุกตัวคือแนวคิดสำคัญในการวิเคราะห์ความแตกต่างระหว่างสถานะ ซึ่งเชื่อมโยงกันอย่างสะดวกผ่านการแมปที่มีพฤติกรรมดี (เช่น ต่อเนื่อง หาอนุพันธ์ได้) จากชุดพารามิเตอร์หรือตัวแปร ซึ่งเป็นที่มาของชื่อ
ก่อนอื่น เราจะสำรวจวิธีสร้าง Circuit แบบมีพารามิเตอร์ด้วยมือ เราจะใช้ Circuit เหล่านี้เพื่อกำหนด variational form ที่แทนชุดของสถานะแบบมีพารามิเตอร์สำหรับอัลกอริทึม variational ของเราในการสำรวจ จากนั้นเราจะสร้าง ansatz โดยการนำ variational form นี้ไปใช้กับ reference state ของเรา
เราจะสำรวจวิธีแลกเปลี่ยนระหว่างความเร็วและความแม่นยำในการสำรวจพื้นที่การค้นหานี้ด้วย
Quantum Circuit แบบมีพารามิเตอร์
อัลกอริทึม variational ทำงานโดยการสำรวจและเปรียบเทียบช่วงของสถานะเชิงควอนตัม ซึ่งขึ้นอยู่กับชุดพารามิเตอร์จำนวนจำกัด ตัว คือ สถานะเหล่านี้สามารถเตรียมได้โดยใช้ 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")
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 และ Ansatz
เพื่อปรับแต่งซ้ำจาก reference state ไปยังสถานะเป้าหมาย เราต้องกำหนด variational form ที่แทนชุดของสถานะแบบมีพารามิเตอร์สำหรับอัลกอริทึม variational ของเราในการสำรวจ:
โปรดสังเกตว่าสถานะแบบมีพารามิเตอร์ขึ้นอยู่กับทั้ง reference state ซึ่งไม่ขึ้นอยู่กับพารามิเตอร์ใด และ variational form ซึ่งขึ้นอยู่กับพารามิเตอร์เสมอ เราเรียกการรวมกันของสองส่วนนี้ว่า ansatz:
ขณะที่เราสร้าง ansatz เพื่อแทนชุดของสถานะแบบมีพารามิเตอร์สำหรับอัลกอริทึม variational ในการสำรวจ เราพบปัญหาสำคัญ: มิติของปัญหา ระบบ -Qubit (หรือ Hilbert space) มีสถานะควอนตัมที่แตกต่างกันมากมายในพื้นที่การกำหนดค่า เราจะต้องใช้พารามิเตอร์จำนวนมากมายในการสำรวจอย่างครบถ้วน ในเชิงปริมาณ มิติของมันคือ ยิ่งไปกว่านั้น ความซับซ้อนของรันไทม์ของอัลกอริทึมการค้นหาและอื่น ๆ เติบโตแบบเอกซ์โพเนนเชียลตามมิตินี้ ซึ่งเป็นปรากฏการณ์ที่มักเรียกในวรรณกรรมว่า "คำสาปแห่งมิติ"
เพื่อรับมือกับข้อจำกัดนี้ จึงนิยมกำหนดข้อจำกัดที่สมเหตุสมผลบน variational form เพื่อให้สำรวจเฉพาะสถานะที่เกี่ยวข้องมากที่สุด การค้นหา ansatz แบบย่อที่มีประสิทธิภาพยังเป็นพื้นที่วิจัยที่ยังคงดำเนินอยู่ แต่เราจะครอบคลุมสองแบบที่ใช้กันทั่วไป
Heuristic ansaetze และการแลกเปลี่ยน
หากคุณไม่มีข้อมูลใด ๆ เกี่ยวกับปัญหาเฉพาะที่จะช่วยลดมิติ คุณสามารถลองใช้กลุ่มของ Circuit แบบมีพารามิเตอร์ที่มีพารามิเตอร์น้อยกว่า ตัวตามอำเภอใจ อย่างไรก็ตาม มีการแลกเปลี่ยนที่ต้องพิจารณา:
- ความเร็ว: การลดพื้นที่การค้นหาช่วยให้อัลกอริทึมทำงานเร็วขึ้น
- ความแม่นยำ: การลดพื้นที่อาจเสี่ยงต่อการตัดคำตอบที่แท้จริงออก นำไปสู่วิธีแก้ปัญหาที่ไม่ดีที่สุด
- สัญญาณรบกวน: 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 ขนาดไม่เกิน โดย ต้องน้อยกว่าจำนวน Qubit
- สำหรับชั้น rotation Gate จะถูกวางซ้อนกัน เราสามารถใช้การดำเนินการ rotation มาตรฐาน เช่น
RXหรือCRZ - สำหรับชั้น entanglement เราสามารถใช้ Gate เช่น
Toffoligates หรือCXพร้อมกลยุทธ์ entanglement - ทั้งสองประเภทของชั้นอาจมีพารามิเตอร์หรือไม่ก็ได้ แต่อย่างน้อยหนึ่งชั้นต้องมีพารามิเตอร์ มิฉะนั้นจะไม่มีการเปลี่ยนแปลงใด ๆ!
- ตัวเลือกเพิ่มเติม: สามารถเพิ่มชั้น rotation พิเศษที่ปลาย Circuit
ตัวอย่างเช่น มาสร้าง Circuit NLocal ที่มี 5 Qubit โดยมี rotation blocks ที่ประกอบด้วย Gate RX และ CRZ, entanglement blocks ที่ประกอบด้วย Toffoli gates ที่ทำงานบน Qubit , , และ และ การทำซ้ำของแต่ละชั้น
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")
ในตัวอย่างข้างต้น Gate ที่ใหญ่ที่สุดคือ Toffoli gate ซึ่งทำงานบน 3 Qubit ทำให้ Circuit เป็น -local ประเภทที่ใช้กันทั่วไปที่สุดของ -local circuits คือ -local circuits ที่มี Gate rotation แบบ single-Qubit และ Gate entanglement แบบ -Qubit
มาสร้าง Circuit -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")
ในกรณีนี้ เราใช้การกระจาย 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")
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"
)
เพื่อใช้อัลกอริทึม QAOA สำหรับปัญหา max-cut เราต้องการ Pauli Hamiltonian ที่เข้ารหัสต้นทุนในลักษณะที่ค่าความคาดหวังต่ำสุดของตัวดำเนินการสอดคล้องกับจำนวนขอบสูงสุดระหว่างโหนดในสองกลุ่มที่แตกต่างกัน
สำหรับตัวอย่างง่าย ๆ นี้ ตัวดำเนินการคือการรวมเชิงเส้นของพจน์ที่มีตัวดำเนินการ Z บนโหนดที่เชื่อมต่อด้วยขอบ (โปรดจำไว้ว่า Qubit ที่ 0 อยู่ด้านขวาสุด): เมื่อสร้างตัวดำเนินการแล้ว 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")
ภาพก่อนหน้าแสดง ansatz ใน Gate พื้นฐานเพื่อความชัดเจน อย่างไรก็ตาม สามารถแสดงในหลายระดับของการแยกย่อยโดยการเปลี่ยนอาร์กิวเมนต์ reps หรือโดยการวาด Circuit โดยไม่ใช้ method decompose ตัวอย่างเช่น การแสดงผลต่อไปนี้แสดงโครงสร้าง QAOA โดยตรงด้วยค่า reps ดีฟอลต์ ซึ่งคือ reps=1
ansatz.decompose(reps=2).draw("mpl")
Quantum Machine Learning
ในการเรียนรู้ของเครื่อง การประยุกต์ใช้ทั่วไปคือการจำแนกข้อมูลออกเป็นสองหมวดหมู่หรือมากกว่า ซึ่งเกี่ยวข้องกับการเข้ารหัสจุดข้อมูลเป็น feature map ที่แมป feature vector แบบคลาสสิกเข้าสู่ Hilbert space ของควอนตัม การสร้าง quantum feature map บน Circuit ควอนตัมแบบมีพารามิเตอร์ที่ยากต่อการจำลองแบบคลาสสิกเป็นขั้นตอนสำคัญสู่การได้เปรียบที่เป็นไปได้เหนือวิธีการเรียนรู้ของเครื่องแบบคลาสสิก และเป็นพื้นที่วิจัยที่ยังดำเนินอยู่
zz_feature_map สามารถใช้สร้าง Circuit แบบมีพารามิเตอร์ได้ เราสามารถส่งข้อมูลของเราให้กับ feature map () และ variational form แยกต่างหากเพื่อส่งน้ำหนักเป็นพารามิเตอร์ ()
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")
สรุป
ในบทเรียนนี้ คุณได้เรียนรู้วิธีกำหนดพื้นที่การค้นหาด้วย variational form:
- เตรียมสถานะด้วย Circuit ควอนตัม_แบบมีพารามิเตอร์_ โดย Gate ถูกกำหนดด้วยพารามิเตอร์ที่ปรับได้
- วิธีสร้าง ansaetze ที่แลกเปลี่ยนระหว่างความเร็วกับความแม่นยำ
- Heuristic ansaetze
- Ansaetze เฉพาะปัญหา
งาน variational ระดับสูงของเราเป็นดังนี้:
สำหรับแต่ละพารามิเตอร์ variational จะผลิตสถานะควอนตัมที่แตกต่างกัน เพื่อค้นหาพารามิเตอร์ที่เหมาะสมที่สุด เราต้องกำหนดฟังก์ชันต้นทุนเฉพาะปัญหาเพื่อปรับพารามิเตอร์ของ ansatz ซ้ำ ๆ