Programación diferenciable


Con cuatro parámetros, puedo preguntarle a un elefante, y con cinco puedo hacer que mueva su trompa.
- John Von Neumann

La idea de " programación diferenciable " es muy popular en el mundo del aprendizaje automático. Para muchos, no está claro si este término refleja un cambio real en la forma en que los investigadores entienden el aprendizaje automático, o es simplemente (otro) cambio de marca del "aprendizaje profundo". Esta publicación explica qué hay de nuevo en la programación diferenciada (o ∂P) en la tabla de aprendizaje automático.


Lo más importante, la programación diferenciada es el cambio opuesto a la dirección del aprendizaje profundo; desde modelos cada vez más parametrizados hasta modelos más simples que utilizan la estructura del problema en mayor medida.


A continuación, hojeamos un lienzo de texto poco interesante, queremos descubrir qué es la auto diferenciación e incluso poblarla desde una catapulta.


Fuerza bruta con beneficios


La diferenciabilidad es una idea básica que hace que el aprendizaje profundo sea tan exitoso. Cuando las búsquedas de fuerza bruta, incluso para unos pocos cientos de parámetros del modelo, serían demasiado caras, los gradientes permiten un recorrido pseudoaleatorio de partes interesantes del espacio de parámetros y encuentran un buen conjunto. Realizando un algoritmo aparentemente tan ingenuo, obtenemos una buena generalidad, pero está lejos de ser obvio que necesitamos diferenciar, por ejemplo, trabajar con secuencias en la traducción de idiomas, pero todo resulta ser simple, mostramos un poco de ingenio.


¿Qué pasa con las neuronas biológicas y y=σ(W vecesx+b)? No hay nada especial en esta fórmula; Este es un ejemplo simple y flexible de una función no lineal altamente paramétrica. De hecho, esta es probablemente la peor característica en la mayoría de los casos. Una capa de la red neuronal, en principio, puede clasificar imágenes de gatos, pero solo usando un truco relativamente poco interesante. ¡Funciona perfectamente! - pero la letra pequeña advierte que puede necesitar más parámetros que átomos en el universo. Para que este trabajo funcione, debe codificar la estructura problemática en el modelo; aquí es donde comienza a parecerse más a la programación tradicional.


Por ejemplo, las ConvNets tienen una gran ventaja sobre el perceptrón, porque funcionan con núcleos de imágenes , que se sabe que usan invariancia traslacional. Cara: es la cara, independientemente de si se muestra en la esquina superior izquierda de la imagen o en el centro, pero donde el perceptrón debe estudiar este caso en cada caso, el núcleo puede responder de inmediato a cualquier parte de la imagen. Es difícil analizar las redes convolucionales en términos estadísticos, pero es mucho más fácil considerarlas como una versión automática de lo que los expertos en procesamiento de imágenes escribieron a mano. El núcleo de la imagen es el primer y más fácil programa diferenciable.


Estructura de codificación, Redux


Los kits de herramientas de ML son cada vez más compatibles con la diferenciación algorítmica (AD), lo que nos permite diferenciar modelos utilizando bucles, ramas y recursividad, o cualquier programa construido sobre un conjunto de primitivas matemáticas diferenciables. Esto condujo a una arquitectura más compleja: los modelos de PNL se parecen cada vez más a los analizadores de gramática clásicos con modelos aumentados de pila , e incluso puede diferenciar un análogo de una máquina Turing o un intérprete de lenguaje de programación .


El último paso dado por la programación diferenciada es no considerar más la multiplicación matricial, la convolución y el RNN como elementos fundamentales del aprendizaje profundo, sino solo como casos especiales. Podemos aplicar métodos de aprendizaje profundo a cualquier función diferenciable parametrizada f(x). Funciones tan complejas como simuladores físicos o trazadores de rayos también se pueden diferenciar y optimizar. Incluso la computación cuántica puede encajar en esta estructura.



Los científicos han utilizado durante mucho tiempo modelos mecanicistas que se encuentran entre la programación explícita y el aprendizaje automático. Las ecuaciones diferenciales con parámetros libres utilizados en física, epidemiología o farmacodinámica son equivalentes a las redes neuronales en todo, excepto en la terminología. Simplemente tienen como objetivo proporcionar una funcionalidad mucho más estrecha, porque es más simple.


