Перейти до основного вмісту

Ансаци та варіаційні форми

В основі всіх варіаційних алгоритмів лежить ключова ідея: аналіз відмінностей між станами, які зручно пов'язані через деяке добре визначене відображення (наприклад, неперервне, диференційовне) з набору параметрів або змінних — звідси і назва.

Спочатку ми розберемося, як будувати параметризовані схеми вручну. Ми використаємо ці схеми для визначення варіаційної форми, що представляє колекцію параметризованих станів для дослідження варіаційним алгоритмом. Після цього ми побудуємо наш ансац, застосувавши варіаційну форму до нашого референсного стану.

Крім того, ми розглянемо компроміс між швидкістю та точністю під час дослідження цього простору пошуку.

Схема з ключовими компонентами ансацу: евристичні ансаци та проблемно-специфічні ансаци.

Параметризовані квантові схеми

Варіаційні алгоритми працюють, досліджуючи та порівнюючи набір квантових станів ψ(θ)|\psi(\vec{\theta})\rangle, які залежать від скінченного набору kk параметрів θ=(θ0,,θk1)\vec{\theta} = (\theta^0, \ldots, \theta^{k-1}). Ці стани можна підготувати за допомогою параметризованої квантової схеми, де гейти визначені з регульованими параметрами. Можна створити таку параметризовану схему, не прив'язуючи конкретних кутів:

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

Результат виконання попередньої комірки коду

Результат виконання попередньої комірки коду

Варіаційна форма та ансац

Щоб ітеративно оптимізувати від референсного стану ρ|\rho\rangle до цільового стану ψ(θ)|\psi(\vec\theta)\rangle, потрібно визначити варіаційну форму UV(θ)U_V(\vec{\theta}), яка представляє колекцію параметризованих станів для дослідження варіаційним алгоритмом:

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}

Зверни увагу: параметризований стан залежить як від референсного стану ρ|\rho\rangle, що не залежить від жодних параметрів, так і від варіаційної форми UV(θ)U_V(\vec{\theta}), яка завжди залежить від параметрів. Комбінацію цих двох частин ми називаємо ансацом: UA(θ):=UV(θ)URU_A(\vec\theta) := U_V(\vec\theta)U_R.

Будуючи ансац для представлення колекції параметризованих станів, ми стикаємося з важливою проблемою: розмірністю. Система з nn кубітів (тобто простір Гільберта) містить величезну кількість різних квантових станів у просторі конфігурацій. Нам знадобилася б непрактично велика кількість параметрів, щоб повністю його дослідити. Кількісно розмірність дорівнює D=22nD = 2^{2n}. Крім того, часова складність пошукових алгоритмів зростає експоненційно з цією розмірністю — явище, що часто називають «прокляттям розмірності».

Щоб подолати цю проблему, прийнято накладати деякі розумні обмеження на варіаційну форму, щоб досліджувалися лише найрелевантніші стани. Пошук ефективного усіченого ансацу є активною областю досліджень, але ми розглянемо два поширені підходи.

Евристичні ансаци та компроміси

Якщо у тебе немає конкретної інформації про задачу, яка допомогла б обмежити розмірність, можна спробувати довільну сім'ю параметризованих схем із менш ніж 22n2^{2n} параметрами. Однак варто враховувати деякі компроміси:

  • Швидкість: Скорочення простору пошуку дозволяє алгоритму працювати швидше.
  • Точність: Скорочення простору може призвести до виключення справжнього розв'язку задачі та отримання субоптимальних результатів.
  • Шум: Глибші схеми більше схильні до шуму, тому потрібно експериментувати зі зв'язністю ансацу, гейтами та їхньою точністю.

Між якістю (або навіть розв'язуваністю) і швидкістю існує фундаментальний компроміс: чим більше параметрів — тим вища ймовірність отримати точний результат, але тим довше виконуватиметься алгоритм.

N-локальні схеми

Одним із найпоширеніших прикладів евристичних ансаців є N-локальні схеми з кількох причин:

  • Ефективна реалізація: N-локальний ансац, як правило, складається з простих локальних гейтів, які можна ефективно реалізувати на квантовому комп'ютері, використовуючи невелику кількість фізичних кубітів. Це спрощує побудову та оптимізацію квантових схем.
  • Врахування важливих кореляцій: N-локальний ансац може вловлювати важливі кореляції між кубітами квантової системи навіть із невеликою кількістю гейтів. Це можливо тому, що локальні гейти діють на сусідні кубіти та створюють між ними заплутаність, яка важлива для моделювання складних квантових систем.

Ці схеми складаються з шарів обертань і заплутаності, що чергуються один або кілька разів:

  • Кожен шар формується гейтами розміром не більше NN, де NN має бути менше кількості кубітів.
  • У шарі обертань гейти складаються один над одним. Можна використовувати стандартні операції обертання, наприклад RX або CRZ.
  • У шарі заплутаності можна використовувати гейти на кшталт гейтів Тоффолі або CX зі стратегією заплутаності.
  • Обидва типи шарів можуть бути параметризованими або ні, але принаймні один із них повинен містити параметри. Інакше без хоча б одного параметра не було б жодних варіацій!
  • За бажанням, наприкінці схеми додається додатковий шар обертань.

Наприклад, створимо п'ятикубітну схему NLocal з блоками обертань, сформованими гейтами RX та CRZ, блоками заплутаності з гейтів Тоффолі, що діють на кубіти [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")

Результат виконання попередньої комірки коду

У наведеному прикладі найбільшим гейтом є гейт Тоффолі, що діє на три кубіти, тому схема є 33-локальною. Найпоширенішим типом NN-локальних схем є 22-локальні схеми з однокубітними гейтами обертань та двокубітними гейтами заплутаності.

Створимо 22-локальну схему за допомогою класу 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 на вузлах, з'єднаних ребром (нагадуємо: нульовий кубіт знаходиться крайнім праворуч): ZZII+IZZI+ZIIZ+IZIZ+IIZZZZII + IZZI + ZIIZ + IZIZ + IIZZ. Після побудови оператора ансац для алгоритму 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 можна використовувати для створення параметризованої схеми. Можна передати точки даних у карту ознак (xx) та окрему варіаційну форму для передачі ваг як параметрів (θ\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")

Результат виконання попередньої комірки коду

Підсумок

У цьому уроці ти дізнався, як визначити простір пошуку за допомогою варіаційної форми:

  • Готувати стани за допомогою параметризованої квантової схеми, де гейти визначені з регульованими параметрами
  • Як будувати ансаци з балансом між швидкістю та точністю
  • Евристичні ансаци
  • Проблемно-специфічні ансаци

Наш варіаційний робочий процес на високому рівні виглядає так:

Схема схеми з двома унітарними операторами: один готує референсний стан, інший — ансац.

Для кожного варіаційного параметра θ\vec\theta буде отримано різний квантовий стан. Щоб знайти оптимальні параметри, потрібно визначити проблемно-специфічну функцію витрат для ітеративного оновлення параметрів ансацу.