Pular para o conteúdo principal

Revisão dos métodos de aprendizado de máquina relevantes

Nesta seção, vamos revisar alguns termos e métodos importantes do aprendizado de máquina clássico que nos ajudarão a entender melhor os fluxos de trabalho no aprendizado de máquina quântico. Primeiro vamos introduzir alguns termos gerais, antes de mergulhar mais fundo em dois tipos de aprendizado de máquina: métodos de kernel (especialmente no contexto de uma máquina de vetores de suporte) e redes neurais. Certamente há conexões entre esses métodos, mas vamos tratá-los como distintos devido às diferenças nos fluxos de trabalho quânticos discutidos aqui e em lições posteriores. Esta é apenas uma visão geral superficial, e vamos pular muitos detalhes. Para uma visão mais completa do aprendizado de máquina, recomendamos recursos como [1-3].

Tipos de aprendizado de máquina

Como definição simples, aprendizado de máquina é uma coleção de algoritmos que analisam e inferem padrões e relações em dados. De forma ampla, os algoritmos de aprendizado de máquina podem ser agrupados em três categorias principais dependendo do tipo de dados envolvidos e de como os algoritmos aprendem sem serem explicitamente programados:

  1. Aprendizado supervisionado: No aprendizado supervisionado, os dados usados para treinar o modelo são rotulados. O objetivo desses algoritmos é aprender a relação entre os dados e seus rótulos ou saídas correspondentes e generalizar isso para dados não vistos. Tarefas comuns nesta classe são classificação e regressão.
  2. Aprendizado não supervisionado: Em contraste com o aprendizado supervisionado, o aprendizado não supervisionado usa dados não rotulados para treinar o modelo de aprendizado de máquina. O objetivo de tais algoritmos é descobrir padrões e estruturas ocultas nos dados. Alguns algoritmos nesta classe são algoritmos de agrupamento e de redução de dimensionalidade. Alguns modelos generativos, como redes adversariais generativas e autoencoders variacionais, também podem ser considerados nesta categoria.
  3. Aprendizado por reforço: Os algoritmos nesta categoria de aprendizado de máquina são definidos por um agente que interage com um ambiente. O agente toma ações e recebe feedback do seu ambiente na forma de recompensas e punições. Com o tempo, através desse mecanismo de feedback, o agente aprende a realizar o conjunto correto de ações para executar uma tarefa específica.

Uma representação diagramática do aprendizado supervisionado e não supervisionado.

A imagem à esquerda mostra duas categorias de dados rotulados como no aprendizado supervisionado. Neste caso, as categorias são linearmente separáveis. A imagem à direita mostra grupos de dados. Numa tarefa de aprendizado não supervisionado, esses dados não estariam inicialmente rotulados e o algoritmo estudaria a distribuição, talvez buscando grupos. Para fins de visualização dos grupos de exemplo que o algoritmo poderia identificar, os pontos de dados foram rotulados. Uma diferença fundamental entre os dois é que o processo de aprendizado supervisionado começa com os dados já rotulados e o processo não supervisionado começa com dados não rotulados, mesmo que os dados sejam rotulados ao final.

Introduzindo o "quantum" ao aprendizado de máquina

Podemos agora começar a explorar como o "quantum" é introduzido no aprendizado de máquina. Nessa categorização mais ampla, consideramos o tipo de modelo/algoritmo no dispositivo de processamento, bem como o tipo de dados fornecidos a ele. A figura acima resume essas combinações possíveis.

Um diagrama mostrando quadrantes com algoritmos em um eixo e dados no outro, onde cada um pode ser quântico ou clássico por natureza.