El progreso realmente poderoso es este: la diferenciabilidad generalizada significa que todos estos métodos se conectan entre sí como ladrillos de lego .
En lugar de escribir siempre nuevos programas para ML, podemos reutilizar los programas existentes utilizando motores físicos dentro de modelos robóticos basados ​​en el aprendizaje profundo. Donde los algoritmos modernos de aprendizaje de refuerzo necesitan construir un modelo detallado del mundo exterior basado solo en lo que serán recompensados ​​(suena como fuerza bruta ), en su lugar, simplemente podemos aplicar un conocimiento detallado y preciso de los sistemas físicos antes de que el aprendizaje comience.


Incluso las áreas más maduras de aprendizaje profundo no se hacen a un lado; después del núcleo de convolución, el siguiente paso natural para los modelos de imagen es un rastreador de rayos diferenciable . La representación 3D contiene una gran cantidad de conocimiento estructural sobre cómo se muestran las escenas en píxeles, que seguirán desempeñando un papel en nuestra cocina. Digamos que un modelo toma decisiones en un entorno simulado que se muestra como píxeles, que el modelo utiliza como entrada. En principio, ahora podemos hacer que todo el ciclo sea diferenciable, lo que nos permitirá ver directamente la influencia del entorno en las decisiones del modelo y viceversa. Esto puede aumentar significativamente la potencia de un entorno simulado realista para modelos de entrenamiento, como los automóviles con conducción automática.


Como en la ciencia, los modelos híbridos pueden ser más eficientes y resolver algunos de los inconvenientes entre el aprendizaje profundo y la programación explícita. Por ejemplo, un planificador de ruta de vuelo de drones puede tener un componente de red neuronal que solo puede realizar cambios ligeramente correctivos en un programa explícito confiable, haciendo que se analice su comportamiento general, mientras se adapta a los datos empíricos. Esto también es bueno para la interpretabilidad: los parámetros de los modelos mecanicistas y las simulaciones generalmente tienen interpretaciones físicas claras, por lo que si el modelo evalúa los parámetros internos, hace una declaración clara sobre lo que, en su opinión, sucede afuera.


Si todo esto es tan maravilloso, ¿por qué no todos se dieron por vencidos y se apresuraron a aprender a diferenciar? Desafortunadamente, las limitaciones de los marcos existentes dificultan la construcción de modelos de tal complejidad, y es imposible reutilizar la gran cantidad de conocimiento incrustado en el código científico existente. La necesidad de volver a implementar motores físicos desde cero en un lenguaje de modelado muy limitado convierte un guión de diez líneas en un proyecto de investigación de varios años. Pero los avances en el lenguaje y la tecnología de compilación , especialmente la diferenciación automática , nos acercan al Santo Grial: "solo diferencia mi motor de juego, por favor".


Entonces, ¿qué es la programación diferenciada?


La programación diferenciada le permite aplicar métodos de aprendizaje profundo a programas existentes complejos, reutilizando con ellos una gran cantidad de conocimiento incrustado en ellos. Aprendizaje profundo, estadísticas, programación y ciencia, todo lo que trata de decir su palabra al modelar el mundo que nos rodea, es hora de combinarlo todo, uniéndolo como partículas en un colisionador de hadrones . Esto mejorará los modelos actuales y permitirá que ML se aplique en áreas donde sus limitaciones actuales, ya sea la interpretabilidad o los requisitos computacionales y de datos, los hacen individualmente inaplicables.


Problemas de gestión diferenciables


A continuación, mostramos que la diferenciabilidad puede traer algunas tareas de administración simples pero clásicas, en las que usualmente utilizamos el aprendizaje de refuerzo (RL) como un cuadro negro. Los modelos diferenciables (modelos ∂P) no solo revelan estrategias de control mucho más efectivas, sino que también aprenden varios órdenes de magnitud más rápido. El código está disponible para su estudio; en la mayoría de los casos, se aprende en unos segundos en cualquier computadora portátil.


Sigue el gradiente


