Quantum computers
• Apuntes de Elena Peral
Quadratic Program
Xo , X1 , X2
Objective a xo +
bxz +
(Xz + dxz + exi +
fxz +
gXoxz + hxoxz + ixz +
(X2Xz + kX
transform into a matrix
MATRIZ ISING :
HERMITIAN
Xo a
X2B <↑ /OBJECTIVE /Y axo +
dxgX2xo hx2Xo
&
X28
=*
.
4 -
1 , 1) offset [C ,
B , U] gXoX1 bxy +
exijx2x1 B
ANSATZ j
hxox2 JX1Xz RXz
(Xz +
143
Pregunta de examen : Es una matriz válida como una matriz de
ISING : HERMITIAN ? - sea simétrica
positiva
óptimo
y
# el número que sale de la multiplicación es un mínimo
1. Simétrica
=
a
[Xox1Xz]d axotbx +
cx +
axoxextex +
gxxxxxxx
Pregunta de examen :
Objetivo matriz Hermitian
¿ Por qué la matriz es
diagonal ?
y
< Y(H(4) =
3(Min)
H(4) =
114)
We need to create a circuit that create a state
103 R20) &
the
You don't need
10) Ro * structe of the problem
be to create
you re
going
10 Rylos
with
a
general solution a
circuit.
general
You need a circuit that is able to get all the solutions .
SALE !!
3 factores circuito genérico
>
-
Expresibility : vector que diga donde está la solución
N
E
:
What with
>
-
Trainability happend angles O directamente
tiene propotional to -
2
9 ser the angle
Complexity tiene
>
- :
que estar completo,
Tiene
que tener algo cuántico porque
no
podemos hacer un circuito clásico (solo con rotacionales)
-F = F(bi + s) +
+(0i -
S)
25
sS &
103 R20)
Estamos perdiendo
10) Ro
parámetros , no se
puede usar
10 Rylos
si las variaciones son
muy pequeñas hay un
problema.
si
empiezo en /o) y hago variaciones en 7 no cambia
&
IY Esol
we are not
getting a
perfect solution
we
get an
approximation
the circuit has not enough expresibility to
get a
perfect solution .
the circuit has to te short
if the comprexity of your problema the circuit will
grow be the number of gubits ↑4
sigubits
&
no le was a
Acercar al mínimo
Optimal ansatz para conseguir la solución
8/04/2024
Patterns
Building blocks
Steps : .
1 Map >
- Quantum Circuit
Generic circuit
.
2 Optimize > Transpile ↓
Isa circuit
. Run
3 QC >
- Estimator
↓
. Post
4 Process - val
Exp
Twirling s 127 obs
& (x +
(xx(x
⑫
e&
103 - & .
:
127 * I
página Varational quantum eigensolver
>
- :
6 stocks -
Xo .... Xn <1 0 .
returns >
-
... Mu
No
Covariance =
[ij
&
Objective :
&XiMi-qXi[ijX
const [xi B
Decplex - QP
d
Qiskit QP-QP
↓
Ising
↓
VQE
&
transform docplex ap giskit &P
maps
NP
Estimator()feature
V QE-ESTIM ANSATZ , OPTIMIZER
22-04- 24
QP
↓
Qiskit QP &
OPERATOR (OFFSET)
E
ANSATZX
CLASSICAL VQE
>
OPTIMI
backend = Aer Simulator ()
SVM clásico
Las Máquinas de Soporte Vectorial (SVM) son un tipo de algoritmo de aprendizaje
automático supervisado utilizado para tareas de clasificación y regresión. Las SVM
funcionan encontrando el hiperplano que mejor separa los datos en diferentes clases. El
hiperplano se elige para maximizar el margen entre las clases, y los vectores de soporte son
los puntos de datos que están más cerca del límite de decisió[Link] principales de modelos
SVM:
1. Modelo Lineal:
- Margen Duro: Esto asume que los datos son perfectamente separables por una línea
recta (o hiperplano). El objetivo es encontrar el hiperplano que separa completamente las
clases sin ningún error de clasificación. Sin embargo, esta suposición a menudo es
demasiado estricta y puede llevar a un sobreajuste, especialmente cuando se trata de datos
ruidosos o superpuestos.
- Margen Suave: Esta es una aproximación más flexible que permite cierto error de
clasificación. La idea es encontrar un hiperplano que minimice los errores de clasificación
mientras maximiza el margen. Esto es especialmente útil cuando los datos no son
perfectamente separables.
Aprendizaje de modelos lineales, muchas otras maneras:Perceptrón simple, Adaline,
Support Vector Machines con kernel lineal, Red de neuronas con una neurona oculta
2. Modelo No Lineal (Núcleos):
- En casos donde los datos no son linealmente separables, las SVM se pueden extender
para manejar límites de decisión no lineales utilizando funciones de núcleo. Las funciones
de núcleo transforman las características de entrada a un espacio de dimensiones
superiores, haciendo posible encontrar un hiperplano que pueda separar las clases en este
espacio transformado.
- Funciones de núcleo comunes incluyen núcleos polinómicos y núcleos de función de
base radial (RBF). Estos núcleos permiten que las SVM capturen relaciones complejas en
los datos.
Análisis de Datos: Las SVM son poderosas por varias razones:
- Son efectivas en espacios de alta dimensión, lo que las hace adecuadas para tareas con
muchas características.
- Las SVM son eficientes en memoria porque solo utilizan un subconjunto de puntos de
entrenamiento (vectores de soporte) para definir el límite de decisión.
- El uso de núcleos permite que las SVM manejan relaciones no lineales en los datos.
Sin embargo, las SVM pueden tener limitaciones, como la sensibilidad a la elección de
parámetros y la necesidad de escalar adecuadamente las características de entrada.
Al trabajar con SVM, es crucial seleccionar cuidadosamente el núcleo apropiado y ajustar
los hiperparámetros para lograr el mejor rendimiento en un conjunto de datos dado.
Además, comprender las características de los datos, como la separabilidad, ayuda a elegir
el modelo SVM y los parámetros adecuados.
¿Qué hiperplano elegir?: Un hiperplano (una línea en este caso) son todos aquellos
puntos x cuya proyección sobre w es la misma (d):
La elección del hiperplano en una Máquina de Soporte Vectorial (SVM) es fundamental para
la eficacia del modelo. En un contexto de SVM lineal, el hiperplano es la línea (o superficie
en dimensiones superiores) que separa las clases de datos. Aquí hay algunas
consideraciones clave:
1. **Margen Óptimo:**
- En un SVM de margen duro, el objetivo es encontrar el hiperplano que maximiza el
margen entre las clases. El margen es la distancia entre el hiperplano y los puntos de datos
más cercanos de cada clase. Un mayor margen generalmente resulta en un modelo más
robusto y generalizable.
2. **Margen Suave:**
- En un SVM de margen suave, se permite cierto error de clasificación para manejar datos
que no son perfectamente separables. La elección del hiperplano implica encontrar un
equilibrio entre maximizar el margen y permitir algunos errores de clasificación. Esto es
particularmente útil cuando los datos tienen cierto grado de superposición o ruido.
3. **Selección de Parámetros:**
- La elección del hiperplano también está influenciada por la configuración de parámetros,
como el parámetro de regularización (C en SVM lineal). Un valor más bajo de C permite un
margen más amplio y acepta más errores de clasificación, mientras que un valor más alto
de C penaliza los errores de clasificación y produce un margen más estrecho.
4. **Kernel en Modelos No Lineales:**
- En SVM no lineales que utilizan funciones de núcleo, la elección del hiperplano se
relaciona con la elección de la función de núcleo y sus parámetros. El hiperplano en el
espacio de características transformado por el núcleo debe ser capaz de separar las clases
de manera efectiva.
5. **Validación Cruzada:**
- La validación cruzada es crucial para la selección del hiperplano. Se puede realizar
ajuste de hiperparámetros utilizando técnicas como la validación cruzada para encontrar la
combinación óptima que maximice la capacidad predictiva del modelo en datos no vistos.S
La distancia d de un punto x0 a un hiperplano definido por en una SVM
se calcula como:
Donde w es el vector normal al hiperplano,x0 es el vector de características del punto, b es
el sesgo,|.| representa el valor absoluto, y ||w|| es la longitud del vector w.. Esta distancia
indica cuán lejos está el punto del hiperplano y es útil para determinar la relevancia del
punto en el modelo SVM.
Margen de clasificación Los xi más cercanos al hiperplano son los vectores de soporte. El
margen ρ es la distancia entre los vectores de soporte de las distintas clases.
El margen (M) en una Máquina de Soporte Vectorial (SVM) se calcula mediante la
fórmula: Donde w es el vector de pesos del hiperplano.
Maximización del margen: implica encontrar el hiperplano que separa las clases y maximiza
la distancia entre este hiperplano y los puntos de datos más cercanos de ambas clases.
En SVM con Soft Margin, se introducen las variables de holgura (\(\xi\)) para permitir
cierto error de clasificación y manejar datos que no son linealmente separables. La
formulación de la función objetivo cambia de la siguiente manera:
Interpretación de C
- Si C tiene un valor grande, el modelo dará más peso a minimizar las variables de
holgura (\(\xi\)), lo que resultará en un margen más estrecho y menos errores de
clasificación.
- Si C tiene un valor pequeño, el modelo permitirá más variables de holgura, lo que
puede dar lugar a un margen más amplio y permitir más errores de clasificación.
Esto ayuda a manejar datos ruidosos o ligeramente superpuestos, evitando el
sobreajuste.
— Si C es muy grande, el resultado es similar al de hard margin
Soft Margin vs. Hard Margin
Soft Margin es más robusta al ruido y a los outliers siempre tiene una solución (Hard
Margin no, si los datos no son linealmente separables) Pero Soft Margin requiere
estimar el coste (el parámetro C).
Modelo no linea (kernel)l: Datos no separables linealmente en dos dimensiones,
pero si en tres dimensiones, con la proyección adecuada Es decir, una separación
lineal en el espacio proyectado corresponde a una separación circular en el espacio
origina
- Kernels: se reduce el caso no lineal a lineal mediante la proyección. El
algoritmo de optimización a utilizar es el mismo Kernel: es una función que
realiza la proyección de manera implícita
Tipos: — Lineal: no hace proyección — Polinómico: proyección al espacio de
atributos producto — Gaussiano: proyección a infinitas dimensiones
Problema dual: En el caso no lineal, primero proyectamos a otro espacio mediante una
función y después hacemos el producto escalar. Los kernels (funcones) hacen la proyeccion
y el producto escalar todo a la vez.
Kernel polinómico: encontrar límites de decisión no lineales en el espacio
transformado, lo que puede ser útil para datos que no son linealmente separables en
el espacio original.
Kernel cuadrático: para manejar datos que no se pueden separar linealmente.
Kernel trick: técnica en aprendizaje automático que permite realizar operaciones en
un espacio de características de alta dimensión sin necesidad de calcular
explícitamente todas las transformaciones. Es especialmente útil en SVM cuando se
utilizan kernels
Kernel gaussiano o kernel de función de base radial (RBF), eficaz para capturar
patrones no lineales y se utiliza en problemas donde la relación entre las variables
no es claramente polinómica
Metodología para el uso de SVMs
1. Normalizar (escalado) los atributos
2. Encontrar los parámetros más apropiados
— Parámetro C (coste, complejidad): • Valor grande: complejidad mayor, posible
sobreaprendizaje • Valor pequeño: complejidad menor, tal vez mejor generalización,
tal vez underfitting (infra-aprendizaje)
— Kernel: • Lineal: ninguno • Polinómico: exponente (p) • Gaussiano: gamma o sigma
— En el caso de regresión, también ε
3. Construir el modelo con los mejores parámetros y todo el conjunto de
entrenamiento
DOC notas QSVM
Estimator_qnn
- Forward
- Backward
1. Introducción
1.1. Redes Neuronales Cuánticas vs. Clásicas
Las redes neuronales clásicas son modelos algorítmicos inspirados en el cerebro
humano que pueden entrenarse para reconocer patrones en datos y aprender a
resolver problemas complejos. Están basadas en una serie de nodos interconectados, o
neuronas, organizadas en una estructura en capas, con parámetros que pueden
aprenderse aplicando estrategias de entrenamiento de aprendizaje automático o
profundo.
La motivación detrás del aprendizaje automático cuántico (QML, por sus siglas en
inglés) es integrar conceptos de la computación cuántica y el aprendizaje automático
clásico para abrir el camino a esquemas de aprendizaje nuevos y mejorados. Las redes
neuronales cuánticas (QNNs) aplican este principio genérico al combinar redes
neuronales clásicas y circuitos cuánticos parametrizados. Debido a que se encuentran
en la intersección de dos campos, las QNNs pueden ser vistas desde dos perspectivas:
Desde una perspectiva de aprendizaje automático, las QNNs son, una vez más,
modelos algorítmicos que pueden entrenarse para encontrar patrones ocultos en
datos de manera similar a sus contrapartes clásicas. Estos modelos pueden cargar
datos clásicos (entradas) en un estado cuántico y luego procesarlos con compuertas
cuánticas parametrizadas por pesos entrenables. La Figura 1 muestra un ejemplo
genérico de una QNN que incluye los pasos de carga y procesamiento de datos. La
salida de medir este estado puede luego introducirse en una función de pérdida para
entrenar los pesos mediante retropropagación.
Desde una perspectiva de computación cuántica, las QNNs son algoritmos cuánticos
basados en circuitos cuánticos parametrizados que pueden entrenarse de manera
variacional utilizando optimizadores clásicos. Estos circuitos contienen un mapa de
características (con parámetros de entrada) y un ansatz (con pesos entrenables), como
se muestra en la Figura 1.
Figura 1. Estructura genérica de la red neuronal cuántica (QNN).
Como se puede observar, estas dos perspectivas son complementarias y no
necesariamente se basan en definiciones estrictas de conceptos como "neurona cuántica" o
lo que constituye una "capa" en una QNN.
1.2. Implementación en qiskit-machine-learning
Las QNN en qiskit-machine-learning se conciben como unidades computacionales
independientes de la aplicación que pueden utilizarse para diferentes casos de uso, y su
configuración dependerá de la aplicación para la que se necesiten. El módulo contiene una
interfaz para las QNN y dos implementaciones específicas:
- NeuralNetwork: La interfaz para redes neuronales. Esta es una clase abstracta de la que
heredan todas las QNN.
- EstimatorQNN: Una red basada en la evaluación de observables mecánicos cuánticos.
- SamplerQNN: Una red basada en las muestras resultantes de medir un circuito cuántico.
Estas implementaciones se basan en los primitivos de qiskit. Los primitivos son el punto de
entrada para ejecutar QNN en un simulador o en hardware cuántico real. Cada
implementación, EstimatorQNN y SamplerQNN, recibe una instancia opcional de su
primitiva correspondiente, que puede ser cualquier subclase de BaseEstimator y
BaseSampler, respectivamente.
La clase NeuralNetwork es la interfaz para todas las QNN disponibles en
qiskit-machine-learning. Expone un pase hacia adelante y otro hacia atrás que toman
muestras de datos y pesos entrenables como entrada.
Es importante destacar que las NeuralNetworks son "sin estado". No contienen capacidades
de entrenamiento (estas se delegan a los algoritmos o aplicaciones reales: clasificadores,
regresores, etc.) ni almacenan los valores de los pesos entrenables.
Ahora veamos ejemplos específicos para las dos implementaciones de
NeuralNetwork. Pero primero, establezcamos la semilla algorítmica para
asegurarnos de que los resultados no cambien entre ejecuciones.
2. Cómo instanciar QNNs
2.1. EstimatorQNN
El EstimatorQNN recibe como entrada un circuito cuántico parametrizado, así como un
observable mecánico cuántico opcional, y produce cálculos de valores esperados durante el
pase hacia adelante. El EstimatorQNN también acepta listas de observables para construir
QNNs más complejas.
Veamos un EstimatorQNN en acción con un ejemplo sencillo. Comenzamos construyendo el
circuito parametrizado. Este circuito cuántico tiene dos parámetros, uno que representa una
entrada de QNN y otro que representa un peso entrenable:
Junto con el circuito cuántico definido anteriormente y el observable que hemos creado, el
constructor de EstimatorQNN toma los siguientes argumentos clave:
- estimator: instancia primitiva opcional
- input_params: lista de parámetros del circuito cuántico que deben tratarse como "entradas
de la red"
- weight_params: lista de parámetros del circuito cuántico que deben tratarse como "pesos
de la red"
En este ejemplo, decidimos previamente que el primer parámetro de params1 debería ser la
entrada, mientras que el segundo debería ser el peso. Como estamos realizando una
simulación local de estado vectorial, no estableceremos el parámetro "estimator"; la red
creará automáticamente una instancia de la primitiva Estimator de referencia para nosotros.
Si necesitáramos acceder a recursos en la nube o simuladores Aer, tendríamos que definir
las respectivas instancias de Estimator y pasarlas a EstimatorQNN.
Veremos cómo usar la QNN en las secciones siguientes, pero antes de eso, echemos un
vistazo a la clase SamplerQNN.
2.2. SamplerQNN
SamplerQNN se instancia de manera similar a EstimatorQNN, pero debido a que consume
directamente muestras de la medición del circuito cuántico, no requiere un observable
personalizado.
Estas muestras de salida se interpretan de forma predeterminada como las probabilidades
de medir el índice entero correspondiente a una cadena de bits. Sin embargo, SamplerQNN
también nos permite especificar una función de interpretación para procesar las muestras
posteriormente. Esta función debe estar definida de manera que tome un entero medido (de
una cadena de bits) y lo relacione con un nuevo valor, es decir, un entero no negativo.
(!) Es importante tener en cuenta que si se define una función de interpretación
personalizada, la forma de salida no se puede inferir mediante la red y debe proporcionarse
explícitamente.
(!) También es importante tener en cuenta que si no se utiliza una función de interpretación,
la dimensión del vector de probabilidad aumentará exponencialmente con el número de
qubits. Con una función de interpretación personalizada, esta escala puede cambiar. Si, por
ejemplo, un índice se asigna a la paridad de la cadena de bits correspondiente, es decir, a 0 o
1, el resultado será un vector de probabilidad de longitud 2, independientemente del número
de qubits.
Creemos un circuito cuántico diferente para SamplerQNN. En este caso, tendremos dos
parámetros de entrada y cuatro pesos entrenables que parametrizan un circuito
bidireccional.
Al igual que con EstimatorQNN, debemos especificar las entradas y los pesos al instanciar
SamplerQNN. En este caso, los argumentos clave serán:
- sampler: instancia primitiva opcional
- input_params: lista de parámetros del circuito cuántico que deben tratarse como "entradas
de la red"
- weight_params: lista de parámetros del circuito cuántico que deben tratarse como "pesos
de la red"
Por favor, ten en cuenta que, una vez más, estamos optando por no establecer la instancia
de Sampler en la QNN y confiar en la configuración predeterminada.
Además de los argumentos básicos mostrados anteriormente, SamplerQNN acepta
tres configuraciones adicionales: input_gradients, interpret y output_shape. Estas se
presentarán en las secciones 4 y 5.
aentrada
Cómo realizar un pase hacia adelante e
aplicaciónracione
de
3.1. Configuración ,
cántica
En un entorno real, las entradas se definirían mediante el conjunto de datos y
los pesos se definirían mediante el algoritmo de entrenamiento o como parte
de un modelo preentrenado. Sin embargo, para este tutorial, especificaremos
conjuntos de entradas y pesos aleatorios de la dimensión adecuada:
3.1.1. Ejemplo de EstimatorQNN
Cómo realizar un pase hacia atrás
Aprovechemos las entradas y pesos definidos anteriormente para mostrar cómo funciona el
pase hacia atrás. Este pase devuelve una tupla (input_gradients, weight_gradients). De
forma predeterminada, el pase hacia atrás solo calculará gradientes con respecto a los
parámetros de peso.
Si deseas habilitar gradientes con respecto a los parámetros de entrada, debes establecer la
siguiente bandera durante la instanciación de QNN:
```python
qnn = ...QNN(..., input_gradients=True)
```
Recuerda que los gradientes de entrada son necesarios para el uso de TorchConnector para
la integración con PyTorch.
Neural Network Classifier
Clasificación
Preparamos un conjunto de datos de clasificación sencillo para ilustrar los siguientes
algoritmos.
Clasificación con un EstimatorQNN
Primero mostramos cómo se puede utilizar un EstimatorQNN para clasificación dentro de un
NeuralNetworkClassifier. En este contexto, se espera que el EstimatorQNN devuelva una
salida unidimensional [-1,+1]. Esto solo funciona para clasificación binaria, y asignamos las dos
clases a {-1,+1}. Para simplificar la composición de un circuito cuántico parametrizado a partir
de un mapa de características y un ansatz, podemos utilizar la clase QNNCircuit.
Crear un quantum neural network
Añadiremos una función de retorno llamada `callback_graph`. Esta será llamada en cada
iteración del optimizador y se le pasarán dos parámetros: los pesos actuales y el valor de la
función objetivo en esos pesos. En nuestra función, agregamos el valor de la función objetivo a
un arreglo para poder graficar la iteración versus el valor de la función objetivo y actualizar el
gráfico con cada iteración. Sin embargo, puedes hacer lo que desees con una función de retorno
siempre y cuando se le pasen los dos parámetros mencionados.
Ahora, cuando el modelo está entrenado, podemos explorar los pesos de la red neuronal. Ten
en cuenta que el número de pesos está definido por el ansatz.
Torch Connector
Parte 1: Clasificación y Regresión Sencillas
1. Clasificación
En primer lugar, mostraremos cómo TorchConnector permite entrenar una Red Neuronal
Cuántica para resolver tareas de clasificación utilizando el motor de diferenciación automática
de PyTorch. Para ilustrar esto, realizaremos una clasificación binaria en un conjunto de datos
generado aleatoriamente.
A. Clasificación con PyTorch y EstimatorQNN
Vincular un EstimatorQNN a PyTorch es relativamente sencillo. Aquí ilustraremos esto
utilizando el EstimatorQNN construido a partir de un mapa de características y un ansatz.
Optimizer
La elección del optimizador para entrenar cualquier modelo de aprendizaje
automático puede ser crucial para determinar el éxito del resultado del
entrenamiento. Al usar TorchConnector, tenemos acceso a todos los algoritmos de
optimización definidos en el paquete [[Link]] (enlace). Algunos de los
algoritmos más famosos utilizados en arquitecturas populares de aprendizaje
automático incluyen Adam, SGD o Adagrad. Sin embargo, para este tutorial,
utilizaremos el algoritmo L-BFGS ([Link]), uno de los algoritmos de
optimización de segundo orden más conocidos para la optimización numérica.
Loss Function
En cuanto a la función de pérdida, también podemos aprovechar los módulos
predefinidos de PyTorch de [Link], como las pérdidas de entropía cruzada o el
error cuadrático medio.
Se puede hacer lo mismo con el SamplerQNN.