Por exemplo, CC significa que temos um conjunto de dados clássico — como imagens, som ou texto que podemos armazenar em computadores clássicos — e que também usamos um computador clássico para executar um algoritmo de aprendizado de máquina. Este é exatamente o cenário clássico de aprendizado de máquina. Por outro lado, QQ significa que estamos usando um computador quântico para processar dados quânticos. Aqui, "dados quânticos" pode significar várias coisas e pode depender do contexto. Dados quânticos podem ser pensados como um conjunto de resultados de medições obtidos de um dispositivo quântico, ou podem se referir a estados que foram preparados num computador quântico por outro algoritmo. No futuro, poderiam até se referir a dados armazenados em QRAM (Memória de Acesso Aleatório Quântica), que atualmente não existe. Quando pesquisadores falam sobre aprendizado de máquina quântico, geralmente se referem ao regime CQ, onde o conjunto de dados em questão é clássico e o dispositivo de processamento que executa o algoritmo de aprendizado de máquina é um computador quântico. Nas partes seguintes do curso, vamos nos concentrar em tais algoritmos.

Máquinas de vetores de suporte

Agora vamos recapitular uma classe de algoritmos chamada máquinas de vetores de suporte do ponto de vista do aprendizado de máquina clássico. Mais tarde vamos mostrar como incorporar a computação quântica a esse algoritmo.

Um diagrama de uma máquina de vetores de suporte.

Suponha uma tarefa de classificação binária em um conjunto de dados com espaço de características bidimensional, como mostrado no gráfico. Uma coisa que podemos fazer para realizar a classificação desse conjunto de dados é encontrar uma linha, ou em geral um hiperplano que separe as duas classes. Na prática podemos encontrar infinitos hiperplanos separadores, então a questão é: como definimos o ótimo? A ideia aqui é que uma fronteira de decisão particularmente boa deve maximizar a margem, que é definida como a distância aos pontos mais próximos em cada classe. Nesse cenário, os pontos de dados com a menor distância à fronteira de decisão são chamados de vetores de suporte.

Uma fronteira de decisão linear pode ser descrita de várias formas; de certa forma a mais direta é a mostrada em f1f_1 abaixo. Aqui, Θ\Theta é o conjunto de parâmetros que definem o hiperplano, x\vec{x} é o seu conjunto de dados, e bb é um deslocamento constante. Φ\Phi é um mapeamento do espaço de pontos de dados de entrada, frequentemente (mas não necessariamente) para um espaço de dimensão mais alta. Vamos retornar a esse mapeamento abaixo.

No modelo f1f_1, Θ\Theta é o vetor de parâmetros ajustáveis que o modelo aprenderia. Isso é o que chamamos de "formulação primal". Com alguma manipulação matemática podemos mostrar que há uma segunda forma de formular o mesmo problema. Chamamos isso de "formulação dual", representada pela equação f2f_2 abaixo. Para essa formulação, precisamos otimizar sobre os parâmetros alfa. A principal diferença é que na formulação primal a equação tem um produto interno entre o vetor de características e os parâmetros aprendíveis, enquanto na formulação dual o produto interno é entre vetores de características. Mesmo que a forma dual inclua tanto as características dos dados de treinamento quanto os rótulos correspondentes, vamos ver na próxima seção como ela se mostra mais útil do que a forma primal.

f1(x)=ΘTΦ(x)+bf_1(\vec{x}) = \Theta^T \Phi(\vec{x})+b f2(x)=i=1nαiyiΦT(xi)Φ(x)+bf_2(\vec{x}) = \sum_{i=1}^n \alpha_i y_i \Phi^T(\vec{x}_i)\Phi(\vec{x})+b

Métodos de kernel e como o quantum pode ter um papel

O vídeo abaixo motiva como o quantum pode ter um papel nos classificadores lineares. Isso é descrito em maior detalhe no texto.

Movendo para espaços de dimensão mais alta

