Skip to content

Commit 1795b36

Browse files
authored
Update README.md
1 parent 8719d41 commit 1795b36

1 file changed

Lines changed: 291 additions & 0 deletions

File tree

README.md

Lines changed: 291 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,296 @@ Conteúdo:
262262
- Revisão rápida de classificação, regressão e redes neurais;
263263
- Introdução ao Machine Learning Quântico (QML);
264264
- Diferenças e vantagens potenciais do QML;
265+
266+
## [QML] Quantum Neural Networks (QNNs)
267+
Arquitetura de Quantum Neural Networks (QNNs): As **Redes Neurais Quânticas** (Quantum Neural Networks – QNNs) são modelos de aprendizado de máquina que utilizam circuitos quânticos parametrizados (Parameterized Quantum Circuits – PQCs) como seus blocos fundamentais. Elas se inserem no paradigma de **aprendizado híbrido quântico‑clássico**, onde a parte quântica processa informações em espaços de Hilbert de alta dimensionalidade e a parte clássica otimiza os parâmetros e realiza o pós‑processamento.
268+
269+
Neste texto, exploraremos a arquitetura típica de uma QNN, seus componentes, variações, técnicas de treinamento e implementações práticas usando as bibliotecas **PennyLane** e **Qiskit Machine Learning**.
270+
271+
1. Componentes fundamentais de uma QNN
272+
273+
Uma QNN é composta por três camadas principais:
274+
275+
1. **Codificação (Encoding)**
276+
Transforma dados clássicos $\mathbf{x} \in \mathbb{R}^d$ em um estado quântico $|\psi(\mathbf{x})\rangle$ através de portas parametrizadas pelos dados. Exemplos comuns:
277+
- *Angle encoding*: cada feature vira um ângulo de rotação ($R_y$, $R_z$).
278+
- *Amplitude encoding*: os dados normalizados definem as amplitudes do estado.
279+
- *Basis encoding*: cada bit clássico é representado diretamente por um qubit.
280+
281+
2. **Camadas variacionais (Ansatz)**
282+
Sequência de portas quânticas com parâmetros treináveis $\boldsymbol{\theta}$. Essas portas introduzem correlações (emaranhamento) e transformações não‑lineares. Um ansatz típico combina:
283+
- Rotações individuais (ex: $R_y(\theta_i)$)
284+
- Portas de emaranhamento (ex: $CNOT$, $CZ$, $CR_x$)
285+
- Repetição de blocos (camadas)
286+
287+
3. **Medição e pós‑processamento**
288+
Um ou mais qubits são medidos, produzindo valores esperados de observáveis (ex: $\langle Z \rangle$). Esses valores são combinados por uma camada clássica (ex: *softmax*, *sigmoid*) para gerar a saída final.
289+
290+
![Arquitetura esquemática de uma QNN híbrida](https://raw.githubusercontent.com/XanaduAI/quantum-machine-learning-guide/main/figures/hybrid_model.png)
291+
292+
---
293+
294+
2. Arquiteturas comuns de QNN
295+
296+
2.1 Classificador Variacional (VQC)
297+
298+
O **Variational Quantum Classifier** (VQC) é a QNN mais simples: dados são codificados, passam por um ansatz, e os valores esperados alimentam um classificador linear.
299+
300+
```python
301+
# Exemplo conceitual com PennyLane
302+
import pennylane as qml
303+
from pennylane import numpy as np
304+
305+
dev = qml.device('default.qubit', wires=2)
306+
307+
@qml.qnode(dev)
308+
def qnn(params, x):
309+
qml.AngleEmbedding(x, wires=range(2)) # encoding
310+
qml.BasicEntanglerLayers(params, wires=range(2)) # ansatz
311+
return qml.expval(qml.PauliZ(0)), qml.expval(qml.PauliZ(1))
312+
313+
def hybrid_model(params, x):
314+
out = qnn(params, x)
315+
return np.tanh(out[0] + out[1]) # pós‑processamento
316+
```
317+
318+
2.2 Data Re‑uploading
319+
320+
Proposto por Pérez‑Salinas et al. (2020), este modelo insere os dados repetidamente entre camadas variacionais, aumentando a capacidade expressiva.
321+
322+
```
323+
Camada 1: Encoding → Variacional
324+
Camada 2: Encoding → Variacional
325+
...
326+
Camada L: Encoding → Variacional → Medição
327+
```
328+
329+
Cada re‑uploading permite que os dados influenciem o circuito em múltiplos pontos, o que equivale a aumentar a não‑linearidade.
330+
331+
2.3 Quantum Convolutional Neural Networks (QCNN)
332+
333+
Inspiradas em CNNs clássicas, as QCNNs aplicam convoluções e pooling quânticos para reduzir gradualmente o número de qubits. São especialmente úteis para dados estruturados (ex: imagens) e possuem vantagens teóricas na detecção de simetrias.
334+
335+
```python
336+
def qcnn_layer(params, wires):
337+
# Exemplo de convolução + pooling
338+
qml.CNOT(wires=[wires[0], wires[1]])
339+
qml.RY(params[0], wires=wires[0])
340+
qml.RY(params[1], wires=wires[1])
341+
# Pooling: mede um qubit e condiciona o outro
342+
m = qml.measure(wires[0])
343+
qml.cond(m, qml.PauliX)(wires[1])
344+
return [wires[1]] # reduz número de qubits
345+
```
346+
347+
2.4 Quantum Generative Adversarial Networks (QGAN): Redes adversárias onde tanto o gerador quanto o discriminador são circuitos quânticos (ou híbridos). Gerador aprende a produzir distribuições de dados; discriminador tenta distinguir dados reais dos gerados.
348+
349+
3. Treinamento de QNNs: O treinamento de uma QNN consiste em minimizar uma função custo $C(\boldsymbol{\theta})$ usando otimizadores clássicos. Como a saída de um circuito quântico é geralmente contínua (valor esperado), podemos usar gradientes calculados via:
350+
351+
- **Parameter Shift Rule**: regra exata para portas da forma $e^{-i\theta P/2}$:
352+
$\frac{\partial f}{\partial \theta} = \frac{1}{2} [f(\theta + \pi/2) - f(\theta - \pi/2)]$
353+
354+
- **Gradientes automáticos** via frameworks (PennyLane, TensorFlow Quantum, Qiskit) que internamente aplicam a regra ou realizam diferenciação numérica.
355+
356+
A otimização é realizada com otimizadores clássicos: Adam, SGD, COBYLA, etc. Em ambientes híbridos, a retropropagação (backpropagation) ocorre normalmente, com as portas quânticas tratadas como camadas diferenciáveis.
357+
358+
4. Implementações práticas em Python
359+
360+
4.1 QNN com PennyLane + PyTorch (classificação binária)
361+
362+
```python
363+
import pennylane as qml
364+
import torch
365+
import torch.nn as nn
366+
from sklearn.datasets import make_classification
367+
from sklearn.model_selection import train_test_split
368+
from sklearn.preprocessing import StandardScaler
369+
370+
# Configuração do dispositivo quântico
371+
n_qubits = 4
372+
dev = qml.device('default.qubit', wires=n_qubits)
373+
374+
@qml.qnode(dev, interface='torch')
375+
def quantum_layer(weights, inputs):
376+
# Angle encoding
377+
qml.AngleEmbedding(inputs, wires=range(n_qubits))
378+
# Camadas variacionais
379+
for i in range(len(weights)):
380+
qml.RY(weights[i], wires=i % n_qubits)
381+
qml.CNOT(wires=[i % n_qubits, (i+1) % n_qubits])
382+
# Medição de um observável por qubit
383+
return [qml.expval(qml.PauliZ(i)) for i in range(n_qubits)]
384+
385+
class HybridQNN(nn.Module):
386+
def __init__(self, n_qubits, n_layers):
387+
super().__init__()
388+
self.n_qubits = n_qubits
389+
# Parâmetros variacionais: n_layers * n_qubits (simplificado)
390+
self.weights = nn.Parameter(torch.randn(n_layers * n_qubits))
391+
# Camada clássica final
392+
self.fc = nn.Linear(n_qubits, 1)
393+
394+
def forward(self, x):
395+
batch_size = x.shape[0]
396+
q_out = []
397+
for sample in x:
398+
q_out.append(quantum_layer(self.weights, sample))
399+
q_out = torch.stack(q_out)
400+
return torch.sigmoid(self.fc(q_out))
401+
402+
# Dados sintéticos
403+
X, y = make_classification(n_samples=500, n_features=n_qubits, n_classes=2)
404+
X = StandardScaler().fit_transform(X)
405+
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
406+
407+
# Converter para tensores PyTorch
408+
X_train = torch.tensor(X_train, dtype=torch.float32)
409+
y_train = torch.tensor(y_train, dtype=torch.float32).view(-1, 1)
410+
X_test = torch.tensor(X_test, dtype=torch.float32)
411+
y_test = torch.tensor(y_test, dtype=torch.float32).view(-1, 1)
412+
413+
model = HybridQNN(n_qubits=4, n_layers=3)
414+
criterion = nn.BCELoss()
415+
optimizer = torch.optim.Adam(model.parameters(), lr=0.1)
416+
417+
for epoch in range(50):
418+
optimizer.zero_grad()
419+
pred = model(X_train)
420+
loss = criterion(pred, y_train)
421+
loss.backward()
422+
optimizer.step()
423+
if epoch % 10 == 0:
424+
print(f"Epoch {epoch}, loss: {loss.item():.4f}")
425+
426+
# Avaliação
427+
with torch.no_grad():
428+
acc = ((model(X_test) > 0.5) == y_test).float().mean()
429+
print(f"Acurácia: {acc.item():.4f}")
430+
```
431+
432+
4.2 QNN com Qiskit Machine Learning (VQC)
433+
434+
```python
435+
from qiskit import QuantumCircuit
436+
from qiskit.circuit import ParameterVector
437+
from qiskit.primitives import Sampler
438+
from qiskit_machine_learning.algorithms import VQC
439+
from qiskit_machine_learning.neural_networks import SamplerQNN
440+
from qiskit_machine_learning.connectors import TorchConnector
441+
from sklearn.datasets import load_iris
442+
from sklearn.model_selection import train_test_split
443+
import torch
444+
445+
# Carregar dados (iris com 2 classes)
446+
data, labels = load_iris(return_X_y=True)
447+
data = data[labels <= 1]
448+
labels = labels[labels <= 1]
449+
X_train, X_test, y_train, y_test = train_test_split(data, labels, test_size=0.2)
450+
451+
# Criar feature map (codificação)
452+
feature_map = QuantumCircuit(2)
453+
feature_map.ry(ParameterVector('x', 2), [0, 1]) # angle encoding
454+
455+
# Criar ansatz (camadas variacionais)
456+
ansatz = QuantumCircuit(2)
457+
params = ParameterVector('θ', 4)
458+
ansatz.ry(params[0], 0)
459+
ansatz.ry(params[1], 1)
460+
ansatz.cx(0, 1)
461+
ansatz.ry(params[2], 0)
462+
ansatz.ry(params[3], 1)
463+
464+
# Criar SamplerQNN (rede neural quântica)
465+
qnn = SamplerQNN(
466+
circuit=ansatz,
467+
input_params=feature_map.parameters,
468+
weight_params=ansatz.parameters,
469+
sampler=Sampler()
470+
)
471+
472+
# Conectar ao PyTorch
473+
model = TorchConnector(qnn, initial_weights=torch.randn(4))
474+
475+
# Treinar com PyTorch
476+
criterion = torch.nn.BCEWithLogitsLoss()
477+
optimizer = torch.optim.Adam(model.parameters(), lr=0.1)
478+
479+
X_train_t = torch.tensor(X_train, dtype=torch.float32)
480+
y_train_t = torch.tensor(y_train, dtype=torch.float32).view(-1, 1)
481+
482+
for epoch in range(50):
483+
optimizer.zero_grad()
484+
pred = model(X_train_t).squeeze()
485+
loss = criterion(pred, y_train_t)
486+
loss.backward()
487+
optimizer.step()
488+
if epoch % 10 == 0:
489+
print(f"Epoch {epoch}, loss: {loss.item():.4f}")
490+
491+
# Avaliação
492+
with torch.no_grad():
493+
pred_test = model(torch.tensor(X_test, dtype=torch.float32))
494+
acc = ((pred_test > 0.5) == torch.tensor(y_test, dtype=torch.float32).view(-1,1)).float().mean()
495+
print(f"Acurácia: {acc.item():.4f}")
496+
```
497+
498+
4.3 Data Re‑uploading com PennyLane
499+
500+
```python
501+
dev = qml.device('default.qubit', wires=2)
502+
503+
@qml.qnode(dev)
504+
def reuploading_model(params, x):
505+
n_layers = len(params) // 2 # 2 parâmetros por camada (um por qubit)
506+
for l in range(n_layers):
507+
# Encoding
508+
qml.RY(x[0], wires=0)
509+
qml.RY(x[1], wires=1)
510+
# Variacional
511+
qml.RY(params[2*l], wires=0)
512+
qml.RY(params[2*l+1], wires=1)
513+
qml.CNOT(wires=[0,1])
514+
return qml.expval(qml.PauliZ(0))
515+
516+
# Os parâmetros são treinados para classificar (ex: usando PyTorch)
517+
```
518+
519+
5. Desafios e considerações
520+
521+
- **Barren plateaus**: em grandes circuitos aleatórios, os gradientes tendem a zero exponencialmente, dificultando o treinamento. Estratégias incluem inicialização cuidadosa, escolha de ansatz estruturados e uso de técnicas como *layerwise learning*.
522+
- **Hardware NISQ**: ruído, número limitado de qubits e baixa fidelidade restringem a complexidade dos circuitos.
523+
- **Expressividade**: nem todo problema se beneficia da computação quântica; há necessidade de entender quando uma QNN pode superar modelos clássicos.
524+
- **Overfitting**: assim como redes clássicas, QNNs podem sofrer com sobreajuste, exigindo regularização e validação cuidadosa.
525+
526+
6. Tendências futuras
527+
528+
- **Circuitos mais profundos e tolerantes a falhas**: com o avanço da correção de erros, QNNs maiores poderão ser implementadas.
529+
- **Integração com frameworks clássicos**: o ecossistema PennyLane, Qiskit, TensorFlow Quantum e outros continuam a evoluir, permitindo prototipagem híbrida transparente.
530+
- **Aplicações práticas**: química computacional, otimização, finanças e problemas de simetria (ex: partículas físicas) são áreas onde QNNs já mostram vantagens.
531+
532+
7. Conclusão
533+
534+
As Quantum Neural Networks representam um dos caminhos mais promissores para a combinação de computação quântica e aprendizado de máquina. Sua arquitetura modular – codificação, ansatz variacional e pós‑processamento – permite flexibilidade e integração com bibliotecas clássicas. Apesar dos desafios atuais (barren plateaus, hardware ruidoso), as QNNs já podem ser estudadas e aplicadas em simulações e pequenos dispositivos reais, servindo como laboratório para explorar o potencial quântico na IA.
535+
536+
Para aprofundar, recomendo:
537+
- *Pennylane Documentation: Quantum Machine Learning*
538+
- *Qiskit Machine Learning Tutorials*
539+
- Artigo seminal: *“Classification with Quantum Neural Networks on Near Term Processors”* (Farhi & Neven, 2018)
540+
- *“Data re-uploading for a universal quantum classifier”* (Pérez-Salinas et al., 2020)
541+
542+
```python
543+
# Exemplo final: uma QNN simples em 5 linhas de PennyLane
544+
import pennylane as qml
545+
dev = qml.device('default.qubit', wires=2)
546+
@qml.qnode(dev)
547+
def qnn(params, x):
548+
qml.templates.AngleEmbedding(x, wires=range(2))
549+
qml.templates.BasicEntanglerLayers(params, wires=range(2))
550+
return qml.expval(qml.PauliZ(0))
551+
```
552+
553+
Agora você tem uma base sólida para projetar, treinar e explorar suas próprias Quantum Neural Networks.
554+
265555
- Arquitetura de Quantum Neural Networks (QNNs);
266556
- Bibliotecas para QML;
267557
- Qiskit Machine Learning e Pennylane.
@@ -280,6 +570,7 @@ Implementação:
280570
- Construção de um classificador quântico usando Qiskit e Pennylane;
281571
- Comparação com modelos clássicos.Estudo de Caso:Projeto final: Aplicação prática do QML em um problema de classificação simples nos computadores quânticos da Google (ex.: reconhecimento de padrões em imagens ou séries temporais).
282572

573+
## [QML] Correção de Erros Quânticos
283574
Correção de Erros Quânticos: Desafios dos Sistemas Quânticos: Os sistemas quânticos são inerentemente frágeis. A interação com o ambiente, imperfeições no controle e limitações dos dispositivos atuais introduzem erros que comprometem a execução de algoritmos quânticos de larga escala. A **correção de erros quânticos (QEC)** é a área que desenvolve códigos e protocolos para proteger a informação quântica, permitindo computação tolerante a falhas.
284575

285576
1. Ruído e decoerência

0 commit comments

Comments
 (0)