La diferenciación es la fuerza impulsora en casi todos los pasos del aprendizaje profundo; para esta función y=f(x)usamos el gradiente  fracdydxpara descubrir cómo un cambio en x afectará a y . A pesar de la naturaleza matemática, los gradientes son en realidad un concepto muy general e intuitivo. Olvídate de las fórmulas que tenías que mirar en la escuela; hagamos algo más divertido, como arrojar algo por un camino parabólico.



Cuando lanzamos proyectiles con la ayuda de un tiro tres, nuestra x (entrada) representa la configuración (por ejemplo, el tamaño del contrapeso o el ángulo de expulsión), e y es la distancia que recorre el proyectil antes de aterrizar. Si está tratando de apuntar, el gradiente le dice algo muy útil: aumentar o disminuir un determinado parámetro. Para maximizar la distancia, solo sigue el gradiente.


OK, pero ¿cómo obtenemos el parámetro correcto? Pero con la ayuda de algo complicado llamado diferenciación algorítmica , que le permite diferenciar no solo fórmulas simples que aprendió en la escuela, sino también programas de cualquier complejidad, por ejemplo, nuestro simulador Trebuchet . Como resultado, podemos tomar un simulador simple escrito en Julia y un paquete diff diff DiffEq sin un estudio profundo, y obtener gradientes para él en una llamada de función.


 # what you did in school gradient(x -> 3x^2 + 2x + 1, 5) # (32,) # something a little more advanced gradient((wind, angle, weight) -> Trebuchet.shoot(wind, angle, weight), -2, 45, 200) # (4.02, -0.99, 0.051) 

Tirando cosas


Necesitamos apuntar el trebuchet en el objetivo, usando gradientes para ajustar el ángulo de eyección; Esto se llama estimación de parámetros, y ya hemos visto ejemplos similares . Podemos hacer la tarea más interesante moviéndonos al meta-método: en lugar de apuntar el trebuchet a un objetivo, optimizamos la red neuronal, que puede apuntar a cualquier objetivo. Así es como funciona: una red neuronal acepta dos entradas, una distancia objetivo en metros y una velocidad actual del viento. En la red, se establecen los ajustes para el trebuchet (la masa del contrapeso y el ángulo de disparo), que se envían a un simulador que calcula la distancia recorrida. Luego comparamos con nuestro objetivo y nos movemos a lo largo de toda la cadena para ajustar el peso de la red. Nuestro "conjunto de datos" es un conjunto de objetivos y velocidades del viento seleccionados al azar.



Una buena característica de este modelo simple es que el aprendizaje es rápido porque expresamos exactamente lo que queremos del modelo de una manera completamente diferenciable. Inicialmente, se ve así:



Después de unos cinco minutos de entrenamiento (en el mismo núcleo del procesador de mi computadora portátil) se ve así:



Si desea influir en la trayectoria, aumente la velocidad del viento:



Desviado por 16 cm, o aproximadamente 0.3%. ¿Qué hay de apuntar al trebuchet directamente? Esto es fácil de hacer con el descenso de gradiente, dado que tenemos gradientes. Sin embargo, este es un proceso iterativo lento que tarda unos 100 ms cada vez. Por el contrario, el funcionamiento de una red neuronal tarda 5 μs (veinte mil veces más rápido) con una ligera pérdida de precisión. Este truco, llamado "inversión de función aproximada a través de gradientes", es muy común y puede usarse no solo con sistemas dinámicos, sino también con un algoritmo de transferencia de estilo rápido .


Este es el problema de gestión más simple posible que utilizamos principalmente con fines ilustrativos. Pero podemos aplicar los mismos métodos de formas más avanzadas a los problemas clásicos de RL.


Carrito, conoce el poste


Un desafío de gestión más reconocible es CartPole , el "Hola mundo" para el aprendizaje por refuerzo. El desafío es aprender a equilibrar el pilar vertical empujando su base hacia la izquierda o hacia la derecha. Nuestra configuración es generalmente similar al caso de Trebuchet: la implementación de Julia nos permite considerar directamente las recompensas recibidas por el medio ambiente como pérdidas. ∂P nos permite cambiar sin problemas de un modelo simple a un modelo RL.



Un lector astuto puede notar un inconveniente. El área de acción para el piso, un desplazamiento hacia la izquierda o hacia la derecha, es discreta y, por lo tanto, no es diferenciable. Resolvemos este problema introduciendo discretización diferenciable, definida de la siguiente manera :