Nesta e na próxima subseção, a discussão se concentra em mapeamentos para dimensões mais altas. O ponto aqui é explicar o "truque do kernel" no contexto de mapeamentos entre espaços, e assim preparar o terreno para o que é um kernel quântico. O ponto não é que dimensões mais altas em funções de onda quânticas resolvem todos os nossos problemas. Como mencionado na introdução, mapas de características Gaussianos clássicos já têm dimensão infinita. A dimensionalidade das características dos dados é importante, mas estados quânticos de alta dimensionalidade não são suficientes para melhora sobre os métodos clássicos.

Graficamente, pode-se ver facilmente como podemos generalizar a abordagem de SVM para casos em que os dados originais não são linearmente separáveis, dado o mapeamento correto para dimensões mais altas. Olhando para os dados bidimensionais à esquerda, podemos ver que não há fronteira de decisão linear que possa separar as duas classes. No entanto, podemos considerar adicionar uma terceira característica ao nosso espaço de características. Se essa nova característica for — por exemplo — a distância à origem das duas características anteriores x1x_1 e x2x_2, então os dados se tornam linearmente separáveis. Isso também significa que agora podemos executar o algoritmo de máquina de vetores de suporte com sucesso nesse espaço de características de dimensão mais alta.

Um diagrama mostrando um anel de um tipo de dado com um segundo tipo de dado preenchendo o meio do anel. Uma segunda célula mostra os dados projetados em 3D, como na forma de uma tigela. Agora os dados são linearmente separáveis.

Também denotamos esse "mapeamento de características" por Φ\Phi. O mapa de características frequentemente mapeia do espaço de dados de entrada para uma dimensão mais alta, como é mostrado aqui, mas existem modelos e algoritmos que fazem uso de mapeamentos para dimensões mais baixas. O mapeamento para dimensões mais altas é simplesmente um caso fácil de visualizar e entender.

x=(x1x2)\vec{x} = \begin{pmatrix}x_1 \\ x_2 \end{pmatrix} Φ(x)=(x1x2x12+x22)\vec{\Phi}(\vec{x}) = \begin{pmatrix}x_1 \\ x_2 \\ {x_1}^2+{x_2}^2\end{pmatrix}

Alguns mapas de características podem mapear para espaços de dimensão muito alta. Nesses casos, a alta dimensionalidade torna os produtos internos mais computacionalmente caros. Vamos retornar a esse ponto abaixo.

Por que a forma dual é útil?

Lembre-se das formulações primal e dual do nosso modelo de fronteira linear:

f1(x)=ΘTΦ(x)+bf_1(\vec{x}) = \Theta^T \Phi(\vec{x})+b f2(x)=i=1nαiyiΦT(xi)Φ(x)+bf_2(\vec{x}) = \sum_{i=1}^n \alpha_i y_i \Phi^T(\vec{x}_i)\Phi(\vec{x})+b

Agora que sabemos que usar um mapa de características para chegar a um espaço de dimensão mais alta pode nos permitir encontrar com sucesso um hiperplano separador, podemos substituir o vetor de características original x\vec{x} nas equações pelos vetores mapeados por características. No entanto, se fizermos isso na formulação primal, encontramos o problema de ter que calcular os produtos internos entre os parâmetros e um mapa de características potencialmente muito alto dimensional. Porém, na formulação dual, vemos que eles são substituídos por produtos internos entre vetores mapeados por características de diferentes entradas.

