Introdução ao Quantum Machine Learning
Visão geral e motivação
Bem-vindo ao aprendizado de máquina quântico!
O vídeo abaixo apresenta uma breve introdução que é complementada pelo texto abaixo.
Para recapitular brevemente e aumentar o vídeo:
- Vimos um problema ser resolvido pela primeira vez em um computador quântico e, posteriormente, as pessoas descobriram uma maneira de fazê-lo em um supercomputador clássico. Esse ciclo de computação clássica e quântica levando uma à outra aos seus limites provavelmente continuará por alguns anos.
- Há problemas específicos em que a computação quântica pode ter uma vantagem comprovada sobre a computação clássica, dado o progresso em áreas como a redução de erros e o número de qubits disponíveis. Mas ainda estamos em um período de exploração, buscando conjuntos de dados quânticos acessíveis e mapas de recursos quânticos úteis.
- O aprendizado de máquina quântico (QML) é uma das muitas áreas interessantes em que a computação quântica pode aumentar ou complementar os fluxos de trabalho clássicos existentes.
O aprendizado de máquina (ML) aplica algoritmos a conjuntos de dados e, portanto, o QML pode incluir plausivelmente a mecânica quântica nos dados ou nos algoritmos, ou em ambos. Todas essas possibilidades são potencialmente interessantes. Mas nos restringiremos principalmente a discussões sobre algoritmos quânticos aplicados a dados clássicos. Um motivo para isso é que os problemas de ML com dados clássicos já estão bem estudados e amplamente disponíveis. Há um grande interesse em resolver problemas que começam com dados clássicos. Outro motivo é a falta de QRAM. Sem a capacidade de armazenar grandes quantidades de dados quânticos em uma escala de tempo relativamente longa, os métodos que começam com dados quânticos ainda estão bastante distantes da aplicabilidade no setor. Também não está claro como "acessar quânticamente" dados clássicos de maneira eficiente. Dois tipos de ML de interesse particular são o aprendizado supervisionado, no qual você treina um algoritmo usando um conjunto de dados rotulados, e o aprendizado não supervisionado, no qual o algoritmo tenta aprender sobre uma distribuição a partir de amostras não rotuladas. Um algoritmo não supervisionado pode, por exemplo, aprender como gerar novas amostras a partir da mesma distribuição ou como agrupar as amostras em grupos com características semelhantes.
A imagem à esquerda mostra duas categorias de dados rotulados, como na aprendizagem supervisionada. Neste caso, as categorias são linearmente separáveis. A imagem à direita mostra grupos de dados. Em uma tarefa de aprendizado não supervisionado, esses dados não seriam inicialmente rotulados e o algoritmo estudaria a distribuição, talvez procurando por agrupamentos. Para fins de visualização dos clusters de exemplo que o algoritmo pode identificar, os pontos de dados foram agora rotulados. Uma diferença fundamental entre os dois é que o processo de aprendizagem supervisionada começa com os dados já rotulados, enquanto o processo não supervisionado começa com dados não rotulados, mesmo que os dados sejam rotulados no final.
Quem tem experiência em aprendizado de máquina já sabe que muitos métodos de solução envolvem o mapeamento de dados em espaços de dimensões maiores. Isso é especialmente bem explorado no contexto dos kernels. Como um breve lembrete, às vezes os dados podem ser separados em categorias por uma linha, um plano ou um hiperplano (muitas vezes diremos simplesmente "hiperplano" para sermos compactos), no mesmo número de dimensões que os dados são fornecidos. Isso é mostrado na primeira imagem acima. Outras vezes, os dados podem não ser separáveis por um hiperplano nessas dimensões, conforme mostrado na segunda imagem. Mas ainda pode haver uma estrutura nos dados que pode ser explorada em um mapeamento para dimensões mais altas, o que deixa os dados separáveis nesse espaço de dimensões mais altas. Isso é ilustrado no mapeamento dos dados de 2D com simetria circular no espaço de 3D, no qual os pontos de dados estão dispostos ao longo de uma superfície paraboloide.
Um objetivo comum em QML é encontrar um mapeamento do conjunto de recursos de dimensão inferior em um espaço de dimensão superior, que separe efetivamente nossos pontos de dados para que possamos usar o mapeamento para classificar novos pontos de dados. Mas essa não é uma tarefa fácil, e qualquer discussão sobre a possível utilidade da computação quântica no aprendizado de máquina deve ser acompanhada das devidas ressalvas. Em particular, devemos abordar as nuances na seleção do conjunto de dados e os desafios para atingir a escala de utilidade. Também devemos deixar de tentar superar os algoritmos clássicos de ML em dados que já são tratados de forma eficiente e adequada pelos algoritmos clássicos e reorientar a discussão para a investigação de novos mapas de recursos que possam ser úteis.
Gerenciando expectativas
Muitos conjuntos de dados usados em aplicativos QML descritos na literatura são "projetados com recursos", o que significa que um conjunto de dados é selecionado ou gerado especificamente para mostrar um caso de uso restrito no qual a computação quântica é útil. Se isso parece uma trapaça, então estamos entendendo mal a tarefa em questão. Não é verdade que alguns mapas de recursos quânticos nos permitem resolver todas ou muitas tarefas de classificação de forma mais eficiente ou em escala do que os algoritmos clássicos de aprendizado de máquina. Em vez disso, alguns mapas de recursos quânticos (não todos) se comportam de forma diferente dos mapas de recursos clássicos. A tarefa em questão é, então, explorar os circuitos quânticos no contexto de estruturas de dados complexas. Algumas perguntas específicas a serem abordadas são:
- Quais circuitos quânticos têm maior probabilidade de se comportar de maneiras novas, em comparação com as alternativas clássicas?
- Existem problemas no mundo real que envolvem dados com propriedades melhor exploradas usando esses novos circuitos quânticos?
- Esses circuitos quânticos são dimensionados em computadores quânticos de curto prazo?
Explicação insuficiente
É comum encontrar uma explicação simplificada de como a computação quântica pode ser poderosa. É mais ou menos assim:
Assim como os computadores clássicos usam bits de informação, os computadores quânticos usam qubits. Dado um número de bits, digamos 4, um computador clássico pode assumir qualquer um dos estados possíveis, enquanto um computador quântico pode existir em uma superposição de todos os 16 estados simultaneamente, e as operações podem ser realizadas em toda essa superposição. Em alguns casos, isso naturalmente nos permite projetar algoritmos de aprendizado potencialmente interessantes com base em mapeamentos para espaços de dimensões maiores.
Essa é uma afirmação verdadeira, mas é inadequada e um pouco enganosa, como explicaremos. As diferenças entre coeficientes complexos e reais também são enfatizadas, como em
Um sistema clássico probabilístico, no qual um sistema pode ser descrito como tendo certas probabilidades de estar em diferentes estados, pode ser descrito da seguinte forma.
Nesse sistema, os coeficientes , , , e assim por diante, só podem ser significativos se forem números reais positivos. Os estados nos computadores quânticos são descritos por amplitudes de probabilidade que podem ser números complexos.
As afirmações acima foram feitas com muito cuidado para que sejam verdadeiras (muitas afirmações superficialmente semelhantes são incorretas). Mas essas afirmações corretas não são uma explicação do poder da computação quântica no aprendizado de máquina. Por um lado, qualquer aplicação da computação quântica ao aprendizado de máquina envolverá medições e não podemos medir um qubit para que ele esteja em vários estados ao mesmo tempo. Podemos preparar um qubit em uma superposição como , mas uma medição produzirá ou . Portanto, no mínimo, essa história sobre o aumento da dimensionalidade está incompleta. Além disso, no contexto dos núcleos, o aumento das dimensões na computação quântica não pode ser uma condição suficiente para a potência computacional em relação às alternativas clássicas, pois os núcleos gaussianos são de dimensão infinita. Há sutilezas, pois os mapas de recursos gaussianos são usados somente em conjunto com o "truque do kernel" que evita a necessidade de calcular um vetor mapeado de dimensão infinita. Mas a questão permanece:
A alta dimensionalidade dos estados quânticos emaranhados não é um paralelismo exponencial e não é uma condição suficiente para aumentar a potência do aprendizado de máquina.
Nas lições a seguir, apresentamos fluxos de trabalho para incorporar circuitos quânticos em tarefas de aprendizado de máquina, e fazemos isso com o objetivo explícito de facilitar a exploração do poder da computação quântica. Nenhum mapa de recursos ou algoritmo deste curso é apresentado como um caminho rápido para obter melhores resultados de aprendizado de máquina para problemas gerais, porque esse mapa de recursos ou algoritmo não existe. Em vez disso, apresentamos uma ampla gama de ferramentas quânticas a serem usadas na exploração da computação quântica útil.
Desquantização
A dequantização refere-se à substituição de um determinado algoritmo quântico por um algoritmo clássico com desempenho semelhante ao de um algoritmo quântico para um determinado conjunto de tarefas, normalmente incluindo o dimensionamento. De acordo com algumas definições, o algoritmo clássico deve ter um desempenho apenas polinomialmente mais lento do que o algoritmo quântico.
Vários algoritmos de aprendizado de máquina quântica (QML), que inicialmente se acreditava que proporcionavam aumentos significativos de velocidade em relação aos algoritmos clássicos, foram dequantizados nos últimos anos. Esse processo de dequantização levou a importantes percepções sobre as possíveis vantagens e limitações das abordagens quânticas ao aprendizado de máquina.
Um dos resultados mais notáveis da desquantização veio do trabalho de Ewin Tang sobre sistemas de recomendação. Tang descobriu um algoritmo clássico que podia executar tarefas de recomendação em velocidades que antes eram consideradas alcançáveis apenas por computadores quânticos. Essa descoberta desafiou a suposição de que os algoritmos quânticos tinham uma vantagem exponencial para esse problema. Um trabalho mais recente de Shin et al. concentrou-se na identificação das condições de dequantização da classe de função de um modelo de aprendizado de máquina quântica variacional.
Uma abordagem comum à dequantização (embora não seja o único truque) é a consideração da sobrecarga de carregamento de dados. Ou seja, qualquer algoritmo quântico aplicado a dados clássicos terá uma etapa na qual os dados clássicos são codificados no computador quântico. Se um algoritmo quântico pressupõe um ponto de partida no qual os dados quânticos já estão disponíveis, então o tempo necessário para a codificação é efetivamente ocultado. Há contextos em que a suposição de dados quânticos pode ser razoável, mas muitos aplicativos de interesse começarão com dados clássicos. Alguns casos de dequantização mostraram que, quando esse tempo de codificação é incluído e quando o carregamento de dados clássicos pode ser realizado de forma eficiente, o algoritmo quântico não supera mais sua contraparte clássica.
Mesmo que um algoritmo não possa ser dequantizado, isso não significa que ele seja mais eficiente ou escalonável do que todos os algoritmos clássicos. Como um exemplo extremo e artificial: imagine um algoritmo para selecionar os maiores elementos j de um conjunto de tamanho k. É possível escrever um algoritmo quântico que use o algoritmo de Shor para fatorar cada um dos k elementos em fatores primos e, em seguida, determinar os maiores elementos usando os fatores primos. Esse algoritmo provavelmente não pode ser dequantizado, mas é drasticamente menos eficiente do que os algoritmos clássicos para realizar a mesma seleção dos maiores elementos (embora não a parte desnecessária da fatoração).
Prova de existência
Em 2021, os pesquisadores do IBM Quantum® Yunchao Liu, Srinivasan Arunachalam e Kristan Temme publicaram um artigo na Nature, A rigorous and robust quantum speed-up in supervised machine learning. Em consonância com as advertências acima, foi cuidadosamente escolhido para este trabalho um problema de classificação que é (1) conhecido por ser classicamente difícil e (2) adequado para que os algoritmos quânticos mostrem um aumento de velocidade.
O documento aborda a classificação de dados com base em logaritmos discretos. Para citar o artigo, "Para um número primo grande e um gerador de , é uma conjectura amplamente acreditada que nenhum algoritmo clássico pode computar na entrada , em tempo polinomial em , o número de bits necessários para representar ." Em contrapartida, sabe-se que o algoritmo de Shor resolve o problema de log discreto em tempo polinomial. Essa escolha de problemas, portanto, satisfaz simultaneamente os critérios acima: dureza clássica (improvável de ser dequantizada) e conhecida por ser adequada para algoritmos quânticos.
Por meio dessa escolha criteriosa do problema de classificação, os autores conseguiram demonstrar um aumento exponencial da velocidade usando métodos de kernel quântico (esboçados brevemente abaixo e discutidos em lições posteriores) que são robustos e de ponta a ponta. Aqui, "ponta a ponta" refere-se às suposições sobre o início com dados clássicos; os autores, nesse caso, incluem o tempo para a codificação dos dados. Aqui, "robusto" refere-se ao fato de que os dados a serem classificados são separados por uma ampla margem usando o algoritmo quântico, de modo que o sucesso da classificação é robusto a considerações do mundo real, como erro de amostragem finito.
Tudo isso para dizer que existem problemas nos quais os núcleos quânticos podem gerar um aumento exponencial da velocidade. Mas o estado atual da ciência é que esses problemas são selecionados com base em observações ou justificativas teóricas de que devem ser passíveis de algoritmos quânticos. Não é realista esperar um aumento de velocidade quântica para tarefas de aprendizado de máquina que os computadores clássicos já realizam muito bem.
Identificar esses casos ideais para a exploração da utilidade quântica é uma enorme responsabilidade para os alunos deste curso. E essa não é uma tarefa que possa ser realizada em um curso como este. Essa exploração é uma tarefa para a IBM Quantum Network como um todo, composta por pesquisadores como você. Este curso demonstrará fluxos de trabalho QML e estratégias de codificação para que você possa começar a explorar a utilidade quântica em sua área de especialização.
Esperamos que esta introdução tenha esclarecido algumas coisas sobre o aprendizado de máquina quântico:
- Os algoritmos quânticos podem oferecer um aumento de velocidade exponencial em relação aos algoritmos clássicos para problemas muito específicos que são classicamente difíceis e bem adaptados aos algoritmos quânticos.
- A alta dimensionalidade dos estados emaranhados na computação quântica é importante, mas não é suficiente para simplesmente obter uma vantagem sobre os algoritmos clássicos.
- Encontrar problemas que se adaptem bem aos algoritmos quânticos é uma tarefa extremamente difícil, que caberá em grande parte aos alunos deste curso.
Perguntas de check-in
O que torna os estados quânticos diferentes dos estados clássicos?
Muito. Notavelmente: coeficientes complexos e superposição com uma única cópia. Existem muitas outras diferenças que serão discutidas em lições futuras, incluindo entrelaçamento e interferência.
Verdadeiro ou falso? Os estados quânticos altamente emaranhados nos permitem resolver a maioria dos problemas de aprendizado de máquina com mais eficiência em um computador quântico.
Falso. A maioria dos problemas de aprendizado de máquina é resolvida de forma muito eficiente por algoritmos clássicos, e não é provável que os algoritmos quânticos ofereçam um aumento substancial de velocidade. O objetivo do QML é encontrar conjuntos de dados com recursos que sejam bem descritos por estados quânticos e/ou encontrar mapeamentos de recursos de dados que otimizem a precisão dos modelos.
Objetivos de aprendizagem do curso
Ao concluir este curso, você pode esperar desenvolver as seguintes habilidades e competências essenciais. Os alunos serão capazes de:
-
Explique o que é QML e onde o quantum se conecta ao aprendizado de máquina clássico.
-
Aplique o vocabulário quântico e os principais termos aos fluxos de trabalho de ML.
-
Identificar os principais componentes de um fluxo de trabalho QML (vários tipos).
-
Identifique os diferentes tipos de QML e faça a distinção entre eles.
-
Implemente métodos de kernel quântico e classificadores quânticos variacionais usando primitivos do Qiskit Runtime e seguindo os padrões do Qiskit.
-
Identificar onde o QML é mais promissor e onde não é.
-
Ajustar um problema de exemplo ao seu próprio conjunto de dados.
-
Esteja ciente dos problemas no QML, como tempo de treinamento, ruído e erro de composição em leituras de vários estados.
-
Fazer recomendações sobre onde o QML pode beneficiar sua organização.
Estrutura do curso
Este curso é composto de várias lições. Cada lição tem várias perguntas de verificação ao longo do texto, para que você possa praticar novas habilidades ou verificar sua compreensão à medida que avança. Elas não são obrigatórias.
No final do curso, há um teste de 20 itens. Você deve pontuar pelo menos 70% neste teste para obter o distintivo Quantum Machine Learning, via Credly. Se você obtiver pelo menos 70% de aproveitamento, seu crachá será enviado automaticamente por e-mail logo em seguida. Você só pode enviar o questionário duas vezes. Após o primeiro envio, você terá a oportunidade de fazer uma segunda tentativa para as perguntas que não acertou. Após o segundo envio, sua pontuação é definitiva. Consulte o questionário para obter mais detalhes.
A estrutura do curso é a seguinte:
- Lição 1: Introdução e visão geral
- Lição 2: Recapitulação do aprendizado de máquina
- Lição 3: Codificação de dados
- Aula 4: Métodos de kernel quântico e máquinas de vetores de suporte
- Lição 5: Classificadores quânticos variacionais / redes neurais
- Exame para crachá
Execute seu primeiro código QML
Muitas vezes, é útil ver para onde estamos indo, antes de dividi-lo em partes e mergulhar no histórico. As células de código abaixo executam uma instância simples de um método de kernel quântico. Especificamente, um único elemento da matriz do kernel é calculado. Os usuários iniciantes em métodos de kernel ou kernels quânticos não devem se intimidar com isso; várias lições deste curso serão dedicadas a dissecar exatamente o que está sendo feito nessas células.
Com esse código, apresentamos simultaneamente os padrões Qiskit: uma estrutura para abordar a computação quântica em escala de utilidade. Essa estrutura consiste em quatro etapas que são muito gerais e podem ser aplicadas à maioria dos problemas (embora, em alguns fluxos de trabalho, certas etapas possam ser repetidas várias vezes).
Padrões Qiskit:
- Etapa 1: mapear entradas clássicas para um problema quântico
- Etapa 2: otimizar o problema para a execução quântica
- Etapa 3: Executar usando Qiskit Runtime Primitives
- Etapa 4: Análise / pós-processamento
Nas células abaixo, oferecemos apenas explicações superficiais das várias etapas, apenas o suficiente para que você encontre a lição apropriada para saber mais.
# Import some qiskit packages required for setting up our quantum circuits.
from qiskit.circuit import Parameter, ParameterVector, QuantumCircuit
from qiskit.circuit.library import unitary_overlap
# Import StatevectorSampler as our sampler.
from qiskit.primitives import StatevectorSampler
# Step 1: Map classical inputs to a quantum problem:
# Start by getting some appropriate data. The data imported below consist of 128 rows or data points.
# Each row has 14 columns that correspond to data features, and a 15th column with a label (+/-1).
!wget https://raw.githubusercontent.com/qiskit-community/prototype-quantum-kernel-training/main/data/dataset_graph7.csv
# Import some required packages, and write a function to pull some training data out of the csv file you got above.
import pandas as pd
import numpy as np
def get_training_data():
"""Read the training data."""
df = pd.read_csv("dataset_graph7.csv", sep=",", header=None)
training_data = df.values[:20, :]
ind = np.argsort(training_data[:, -1])
X_train = training_data[ind][:, :-1]
return X_train
# Prepare training data
X_train = get_training_data()
# Empty kernel matrix
num_samples = np.shape(X_train)[0]
# Prepare feature map for computing overlap between two data points.
# This could be pre-built feature maps like ZZFeatureMap, or a custom quantum circuit, as shown here.
num_features = np.shape(X_train)[1]
num_qubits = int(num_features / 2)
entangler_map = [[0, 2], [3, 4], [2, 5], [1, 4], [2, 3], [4, 6]]
fm = QuantumCircuit(num_qubits)
training_param = Parameter("θ")
feature_params = ParameterVector("x", num_qubits * 2)
fm.ry(training_param, fm.qubits)
for cz in entangler_map:
fm.cz(cz[0], cz[1])
for i in range(num_qubits):
fm.rz(-2 * feature_params[2 * i + 1], i)
fm.rx(-2 * feature_params[2 * i], i)
# Pick two data points, here 14 and 19, and assign the features to the circuits as parameters.
x1 = 14
x2 = 19
unitary1 = fm.assign_parameters(list(X_train[x1]) + [np.pi / 2])
unitary2 = fm.assign_parameters(list(X_train[x2]) + [np.pi / 2])
# Create the overlap circuit
overlap_circ = unitary_overlap(unitary1, unitary2)
overlap_circ.measure_all()
overlap_circ.draw("mpl", scale=0.6, style="iqp")
# Step 2: Optimize problem for quantum execution
# Use Qiskit Runtime service to get the least busy backend for running on real quantum computers.
# from qiskit_ibm_runtime import QiskitRuntimeService
# service = QiskitRuntimeService(channel="ibm_quantum")
# backend = service.least_busy(
# operational=True, simulator=False, min_num_qubits=overlap_circ.num_qubits
# )
# Transpile the circuits optimally for the chosen backend using a pass manager.
# from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
# pm = generate_preset_pass_manager(optimization_level=3, backend=backend)
# overlap_ibm = pm.run(overlap_circ)
# Step 3: Execute using Qiskit Runtime Primitives
# Specify the number of shots to use.
num_shots = 10_000
## Evaluate the problem using statevector-based primitives from Qiskit
sampler = StatevectorSampler()
counts = (
sampler.run([overlap_circ], shots=num_shots).result()[0].data.meas.get_int_counts()
)
# Step 4: Analyze and post-processing
# Find the probability of 0.
counts.get(0, 0.0) / num_shotsOutput:
--2025-05-09 10:04:28-- https://raw.githubusercontent.com/qiskit-community/prototype-quantum-kernel-training/main/data/dataset_graph7.csv
Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.110.133, 185.199.109.133, 185.199.108.133, ...
Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.110.133|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 49405 (48K) [text/plain]
Saving to: ‘dataset_graph7.csv.2’
dataset_graph7.csv. 100%[===================>] 48.25K --.-KB/s in 0.03s
2025-05-09 10:04:29 (1.37 MB/s) - ‘dataset_graph7.csv.2’ saved [49405/49405]
0.8199
Embora não seja necessário entender todas as etapas acima, devemos tentar entender o resultado, para sabermos por que estamos fazendo isso. Muitos processos de aprendizado de máquina usam produtos internos como parte da classificação binária (entre outras coisas). A mecânica quântica tem uma conexão óbvia com isso, uma vez que as probabilidades de medir vários estados são dadas pelo produto interno com um estado inicial por meio do produto interno: . Portanto, o que fizemos acima foi criar um circuito quântico que contém os recursos de nossos dois pontos de dados e os mapeia no espaço de um vetor quântico e, em seguida, estima o produto interno nesse espaço por meio de medições. Esse é um exemplo de estimativa de kernel quântico. Observe que só implementamos esse processo para dois dos pontos de dados (14º e 19º). Se fizéssemos isso para todos os pares possíveis, poderíamos obter o resultado (nesse caso, o número 0.821...) e preencher uma matriz de resultados que descreve a sobreposição entre todos os pontos do conjunto de dados de treinamento. Essa é a "matriz do núcleo".
Verifique sua compreensão
No processo acima, calculamos uma entrada de matriz de kernel para os 14º e 19º pontos de dados. Que valor devemos obter se usarmos o mesmo ponto de dados duas vezes, aqui (como 14º e 14º novamente)? Em outras palavras, quais devem ser as entradas diagonais na matriz do núcleo? Responda a essa pergunta na ausência de ruído, mas observe que é possível haver desvios de sua resposta na presença de ruído.
As diagonais devem ser 1.0. Esse processo deve calcular o produto interno normalizado de um vetor com ele mesmo, que deve ser sempre um.