f (x) = \ left \ {\ begin {matrix} \, 1, \, x \ geqslant0 \\ -1, \, x <0 \ end {matrix} \ right. $


 fracdfdx=1


En otras palabras, hacemos que el gradiente se comporte como si fEra una función idéntica. Dado lo mucho que la idea matemática de diferenciabilidad ya se usa en ML, quizás no sea sorprendente que simplemente podamos engañar aquí; Para el entrenamiento, todo lo que necesitamos es una señal para informar nuestra caminata pseudoaleatoria alrededor del espacio de parámetros, y el resto son los detalles. Los resultados hablan por sí mismos. En los casos en que los métodos RL necesitan ser entrenados en cientos de episodios antes de resolver el problema, los modelos ∂P solo necesitan alrededor de 5 episodios para finalmente ganar.



El péndulo y el backprop a través del tiempo


Un objetivo importante para RL (aprendizaje de refuerzo) es manejar la remuneración diferida cuando una acción no nos ayuda a mejorar los resultados de varios pasos seguidos. Cuando el entorno es diferenciable, ∂P le permite entrenar al agente en la propagación hacia atrás en el tiempo, ¡como en una red recursiva! En este caso, el estado del entorno se convierte en un "estado oculto" que cambia entre los pasos de tiempo.



Para demostrar esta técnica, consideramos un modelo de péndulo , donde la tarea es balancear el péndulo hasta que esté en posición vertical y mantenerlo en equilibrio inestable. Esto es difícil para los modelos RL; Después de aproximadamente 20 episodios de entrenamiento, el problema está resuelto, pero a menudo el camino hacia la solución claramente no es óptimo. En contraste, BPTT puede superar la clasificación de los líderes de RL en un episodio de entrenamiento. Es instructivo observar cómo se desarrolla este episodio; Al comienzo de la grabación, la estrategia es aleatoria y el modelo mejora con el tiempo. El ritmo de aprendizaje es casi alarmante.



El modelo es muy adecuado para mecanizar cualquier ángulo inicial y tiene algo cercano a la estrategia óptima. Al reiniciar, el modelo se ve más o menos así.



Esto es solo el comienzo; lograremos un verdadero éxito aplicando DP a entornos con los cuales RL es generalmente demasiado difícil de trabajar, donde ya existen simulaciones y modelos ricos (como en la mayoría de las ciencias de ingeniería y naturales), y donde la interpretabilidad es un factor importante (como en la medicina).


El mapa no es el territorio


Una limitación de estos modelos de juguetes es que equiparan el entorno de aprendizaje simulado con el entorno de prueba; Por supuesto, el mundo real no es diferenciable. En un modelo más realista, la simulación nos proporciona un patrón de comportamiento aproximado, que los datos refinan. Estos datos informan, por ejemplo, de los efectos simulados del viento, que, a su vez, mejora la calidad de los gradientes que el simulador pasa al controlador. Los modelos incluso pueden formar parte del pase directo del controlador, lo que le permite refinar sus pronósticos sin tener que estudiar la dinámica del sistema desde cero. Aprender estas nuevas arquitecturas hará que el trabajo futuro sea emocionante.


Coda


La idea básica es que la programación diferenciable, en la que simplemente escribimos un programa numérico arbitrario y lo optimizamos utilizando gradientes, es una forma poderosa de crear mejores modelos y arquitecturas similares al aprendizaje profundo, especialmente cuando tenemos una gran biblioteca de programas diferenciables a la mano . Los modelos descritos son solo vistas previas, pero esperamos que den una idea de cómo estas ideas pueden implementarse de una manera más realista.


Así como la programación funcional implica razonar y expresar algoritmos utilizando patrones funcionales, la programación diferenciable implica expresar algoritmos utilizando patrones diferenciables. La comunidad de aprendizaje profundo ya ha desarrollado muchos de estos patrones de diseño, por ejemplo, para manejar problemas de gestión o una estructura de datos consistente y en forma de árbol. A medida que crezca el área, se inventará mucho más y, como resultado de estos programas, probablemente incluso las arquitecturas de aprendizaje profundo más avanzadas se verán groseras y hacia atrás.


Referencias



Source: https://habr.com/ru/post/459562/


All Articles