Para alguns mapas de características, pode ser possível escrever o produto interno de vetores mapeados por características ΦT(xi)Φ(xj)\vec{\Phi}^T(\vec{x}_i)\cdot \vec{\Phi}(\vec{x}_j) como uma função simples k(xi,xj)k(\vec{x}_i, \vec{x}_j) das variáveis originais (de dimensão mais baixa) xi\vec{x}_i e xj\vec{x}_j. Para algumas escolhas de Φ\Phi, podemos até ser capazes de escrever ΦT(xi)Φ(xj)\vec{\Phi}^T(\vec{x}_i)\cdot \vec{\Phi}(\vec{x}_j) como uma função simples do produto interno de dimensão mais baixa xiTxj\vec{x}_i^T\vec{x}_j. Isso é computacionalmente muito benéfico porque podemos acessar o espaço no qual os dados são linearmente separáveis, mas sem o custo de manipulações em dimensões mais altas. De fato, como os vetores mapeados por características aparecem em f2f_2 apenas em produtos internos, talvez não precisemos nem mesmo realizar explicitamente o mapeamento de características para calcular os produtos internos. Chamamos a função k(xi,xj)k(\vec{x}_i, \vec{x}_j) que calcula os produtos internos de "função de kernel", e essa maneira de evitar a computação do mapa de características é chamada de "truque do kernel". De fato, os vetores mapeados por características poderiam até ser de dimensão infinita, mas o kernel ainda pode ser computável de forma muito eficiente.

A função de kernel em si é uma função de dois vetores de dados de entrada. Inserindo cada par de vetores de dados do conjunto de dados como argumentos da função de kernel resulta em uma matriz simétrica e semi-definida positiva, chamada de matriz de kernel:

k=(k(x1,x1)k(x1,x2)...k(x2,x1)k(x2,x2)...)k = \begin{pmatrix}k(\vec{x}_1,\vec{x}_1) & k(\vec{x}_1,\vec{x}_2) & ... \\ k(\vec{x}_2,\vec{x}_1) & k(\vec{x}_2,\vec{x}_2) & ... \\ \vdots & \vdots & \ddots\end{pmatrix}

Depois de calcular a matriz de kernel, podemos encontrar os parâmetros ótimos (αi\alpha_i) usando métodos como software de programação quadrática ou um algoritmo chamado "otimização mínima sequencial". Claro, isso pressupõe que existe um kernel calculável eficientemente correspondente a um mapa de características que torna as classes de dados linearmente separáveis. Uma abordagem relacionada, mas nova, é a estimação de kernel quântico.

Kernels quânticos

Computadores quânticos, ou estados quânticos em geral, permitem uma definição muito natural de "kernel quântico". Podemos interpretar a codificação de uma entrada x\vec{x} em um estado quântico Φ(x)|\Phi(\vec{x})\rangle como um mapa de características. Esse processo pode de fato mapear os dados para um espaço de dimensão muito alta, como é comum em mapas de características clássicos, mas a dimensionalidade dependerá do método de codificação (veja a lição de Codificação de Dados). Lembre-se que o produto interno de dois estados quânticos ψϕ\langle \psi | \phi \rangle está relacionado com a probabilidade de medir o estado ϕ|\phi\rangle quando no estado ψ|\psi\rangle. Podemos estimar o produto interno dos dois pontos de dados mapeados Φ(xi)\vec{\Phi}(\vec{x}_i) e Φ(xj)\vec{\Phi}(\vec{x}_j) fazendo medições suficientes do circuito resultante.

Uma representação abstrata de um kernel como um circuito.

Como veremos mais tarde no curso, podemos usar medições num circuito quântico como o mostrado acima para estimar um kernel, e então podemos executar a otimização de SVM classicamente na matriz de kernel para aprender os parâmetros ajustáveis.

Classificadores quânticos variacionais e redes neurais

Outro algoritmo de aprendizado de máquina quântico de curto prazo é chamado de "circuitos quânticos variacionais" (VQCs). Quando esses circuitos são usados numa tarefa de classificação, você pode ver o mesmo acrônimo usado para se referir a "classificadores quânticos variacionais" (também VQCs). Eles frequentemente aproveitam estruturas semelhantes às redes neurais clássicas (NNs); e nesses casos você os verá descritos como redes neurais quânticas (QNNs). É importante entender que os VQCs são mais gerais e não precisam seguir uma estrutura de NN, mas começamos em analogia com as NNs para ajudar a esclarecer o papel que o quantum pode ter nos fluxos de trabalho existentes de aprendizado de máquina. Em seguida, discutiremos generalizações. Começamos recapitulando as redes neurais clássicas.

