Кодування даних
Вступ та позначення
Щоб використовувати квантовий алгоритм, класичні дані потрібно якимось чином завантажити у квантову схему. Зазвичай це називають кодуванням даних, але також використовують термін завантаження даних. Пригадай з попередніх уроків поняття відображення ознак — відображення ознак даних з одного простору в інший. Сам по собі перенос класичних даних на квантовий комп'ютер є своєрідним відображенням і може називатися відображенням ознак. На практиці вбудовані відображення ознак у Qiskit (наприклад, z_Feature Map та ZZ Feature Map) зазвичай включають шари обертань та шари заплутування, що розширюють стан до великої кількості вимірів у просторі Гільберта. Цей процес кодування є критично важливою частиною алгоритмів квантового машинного навчання і безпосередньо впливає на їхні обчислювальні можливості.
Деякі з описаних нижче методів кодування можна ефективно моделювати класичн о; це особливо легко побачити у методах кодування, що породжують добуткові стани (тобто не заплутують кубіти). Пам'ятай, що квантова перевага найімовірніша тоді, коли квантоподібна складність набору даних добре відповідає методу кодування. Тому дуже ймовірно, що тобі доведеться написати власні схеми кодування. Тут ми демонструємо широкий спектр можливих стратегій кодування, щоб ти міг порівняти їх між собою й зрозуміти, що взагалі можливо. Є кілька дуже загальних тверджень щодо корисності методів кодування. Наприклад, efficient_su2 (див. нижче) з повною схемою заплутування набагато більш схильний захоплювати квантові особливості даних, ніж методи, що породжують добуткові стани (наприклад, z_feature_map). Але це не означає, що efficient_su2 є достатнім або достатньо підходящим для твого набору даних, щоб забезпечити квантове прискорення. Це вимагає ретельного розгляду структури даних, що моделюються або класифікуються. Також існує компроміс щодо глибини схеми: багато відображень ознак, що повністю заплутують кубіти в схемі, дають дуже глибокі схеми — надто глибокі для отримання придатних результатів на сучасних квантових комп'ютерах.
Позначення
Набір даних — це множина з векторів даних: , де кожен вектор є -вимірним, тобто . Це можна розширити на комплексні ознаки. У цьому уроці ми іноді використовуватимемо ці позначення для повного набору та його конкретних елементів, наприклад . Але переважно ми говоритимемо про завантаження одного вектора з набору даних за раз і часто просто посилатимемося на один вектор із ознак як .
Крім того, для посилання на відображення ознак вектора даних зазвичай використовують символ . У квантових обчисленнях зокрема прийнято позначати відображення через — нотація, що підкреслює унітарну природу цих операцій. Обидва символи можна правомірно використовувати для одного й того ж; обидва є відображеннями ознак. У цьому курсі ми зазвичай використовуємо:
- — коли говоримо про відображення ознак у машинному навчанні загалом, і
- — коли обговорюємо реалізації відображень ознак у вигляді схем.
Нормалізація та втрата інформації
У класичному машинному навчанні ознаки тренувальних даних часто «нормалізують» або масштабують, що нерідко покращує роботу моделі. Один із поширених способів — мін-макс нормалізація або стандартизація. При мін-макс нормалізації стовпці ознак матриці даних (скажімо, ознака ) нормалізуються:
де min і max — мінімум і максимум ознаки по векторам даних у наборі . Усі значення ознак потрапляють у одиничний інтервал: для всіх , .
Нормалізація — також фундаментальне поняття в квантовій механіці та квантових обчисленнях, але воно дещо відрізняється від мін-макс нормалізації. Нормалізація в квантовій механіці вимагає, щоб довжина (у контексті квантових обчислень — 2-норма) вектора стану дорівнювала одиниці: , що забезпечує суму ймовірностей вимірювань, рівну 1. Стан нормалізується діленням на 2-норму, тобто масштабуванням
У квантових обчисленнях і квантовій механіці це не нормалізація, яку люди нав'язують даним, а фундаментальна властивість квантових станів. Залежно від схеми кодування це обмеження може впливати на масштабування твоїх даних. Наприклад, при амплітудному кодуванні (див. нижче) вектор даних нормалізується , як того вимагає квантова механіка, і це впливає на масштаб даних, що кодуються. При фазовому кодуванні рекомендується масштабувати значення ознак так, щоб , щоб уникнути втрати інформації через ефект модуля при кодуванні у фазовий кут кубіта[1,2].
Методи кодування
У наступних кількох розділах ми посилатимемося на невеликий приклад класичного набору даних , що складається з векторів даних, кожен із ознаками:
У введених вище позначеннях можна сказати, наприклад, що ознака вектора даних нашого набору є .
Базисне кодування
Базисне кодування кодує класичний рядок із бітів у обчислювальний базисний стан -кубітної системи. Розглянемо, наприклад, Це можна представити як -бітний рядок , а в -кубітній системі — як квантовий стан . Загалом, для -бітного рядка: , відповідний -кубітний стан є , де при . Зверни увагу, що це стосується лише однієї ознаки.
Базисне кодування у квантових обчисленнях представляє кожен класичний біт як окремий кубіт, відображаючи двійкове представлення даних безпосередньо на квантові стани в обчислювальному базисі. Коли потрібно закодувати кілька ознак, кожна ознака спершу перетворюється у двійкову форму, а потім призначається окремій групі кубітів — по одній групі на ознаку — де кожен кубіт відповідає одному біту двійковог о представлення цієї ознаки.
Як приклад, закодуємо вектор (5, 7, 0).
Припустимо, всі ознаки зберігаються у чотирьох бітах (більше, ніж потрібно, але достатньо для представлення будь-якого однозначного числа в десятковій системі):
5 → binary 0101
7 → binary 0111
0 → binary 0000
Ці бітові рядки призначаються трьом наборам із чотирьох кубітів кожен, тому загальний 12-кубітний базисний стан:
Тут перші чотири кубіти представляють першу ознаку, наступні чотири — другу ознаку, а останні чотири — третю ознаку. Наведений нижче код перетворює вектор даних (5,7,0) у квантовий стан і узагальнений для роботи з іншими однозначними ознаками.
# Added by doQumentation — required packages for this notebook
!pip install -q matplotlib numpy qiskit
from qiskit import QuantumCircuit
# Data point to encode
x = 5 # binary: 0101
y = 7 # binary: 0111
z = 0 # binary: 0000
# Convert each to 4-bit binary list
x_bits = [int(b) for b in format(x, "04b")] # [0,1,0,1]
y_bits = [int(b) for b in format(y, "04b")] # [0,1,1,1]
z_bits = [int(b) for b in format(z, "04b")] # [0,0,0,0]
# Combine all bits
all_bits = x_bits + y_bits + z_bits # [0,1,0,1,0,1,1,1,0,0,0,0]
# Initialize a 12-qubit quantum circuit
qc = QuantumCircuit(12)
# Apply x-gates where the bit is 1
for idx, bit in enumerate(all_bits):
if bit == 1:
qc.x(idx)
qc.draw("mpl")

Перевір своє розуміння
Прочитай питання нижче, подумай над відповіддю, а потім натисни на трикутник, щоб побачити рішення.
Напиши код для кодування першого вектора нашого прикладного набору даних :
за допомогою базисного кодування.
Відповідь:
import math
from qiskit import QuantumCircuit
# Data point to encode
x = 4 # binary: 0100
y = 8 # binary: 1000
z = 5 # binary: 0101
# Convert each to 4-bit binary list
x_bits = [int(b) for b in format(x, '04b')] # [0,1,0,0]
y_bits = [int(b) for b in format(y, '04b')] # [1,0,0,0]
z_bits = [int(b) for b in format(z, '04b')] # [0,1,0,1]
# Combine all bits
all_bits = x_bits + y_bits + z_bits # [0,1,0,0,1,0,0,0,0,1,0,1]
# Initialize a 12-qubit quantum circuit
qc = QuantumCircuit(12)
# Apply x-gates where the bit is 1
for idx, bit in enumerate(all_bits):
if bit == 1:
qc.x(idx)
qc.draw('mpl')