Ансаци та варіаційні форми
В основі всіх варіаційних алгоритмів лежить ключова ідея: аналіз відмінностей між станами, які зручно пов'язані через деяке добре визначене відображення (наприклад, неперервне, диференційовне) з набору параметрів або змінних — звідси і назва.
Спочатку ми розберемося, як будувати параметризовані схеми вручну. Ми використаємо ці схеми для визначення варіаційної форми, що представляє колекцію параметризованих станів для дослідження варіаційним алгоритмом. Після цього ми побудуємо наш ансац, застосувавши варіаційну форму до нашого референсного стану.
Крім того, ми розглянемо компроміс між швидкістю та точністю під час дослідження цього простору пошуку.
Параметризовані квантові схеми
Варіаційні алгоритми працюють, досліджуючи та порівнюючи набір квантових станів , які залежать від скінченного набору параметрів . Ці стани можна підготувати за допомогою параметризованої квантової схеми, де гейти визначені з регульованими параметрами. Можна створити таку параметризовану схему, не прив'язуючи конкретних кутів:
# 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"))
Варіаційна форма та ансац
Щоб ітеративно оптимізувати від референсного стану до цільового стану , потрібно визначити варіаційну форму , яка представляє колекцію параметризованих станів для дослідження варіаційним алгоритмом:
Зверни увагу: параметризований стан залежить як від референсного стану , що не залежить від жодних параметрів, так і від варіаційної форми , яка завжди залежить від параметрів. Комбінацію цих двох частин ми називаємо ансацом: .
Будуючи ансац для представлення колекції параметризованих станів, ми стикаємося з важливою проблемою: розмірністю. Система з кубітів (тобто простір Гільберта) містить величезну кількість різних квантових станів у просторі конфігурацій. Нам знадобилася б непрактично велика кількість параметрів, щоб повністю його дослідити. Кількісно розмірність дорівнює . Крім того, часова складність пошукових алгоритмів зростає експоненційно з цією розмірністю — явище, що часто називають «прокляттям розмірності».
Щоб подолати цю проблему, прийнято накладати деякі розумні обмеження на варіаційну форму, щоб досліджувалися лише найрелевантніші стани. Пошук ефективного усіченого ансацу є активною областю досліджень, але ми розглянемо два поширені підходи.
Евристичні ансаци та компроміси
Якщо у тебе немає конкретної інформації про задачу, яка допомогла б обмежити розмірність, можна спробувати довільну сім'ю параметризованих схем із менш ніж параметрами. Однак варто враховувати деякі компроміси:
- Швидкість: Скорочення простору пошуку дозволяє алгоритму працювати швидше.
- Точність: Скорочення простору може призвести до виключення справжнього розв'язку задачі та отримання субоптимальних результатів.
- Шум: Глибші схеми більше схильні до шуму, тому потрібно експериментувати зі зв'язністю ансацу, гейтами та їхньою точністю.
Між якістю (або навіть розв'язуваністю) і швидкістю існує фундаментальний компроміс: чим більше параметрів — тим вища ймовірність отримати точний результат, але тим довше виконуватиметься алгоритм.
N-локальні схеми
Одним із найпоширеніших прикладів евристичних ансаців є N-локальні схеми з кількох причин:
- Ефективна реалізація: N-локальний ансац, як правило, складається з простих локальних гейтів, які можна ефективно реалізувати на квантовому комп'ютері, використовуючи невелику кількість фізичних кубітів. Це спрощує побудову та оптимізацію квантових схем.
- Врахування важливих кореляцій: N-локальний ансац може вловлювати важливі кореляції між кубітами квантової системи навіть із невеликою кількістю гейтів. Це можливо тому, що локальні гейти діють на сусідні кубіти та створюють між ними заплутаність, яка важлива для моделювання складних квантових систем.
Ці схеми складаються з шарів обертань і заплутаності, що чергуються один або кілька разів:
- Кожен шар формується гейтами розміром не більше , де має бути менше кількості кубітів.
- У шарі обертань гейти складаються один над одним. Можна використовувати стандартні операції обертання, наприклад
RXабоCRZ. - У шарі заплутаності можна використовувати гейти на кшталт гейтів Тоффолі або
CXзі стратегією заплутаності. - Обидва типи шарів можуть бути параметризованими або ні, але принаймні один із них повинен містити параметри. Інакше без хоча б одного параметра не було б жодних варіацій!
- За бажанням, наприкінці схеми додається додатковий шар обертань.
Наприклад, створимо п'ятикубітну схему NLocal з блоками обертань, сформованими гейтами RX та CRZ, блоками заплутаності з гейтів Тоффолі, що діють на кубіти , , та , і повторюваннями кожного шару.
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")
У наведеному прикладі найбільшим гейтом є гейт Тоффолі, що діє на три кубіти, тому схема є -локальною. Найпоширенішим типом -локальних схем є -локальні схеми з однокубітними гейтами обертань та двокубітними гейтами заплутаності.
Створимо -локальну схему за допомогою класу TwoLocal з Qiskit. Синтаксис аналогічний до NLocal, але є деякі відмінності. Наприклад, більшість гейтів, таких як RX, RZ та CNOT, можна передавати як рядки, не імпортуючи гейти та не створюючи екземпляр 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")
У цьому випадку ми використали лінійний розподіл заплутаності, де кожен кубіт заплутаний із наступним. Щоб дізнатися про інші стратегії, звернися до документації TwoLocal.
Efficient SU2
efficient_su2 — це апаратно-ефективна схема, що складається з шарів однокубітних операцій у просторі SU(2) та заплутаності CX. Це евристичний шаблон, який можна використовувати для підготовки пробних хвильових функцій у варіаційних квантових алгоритмах або як схему класифікації в машинному навчанні.
from qiskit.circuit.library import efficient_su2
ansatz = efficient_su2(4, su2_gates=["rx", "y"], entanglement="linear", reps=1)
ansatz.decompose().draw("mpl")
Проблемно-специфічні ансаци
Тоді як евристичні та апаратно-ефективні ансаци допомагають розв'язати задачу наївним способом, можна використовувати знання про конкретну задачу, щоб обмежити простір пошуку схем певним типом. Це дозволить виграти у швидкості без втрати точності пошуку.
Оптимізація
У задачі максимального розрізу (max-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, потрібен гамільтоніан Паулі, що кодує вартість так, щоб мінімальне очікуване значення оператора відповідало максимальній кількості ребер між вузлами двох різних груп.
Для цього простого прикладу оператор є лінійною комбінацією членів з операторами Z на вузлах, з'єднаних ребром (нагадуємо: нульовий кубіт знаходиться крайнім праворуч): . Після побудови оператора ансац для алгоритму QAOA можна легко створити за допомогою схеми QAOAAnsatz з бібліотеки схем 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")
На попередньому зображенні ансац зображено в базових гейтах для наочності. Однак його можна представити на кількох рівнях декомпозиції, змінюючи аргумент reps або малюючи схему без методу decompose. Наприклад, наступне представлення безпосередньо показує структуру QAOA зі значенням reps за замовчуванням, тобто reps=1.
ansatz.decompose(reps=2).draw("mpl")
Квантове машинне навчання
У машинному навчанні поширеним застосуванням є класифікація даних на дві або більше категорій. Це передбачає кодування точки даних у карту ознак, яка відображає класичні вектори ознак у квантовий простір Гільберта. Побудова квантових карт ознак на основі параметризованих квантових схем, які важко моделювати класично, є важливим кроком до отримання потенційної переваги над класичними підходами до машинного навчання та є активною областю поточних досліджень.
zz_feature_map можна використовувати для створення параметризованої схеми. Можна передати точки даних у карту ознак () та окрему варіаційну форму для передачі ваг як параметрів ().
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")
Підсумок
У цьому уроці ти дізнався, як визначити простір пошуку за допомогою варіаційної форми:
- Готувати стани за допомогою параметризованої квантової схеми, де гейти визначені з регульованими параметрами
- Як будувати ансаци з балансом між швидкістю та точністю
- Евристичні ансаци
- Проблемно-специфічні ансаци
Наш варіаційний робочий процес на високому рівні виглядає так:
Для кожного варіаційного параметра буде отримано різний квантовий стан. Щоб знайти оптимальні параметри, потрібно визначити проблемно-специфічну функцію витрат для ітеративного оновлення параметрів ансацу.