O vídeo abaixo dá uma breve revisão das redes neurais e onde elas se sobrepõem com os circuitos quânticos variacionais. Isso é explorado mais no texto.

Uma rede neural é um modelo computacional que é livremente inspirado pela estrutura e pela função dos neurônios num cérebro. Esses neurônios, que são nós que vemos na figura, são organizados em camadas e estão conectados através de pesos.

QML_CR_background_QNN_2ndlayer.png

A primeira camada é a camada de entrada, e as ativações an0a_n^0 dos neurônios nessa camada são alimentadas diretamente dos dados x\vec{x} a serem analisados (como o sombreamento de pixels individuais numa imagem, por exemplo). A camada final é uma camada de saída que descreve a categorização (como classificar uma imagem como tendo 90% de chance de ser um cachorro e 10% de chance de ser um gato, para continuar com o exemplo de imagem).

QML_CR_background_QNN_output.png

Os neurônios em cada camada processam sinais que recebem de uma camada anterior e os transmitem para a próxima através de pesos, wiw_i (as conexões no diagrama). Se focamos em um desses neurônios, temos o bloco de construção de uma rede neural, que é chamado de "perceptron". Matematicamente, um perceptron recebe um vetor de entrada x\vec{x} e calcula seu produto interno com um vetor de peso treinável mais algum viés. E muito importante, o perceptron aplica uma função de ativação não linear (σ\sigma) sobre esse cálculo. Essas funções de ativação não lineares são críticas para o grande poder expressivo das redes neurais. Outra forma de pensar nisso é que, se não tivéssemos não linearidade entre as camadas, poderíamos em princípio escrever toda a rede neural como uma grande multiplicação de matrizes. Isso simplesmente resultaria num modelo linear, que não seria capaz de capturar os padrões complexos que redes neurais profundas podem. Portanto, as funções de ativação não lineares são fundamentais nas redes neurais.

perceptron_CP.png

Funções como

f(x)=σ(wx+b)f(\vec{x}) = \sigma (\vec{w}\cdot \vec{x}+\vec{b})

são calculadas em cada neurônio usando os dados conhecidos x\vec{x} e a não linear σ\sigma e também os vetores desconhecidos de pesos w\vec{w} e vieses b\vec{b}. Em geral, pode haver pesos não nulos entre todos os neurônios de todas as camadas, e chamaríamos os pesos da camada LL para a camada L+1L+1 entre os neurônios mm e nn de wm,nLw^L_{m,n}. Da mesma forma, o viés no nºn^\text{º} neurônio da LªL^\text{ª} camada seria bnLb^L_n. Os vieses aqui não têm relação com os bb's da discussão de kernel quântico.

Você pode começar sua rede neural com um conjunto aleatório de pesos e vieses, ou a partir de uma configuração razoável e conhecida. A partir daí, a ideia é verificar o quão bem sua rede neural classifica as coisas e melhorá-la. Usamos uma função de custo para descrever o quanto nossa rede neural desvia da classificação correta. Há muitas maneiras de definir uma função de custo. Vamos descrever um exemplo comum, aqui, que envolve o erro quadrático médio (MSE):

C(wm,nL,bnL)=1Ni=1Ntrainj=1Noutputs(vi,jpi,j)2C(w^L_{m,n},b^L_n) = \frac{1}{N}\sum_{i=1}^{N_\text{train}}\sum_{j=1}^{N_\text{outputs}}{(v_{i,j}-p_{i,j})^2}

Dependendo da sua aplicação, isso pode significar calcular a diferença entre o valor real vi,jv_{i,j} de uma imagem ii dos dados de treinamento para a saída jj (digamos, por exemplo, um valor de 1,0 no neurônio da camada de saída para "cachorro" e 0 em todos os outros neurônios) e o valor previsto pi,jp_{i,j}. Eleve essa diferença ao quadrado e some sobre todas as categorias, para capturar não apenas se a categoria correta foi mais ativada, mas também se as ativações incorretas são reduzidas. Em seguida, somamos sobre todos os exemplos do nosso conjunto de treinamento e obtemos um custo.

