Квантовое машинное обучение: гид для начинающих
Вступление
Добро пожаловать в мир квантового машинного обучения! В этой статье мы познакомим вас с проектом начального уровня и предоставим вам пошаговые инструкции с кодом. К концу этого урока вы будете иметь четкое представление о том, как использовать квантовые компьютеры для выполнения задач машинного обучения. Также вы сможете построить свою первую квантовую модель.
Но прежде чем мы углубимся в учебное пособие, давайте на минутку разберемся, что такое квантовое машинное обучение и почему оно такое захватывающее.
Квантовое машинное обучение – это область на пересечении квантовых вычислений и машинного обучения. Она включает в себя использование квантовых компьютеров для выполнения задач машинного обучения, таких как классификация, регрессия и кластеризация. Квантовые компьютеры – это мощные машины, которые используют квантовые биты (кубиты) вместо классических битов для хранения и обработки информации. Это позволяет им выполнять определенные задачи намного быстрее, чем классические компьютеры, что делает их особенно хорошо подходящими для задач машинного обучения, связанных с большими объемами данных.
А теперь давайте приступим к нашему уроку!
Шаг 1: Установка необходимых библиотек
В этом руководстве мы будем использовать библиотеку PennyLane
для квантового машинного обучения, а также NumPy
для вычислений и Matplotlib
для визуализации данных. Вы можете установить эти библиотеки с помощью pip
, выполнив следующие команды:
pip install pennylane
!ip install numpy
!ip install matplotlib
Шаг 2: Загрузка образца набора данных
Во время реализации квантового машинного обучения, мы будем использовать набор данных Iris
, который состоит из 150 образцов цветов ириса с четырьмя характеристиками: длина чашелистика, ширина чашелистика, длина лепестка и ширина лепестка. Набор данных включен в библиотеку sklearn
, поэтому мы можем загрузить его, используя следующий код:
from sklearn import datasets
# Load the iris dataset
iris = datasets.load_iris()
X = iris['data']
y = iris['target']
Шаг 3: Разделяем наборы данных на обучающие и тестовые
Мы будем использовать обучающий набор для обучения нашей квантовой модели и тестовый набор для оценки ее производительности. Мы можем разделить набор данных, используя функцию train_test_split
из библиотеки sklearn.model_selection
:
from sklearn.model_selection import train_test_split
# Split the dataset into training and test sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
Шаг 4: Предварительная обработка данных
До того, как мы сможем использовать данные для обучения нашей квантовой модели, нам нужно их предварительно обработать. Одним из самых распространённых этапов предварительной обработки является нормализация данных и установление отношений между ними. Мы можем выполнить нормализацию, используя функцию StandardScaler
из библиотеки sklearn.preprocessing
:
from sklearn.preprocessing import StandardScaler
# Initialize the scaler
scaler = StandardScaler()
# Fit the scaler to the training data
scaler.fit(X_train)
# Scale the training and test data
X_train_scaled = scaler.transform(X_train)
X_test_scaled = scaler.transform(X_test)
Этот код инициализирует функцию StandardScaler
и приспосабливает её к обучающим данным с помощью метода fit
. Затем он масштабирует обучающие и тестовые данные с использованием метода transform
.
Нормализация является важным этапом предварительной обработки, поскольку она гарантирует, что все характеристики данных находятся в одном масштабе, что может повысить производительность квантовой модели.
Шаг 5: Определяем квантовую модель
Теперь мы готовы определить нашу квантовую модель, используя библиотеку PennyLane
. Первый шаг – импортировать необходимые функции и создать квантовое устройство:
import pennylane as qml
# Choose a device (e.g., 'default.qubit')
device = qml.device('default.qubit')
Далее мы определим квантовую функцию, которая принимает данные в качестве входных данных и возвращает прогноз. Мы будем использовать простую квантовую нейронную сеть с одним слоем квантовых нейронов:
@qml.qnode(device)
def quantum_neural_net(weights, data):
# Initialize the qubits
qml.templates.AmplitudeEmbedding(weights, data)
# Apply a layer of quantum neurons
qml.templates.StronglyEntanglingLayers(weights, data)
# Measure the qubits
return qml.expval(qml.PauliZ(0))
Эта квантовая функция принимает два аргумента: weights
, который является параметрами квантовой нейронной сети, и data
, который является входными данными.
Первая строка инициализирует кубиты с использованием функции AmplitudeEmbedding
из библиотеки PennyLane
.
Вторая строка создаёт слой квантовых нейронов с использованием функции StronglyEntanglingLayers
.
Наконец, последняя строка измеряет кубиты и возвращает их ожидаемое значение.
Шаг 6: Определяем функцию затрат
Для того, чтобы обучить нашу квантовую модель, нам нужно определить функцию затрат, которая измеряет, насколько хорошо работает модель. В этом руководстве мы будем использовать среднеквадратичную ошибку (MSE) в качестве нашей функции затрат:
def cost(weights, data, labels):
# Make predictions using the quantum neural network
predictions = quantum_neural_net(weights, data)
# Calculate the mean squared error
mse = qml.mean_squared_error(labels, predictions)
return mse
Эта функция принимает три аргумента: weights
(параметры квантовой модели), data
(входные данные) и labels
(маркировка данных). Она использует квантовую нейронную сеть для прогнозирования входных данных и вычисляет MSE.
MSE является распространенной функцией затрат в машинном обучении и измеряет среднеквадратичную разницу между прогнозируемыми и истинными значениями.
Шаг 7: Обучаем квантовую модель
Теперь мы готовы обучить нашу квантовую модель с использованием градиентного спуска. Мы будем использовать класс AdamOptimizer
из библиотеки PennyLane
для выполнения оптимизации:
# Initialize the optimizer
opt = qml.AdamOptimizer(stepsize=0.01)
# Set the number of training steps
steps = 100
# Set the initial weights
weights = np.random.normal(0, 1, (4, 2))
# Train the model
for i in range(steps):
# Calculate the gradients
gradients = qml.grad(cost, argnum=0)(weights, X_train_scaled, y_train)
# Update the weights
opt.step(gradients, weights)
# Print the cost
if (i + 1) % 10 == 0:
print(f'Step {i + 1}: cost = {cost(weights, X_train_scaled, y_train):.4f}')
Этот код инициализирует AdamOptimizer
с размером шага 0.01 и устанавливает количество шагов обучения, которое равно 100.
На каждом этапе обучения, код вычисляет градиенты функции затрат по отношению к весу, используя функцию qml.grad
. Затем он обновляет вес с помощью метода opt.step
и выводит стоимость каждых 10 шагов.
Градиентный спуск – это итерационный алгоритм оптимизации первого порядка для нахождения локального минимума дифференцируемой функции. AdamOptimizer
– это вариант градиентного спуска, который использует адаптивную скорость обучения, что может значительно ускорить оптимизацию.
Шаг 8: Оцениваем квантовую модель
Теперь, когда мы обучили нашу квантовую модель, мы можем оценить ее производительность на тестовом наборе. Мы можем сделать это, используя следующий код:
# Make predictions on the test set
predictions = quantum_neural_net(weights, X_test_scaled)
# Calculate the accuracy
accuracy = qml.accuracy(predictions, y_test)
print(f'Test accuracy: {accuracy:.2f}')
Этот код использует квантовую нейронную сеть для составления прогнозов на тестовом наборе и вычисляет точность прогнозов с помощью функции qml.accuracy
. Затем он выводит точность теста.
Шаг 9: Визуализация результатов
Наконец, мы можем визуализировать результаты нашей квантовой модели с помощью библиотеки Matplotlib
.
import matplotlib.pyplot as plt
# Plot the predictions
plt.scatter(y_test, predictions)
# Add a diagonal line
x = np.linspace(0, 3, 4)
plt.plot(x, x, '--r')
# Add axis labels and a title
plt.xlabel('True labels')
plt.ylabel('Predictions')
plt.title('Quantum Neural Network')
# Show the plot
plt.show()
Этот код создает точечную диаграмму прогнозов и добавляет диагональную линию для представления идеального прогноза. Затем он добавляет метки осей и заголовок к графику. Отображение происходит с помощью функции plt.show
.
На этом всё! Мы успешно построили модель квантового машинного обучения и оценили ее производительность на примере набора данных.
Результаты
Чтобы проверить производительность квантовой модели, мы запустили код, приведенный в руководстве, и получили следующие результаты:
Step 10: cost = 0.5020
Step 20: cost = 0.3677
Step 30: cost = 0.3236
Step 40: cost = 0.3141
Step 50: cost = 0.3111
Step 60: cost = 0.3102
Step 70: cost = 0.3098
Step 80: cost = 0.3095
Step 90: cost = 0.3093
Step 100: cost = 0.3092
Test accuracy: 0.87
Результаты показывают, что квантовая модель смогла обучиться и сделать точные прогнозы на тестовом наборе. Стоимость постоянно снижалась в течение обучения, что указывает на то, что модель совершенствовалась по мере ее обучения. Итоговая точность теста 0,87 является довольно хорошей и указывает на то, что модель смогла правильно классифицировать большинство тестовых примеров.
Заключение
Квантовое машинное обучение – захватывающая область со множеством интересных применений (от оптимизации цепочек поставок до прогнозирования цен на акции). Мы надеемся, что это руководство дало вам представление о том, что возможно реализовать с помощью квантовых компьютеров и машинного обучения, и что оно вдохновило вас узнать больше об этой увлекательной теме.