Path: blob/master/site/es-419/quantum/tutorials/gradients.ipynb
25118 views
Copyright 2020 The TensorFlow Authors.
Cálculo de gradientes
En este tutorial se exploran los algoritmos con los que se calculan los gradientes para los valores esperados de los circuitos cuánticos.
El cálculo del gradiente de un valor esperado de un observable en un circuito cuántico es un proceso complejo. Los valores esperados de los observables no se pueden dar el lujo de tener fórmulas de gradientes analíticos que siempre sean fáciles de escribir; a diferencia de lo que sucede con las transformaciones de aprendizaje automático tradicional, como la multiplicación matricial o la suma de vectores que tienen fórmulas de gradientes analíticos que son fáciles de escribir. Como resultado, hay diferentes métodos para calcular los gradientes cuánticos que resultan prácticos para los diferentes escenarios posibles. En este tutorial se comparan y contrastan dos esquemas de diferenciación distintos.
Preparación
Instalar TensorFlow Quantum:
Ahora, hay que importar TensorFlow y las dependencias del módulo:
1. Avance preliminar
Formémonos una idea algo más concreta de lo que es el cálculo de gradientes para circuitos cuánticos. Supongamos que tenemos un circuito parametrizado como el siguiente:
Junto con un observable:
Al observar este operador sabemos que
y si definimos entonces . Veamos esto:
2. La necesidad de un diferenciador
Con circuitos más grandes, no siempre uno tiene la suerte de contar con una fórmula que calcule con precisión los gradientes de un circuito cuántico dado. En caso de que una fórmula simple no sea suficiente para calcular el gradiente, la clase tfq.differentiators.Differentiator
permite definir algoritmos para calcular los gradientes de los circuitos. Por ejemplo, podemos recrear el ejemplo anterior en TensorFlow Quantum (TFQ) con:
Sin embargo, si cambiamos y estimamos la esperanza basándonos en las muestras (lo que pasaría en un dispositivo verdadero) los valores podrían variar un poco. Lo que significa que ahora tenemos una estimación imperfecta:
Esto se puede agravarse rápidamente y causar un problema grave con la exactitud en lo que respecta a los gradientes:
Aquí se puede observar que, a pesar de que la fórmula de diferencia finita funciona rápido para calcular los gradientes en un caso analítico, cuando trabajamos con métodos basados en muestras se vuelve demasiado ruidosa. Por lo tanto, conviene utilizar técnicas más minuciosas para garantizar que se calcule un buen gradiente. A continuación, observaremos una técnica mucho más lenta que probablemente tampoco sea la ideal para los cálculos de gradientes de esperanza analítica, pero que tenga un desempeño superior en un caso basado en una muestra del mundo real:
A partir de lo anterior, podemos ver que existen ciertos diferenciadores que funcionan mejor con algunos escenarios de investigación en particular. En general, los métodos basados en muestras más lentos que son robustos ante el ruido del dispositivo, entre otras cosas, son excelentes diferenciadores, cuando se usan en pruebas o se implementan algoritmos en un entorno más cercano al "mundo real". Los métodos más rápidos como los de diferencia finita son excelentes para los cálculos analíticos y cuando se desea obtener un mayor rendimiento, pero no están vinculados aún a la viabilidad del algoritmo en el dispositivo.
3. Muchos observables
Presentemos un segundo observable y veamos la compatibilidad que ofrece TensorFlow Quantum a múltiples observables para un solo circuito.
Si este observable se usa con el mismo circuito de antes, entonces, tenemos y . Hagamos una comprobación rápida:
Coincide (o está lo suficientemente cerca).
Ahora, si definimos , entonces . La determinación de más de un observable en TensorFlow Quantum para usar junto con un circuito equivale a agregar más términos a .
Significa que el gradiente de un símbolo en particular dentro de un circuito es igual a la suma de los gradientes respecto de cada observable de ese símbolo aplicado a ese mismo circuito. Esto es compatible con la toma y propagación hacia atrás de gradientes de TensorFlow (dada la suma de los gradientes de todos los observables como el gradiente de un símbolo en particular).
Aquí observamos que la primera entrada es la esperanza de w.r.t Pauli X y la segunda es la esperanza de w.r.t Pauli Z. Ahora, cuando tomamos el gradiente:
Hemos verificado que la suma de los gradientes para cada observable es, en definitiva, el gradiente de . Este comportamiento es compatible con todos los diferenciadores de TensorFlow Quantum y es crucial para la compatibilidad con el resto de TensorFlow.
4. Uso avanzado
Todos los diferenciadores que existen dentro de TensorFlow Quantum tienen la subclase tfq.differentiators.Differentiator
. Para implementar un diferenciador, un usuario debe implementar una de dos interfaces. Lo estándar es implementar get_gradient_circuits
, que le indica a la clase de base qué circuitos medir para obtener una estimación del gradiente. Como alternativa, se pueden sobrecargar differentiate_analytic
y differentiate_sampled
; la clase tfq.differentiators.Adjoint
toma su ruta.
En el siguiente caso se usa TensorFlow Quantum para implementar el gradiente de un circuito. Usaremos un ejemplo pequeño de un cambio de parámetro.
Retomemos el circuito definido arriba en este texto, . Al igual que antes, podemos definir una función como el valor esperado de este circuito con respecto al observable , . Al utilizar las reglas para cambios de parámetros, en este circuito, podemos hallar que la derivada es . La función get_gradient_circuits
devuelve los componentes de esta derivada.
La clase de base Differentiator
usa los componentes devueltos por get_gradient_circuits
para calcular la derivada, como en la fórmula para el cambio de parámetro que vimos arriba. Este nuevo diferenciador, ahora, puede usarse con objetos tfq.layer
existentes:
Este nuevo diferenciador, ahora se puede usar para generar operaciones diferenciables.
Punto clave: Si un diferenciador que ya se ha adjuntado previamente a una operación, antes de adjuntarlo a la operación nueva, hay que actualizarlo. Porque un diferenciador solamente debe adjuntarse a una operación por vez.
Excelente: Ahora, podemos usar todos los diferenciadores que TensorFlow Quantum tiene para ofrecer y, además, podemos definir el propio.