Em seguida, variamos os parâmetros como os pesos em cada camada, entre todos os neurônios, e os vieses em todos os neurônios. Rotinas de otimização clássicas como descida de gradiente são usadas para buscar um mínimo local na função de custo.

Perceptron quântico

Para poder construir o equivalente quântico do perceptron, uma das coisas que precisamos considerar é como implementar a não linearidade com circuitos quânticos, que é o papel da função de ativação nas redes neurais clássicas. Isso porque sem considerações adicionais, os circuitos quânticos apenas implementam operações unitárias, que são simplesmente lineares. Existem diferentes métodos que podemos usar para introduzir não linearidade em circuitos quânticos. Um dos principais métodos é usar medições como fonte de não linearidade. Outras considerações incluem métodos baseados na transformada de Fourier quântica, medições de meio circuito ou circuitos dinâmicos, e traçar qubits para fora do circuito.

Rede neural quântica

Uma rede neural quântica (QNN) funciona primeiro codificando os dados de entrada com a camada unitária UU na figura, depois aplicando circuitos quânticos correspondentes a pesos entre as camadas (WW's abaixo), e finalmente uma camada de medição. Alguns pontos-chave sobre isso:

  • O carregamento de dados e as ponderações são operações lineares.
  • As medições são não lineares.
  • Portanto, como na NN clássica, temos componentes lineares e não lineares.
  • Os circuitos de peso ainda têm parâmetros variacionais, portanto ainda há uma minimização clássica a ser realizada.

Uma representação de uma rede neural quântica como um circuito.

Podemos usar um circuito como o acima para calcular uma função fQNN(x)=0U(X)WOWU(x)0f_{QNN}(x) = \langle 0|U^{\dagger}(X)W^{\dagger}OWU(x)|0\rangle Note que essa função geralmente não é a mesma que a função f(x)f(x) descrita nas NNs clássicas. Em particular, essa função inclui potencialmente muitas camadas de muitos pesos, e é aplicada em todos os dados carregados no seu circuito quântico por UU.

Generalizações

Podemos agora ver uma das formas de construir o equivalente quântico de uma rede neural. Neste modelo, o fluxo de informações é diferente de uma rede neural clássica de alimentação direta. No cenário clássico, as informações fluiriam da esquerda para a direita, começando com a entrada e terminando com a saída do modelo, e na direção inversa ao fazer a retropropagação para treinar o modelo.

Um diagrama mostrando várias camadas de portas dentro de uma rede neural quântica

No entanto, nessa construção de rede neural quântica, vemos que o bloco unitário que codifica os dados se repete entre os blocos unitários variacionais com os parâmetros treináveis. Essa estratégia, que chamamos de "reuploading de dados", é respaldada por resultados teóricos interessantes. De fato, um artigo de Pérez-Salinas et al. mostra que, com a ajuda de múltiplos reuploading de dados, "um único qubit fornece capacidades computacionais suficientes para construir um classificador quântico universal quando assistido por uma sub-rotina clássica." Portanto, o reuploading de dados é uma técnica que podemos usar para aprimorar a expressividade e o poder representacional do modelo, permitindo que a rede neural quântica aproxime funções complexas.

Referências

[1] "Reinforcement Learning: An Introduction", Richard S. Sutton and Richard G. Barto, MIT Press, Second Edition, Cambridge, MA, 2018

[2] "Pattern Recognition and Machine Learning", Christopher M. Bishop, Springer, 2006

[3] "Foundations of Machine Learning", Mehryar Mohri, Afshin Rostamizadeh, and Ameet Talwalkar, MIT Press, Second Edition, 2018.