¿Qué es un gráfico computacional dinámico?


19

Los marcos como PyTorch y TensorFlow a través de TensorFlow Fold admiten gráficos computacionales dinámicos y están recibiendo atención de los científicos de datos.

Sin embargo, parece haber una falta de recursos para ayudar a comprender los Gráficos Computacionales Dinámicos.

La ventaja de los gráficos computacionales dinámicos parece incluir la capacidad de adaptarse a cantidades variables en los datos de entrada. Parece que puede haber una selección automática del número de capas, el número de neuronas en cada capa, la función de activación y otros parámetros NN, dependiendo de cada instancia de conjunto de entrada durante el entrenamiento. ¿Es esta una caracterización precisa?

¿Cuáles son las ventajas de los modelos dinámicos sobre los modelos estáticos? ¿Es por eso que los DCG están recibiendo tanta atención? En resumen, ¿qué son los DCG y cuáles son los pros y los contras de su uso?

Respuestas:


8

Dos respuestas cortas

La respuesta corta desde una perspectiva teórica es que ...

Un gráfico computacional dinámico es un sistema mutable representado como un gráfico dirigido del flujo de datos entre operaciones. Se puede visualizar como formas que contienen texto conectado por flechas, por lo que los vértices (formas) representan operaciones en los datos que fluyen a lo largo de los bordes (flechas).

Tenga en cuenta que dicho gráfico define dependencias en el flujo de datos, pero no necesariamente el orden temporal de la aplicación de las operaciones, que puede volverse ambiguo en la retención de estado en vértices o ciclos en el gráfico sin un mecanismo adicional para especificar la precedencia temporal.

La respuesta breve desde una perspectiva de desarrollo de aplicaciones es que ...

Un marco Dynamic Computational Graph es un sistema de bibliotecas, interfaces y componentes que proporcionan una interfaz flexible, programática y en tiempo de ejecución que facilita la construcción y modificación de sistemas mediante la conexión de un conjunto finito pero quizás extensible de operaciones.

El marco PyTorch

PyTorch es la integración del marco Torch con el lenguaje Python y la estructuración de datos. Torch compite con Theano, TensorFlow y otros marcos de construcción dinámicos de sistemas computacionales.


———   Enfoques adicionales para la comprensión   ———

Estructuras computacionales arbitrarias de tensores discretos arbitrarios

Uno de los componentes que se pueden usar para construir un sistema computacional es un elemento diseñado para interconectarse para crear redes neuronales. La disponibilidad de estos apoya la construcción de aprendizaje profundo y redes neuronales de propagación hacia atrás. También se puede construir una amplia variedad de otros sistemas que involucran el ensamblaje de componentes que trabajan con datos potencialmente multidimensionales en estructuras computacionales definidas arbitrariamente.

Los datos pueden ser valores escalares, como números de punto flotante, enteros o cadenas, o agregaciones ortogonales de estos, como vectores, matrices, cubos o hipercubos. Las operaciones sobre la generalización de estos formularios de datos son tensores discretos y las estructuras creadas a partir del ensamblaje de operaciones de tensor en sistemas de trabajo son flujos de datos.

Puntos de referencia para comprender el concepto de computación dinámica

Los gráficos computacionales dinámicos no son un concepto particularmente nuevo, aunque el término es relativamente nuevo. El interés en los DCG entre los informáticos no es tan nuevo como el término Data Scientist. Sin embargo, la pregunta indica correctamente que hay pocos recursos bien escritos disponibles (aparte de los ejemplos de código) de los cuales uno puede aprender el concepto general que rodea su aparición y uso.

Un posible punto de referencia para comenzar a comprender los DCG es el patrón de diseño de Comando, que es uno de los muchos patrones de diseño popularizados por los proponentes del diseño orientado a objetos. El patrón de diseño de Comando considera las operaciones como unidades de cálculo cuyos detalles están ocultos de los objetos de comando que los activan. El patrón de diseño de Comando a menudo se usa junto con el patrón de diseño de Intérprete.

En el caso de los DCG, los patrones de diseño de Fachada y Compuesto también están involucrados para facilitar la definición de operaciones de tensor discreto plug-and-play que pueden ensamblarse juntas en patrones para formar sistemas.

Esta combinación particular de patrones de diseño para formar sistemas es en realidad una abstracción de software que se asemeja en gran medida a la idea radical que llevó al surgimiento de la arquitectura de Von Neumann, central para la mayoría de las computadoras de hoy. La contribución de Von Neumann a la aparición de la computadora es la idea de permitir que algoritmos arbitrarios que contengan lógica booleana, aritmética y ramificación se representen y almacenen como datos, un programa.

Otro precursor de los DCG son los motores de expresión. Los motores de expresión pueden ser tan simples como los motores aritméticos y tan complejos como las aplicaciones como Mathematica. Un motor de reglas es un poco como los DCG, excepto que los motores de reglas son declarativos y las meta-reglas para los motores de reglas operan en esas declaraciones.

Programas Programas de manipulación

Lo que tienen en común con los DCG es que el flujo de datos y operaciones que se aplicarán se puede definir en tiempo de ejecución. Al igual que con los DCG, algunas de estas bibliotecas y aplicaciones de software tienen API u otros mecanismos para permitir que las operaciones se apliquen a los detalles funcionales. Es esencialmente la idea de un programa que permite la manipulación de otro programa.

Otro punto de referencia para comprender este principio en un nivel primitivo es la declaración de cambio de mayúsculas y minúsculas disponible en algunos lenguajes de computadora. Es una estructura de código fuente por la cual el programador esencialmente expresa: "No estamos seguros de lo que debe hacerse, pero el valor de esta variable le dirá al modelo de ejecución en tiempo real qué hacer a partir de un conjunto de posibilidades".

La declaración de cambio de caso es una abstracción que extiende la idea de diferir la decisión en cuanto a la dirección del cálculo hasta el tiempo de ejecución. Es la versión de software de lo que se hace dentro de la unidad de control de una CPU contemporánea y una extensión del concepto de diferir algunos detalles del algoritmo. Una tabla de functores (punteros de función) en C o polimorfismo en C ++, Java o Python son otros ejemplos primitivos.

La computación dinámica lleva la abstracción más allá. Difieren la mayoría, si no todas, las especificaciones de los cálculos y las relaciones entre ellos para el tiempo de ejecución. Esta generalización integral amplía las posibilidades de modificación funcional en tiempo de ejecución.

Representación gráfica dirigida de la computación

De eso se trata el modelo dinámico computacional. Ahora para la parte Graph.

Una vez que uno decide diferir la elección de las operaciones que se realizarán hasta el tiempo de ejecución, se requiere una estructura para mantener las operaciones, sus relaciones de dependencia y quizás los parámetros de mapeo. Tal representación es más que un árbol sintáctico (como un árbol que representa la jerarquía del código fuente). A diferencia de un programa en lenguaje ensamblador o código de máquina, debe ser mutable de manera fácil y arbitraria. Debe contener más información que un gráfico de flujo de datos y mucho más que un mapa de memoria. ¿Cómo debe ser esa estructura de datos que especifica la estructura computacional?

Afortunadamente, cualquier algoritmo arbitrario, finito y acotado puede representarse como un gráfico dirigido de dependencias entre operaciones especificadas. En dicho gráfico, los vértices (a menudo representados como nodos de varias formas cuando se muestran) representan operaciones realizadas en los datos y los bordes (a menudo representados como flechas cuando se muestran) son representaciones digitales de información originada por alguna operación (o entrada del sistema) y de qué otras operaciones (o salida del sistema) dependen.

Tenga en cuenta que el gráfico dirigido no es un algoritmo (ya que se especifica una secuencia precisa de operaciones) ni una declaración (ya que los datos pueden almacenarse explícitamente y los bucles, ramas, funciones y módulos pueden definirse y anidarse).

La mayoría de estos marcos y bibliotecas de gráficos computacionales dinámicos permiten que los componentes realicen cálculos en la entrada de componentes que admiten el aprendizaje automático. Los vértices en el gráfico dirigido pueden ser simulaciones de neuronas para la construcción de una red neuronal o componentes que soportan el cálculo diferencial. Estos marcos presentan posibilidades de construcciones que pueden usarse para el aprendizaje profundo en un sentido más generalizado.

En el contexto de la historia de la computadora

Una vez más, nada de lo mencionado hasta ahora es nuevo para la informática. LISP permite que otros esquemas modifiquen los esquemas computacionales. Y la dimensionalidad de entrada generalizada y numerocity se integran en una serie de interfaces y protocolos plug-and-play de larga data. La idea de un marco para el aprendizaje se remonta al mismo período de mediados del siglo XX también.

Lo que es nuevo y está ganando popularidad es una combinación particular de características integradas y el conjunto asociado de terminología, una agregación de la terminología existente para cada una de las características, lo que lleva a una base más amplia para la comprensión de aquellos que ya estudian y trabajan en la industria del software. .

  • Sabor contemporáneo (moderno) de las interfaces API
  • Orientación a objetos
  • Soporte tensor discreto
  • La abstracción gráfica dirigida
  • Interoperabilidad con idiomas y paquetes populares que admiten big data, minería de datos, aprendizaje automático y análisis estadístico
  • Soporte para la construcción de redes neuronales arbitrarias y sistemáticas.
  • La posibilidad de una adaptación estructural dinámica de la red neuronal (que facilita la experimentación en plasticidad neuronal)

Muchos de estos marcos admiten la adaptabilidad para cambiar la dimensionalidad de entrada (número de dimensiones y el rango de cada una).

Similitud con los árboles de símbolos abstractos en los compiladores

También aparece un gráfico de dependencia de entradas y salidas de operaciones dentro de los árboles de símbolos abstractos (AST), que algunos de los compiladores más progresivos construyen durante la interpretación de la estructura del código fuente. El AST se usa para generar instrucciones de ensamblador o instrucciones de máquina en el proceso de vinculación con bibliotecas y formando un ejecutable. El AST es un gráfico dirigido que representa la estructura de los datos, las operaciones realizadas y el flujo de control especificado por el código fuente.

El flujo de datos es simplemente el conjunto de dependencias entre operaciones, que debe ser inherente en el AST para que el AST se use para crear instrucciones de ejecución en el ensamblador o en el código de máquina que sigue con precisión el algoritmo especificado en el código fuente.

Los marcos de gráficos computacionales dinámicos, a diferencia de las declaraciones de mayúsculas y minúsculas o los modelos AST en compiladores, pueden manipularse en tiempo real, optimizarse, ajustarse (como en el caso de las redes artificiales de plástico), invertirse, transformarse por tensores, diezmarse, modificarse para agregar o eliminar entropía, mutada de acuerdo con un conjunto de reglas, o traducida de otra manera a formas derivadas. Pueden almacenarse como archivos o secuencias y luego recuperarse de ellos.

Este es un concepto trivial para los programadores de LISP o aquellos que entienden la naturaleza de la recomendación de John von Neumann de almacenar las especificaciones operativas como datos. En este sentido posterior, un programa es un flujo de datos para instruir, a través de un compilador y un sistema operativo, un sistema computacional dinámico implementado en un circuito digital VLSI.

Logrando la Dimensionalidad y Numerocidad Adaptables

En la pregunta está el comentario que uno no dice: "Necesita tener un conjunto de datos, que todas las instancias dentro de él tengan el mismo número fijo de entradas". Esa declaración no promueve la comprensión precisa. Hay formas más claras de decir lo que es cierto acerca de la adaptabilidad de entrada.

Se debe definir la interfaz entre un DCG y otros componentes de un sistema general, pero estas interfaces pueden tener dimensionalidad dinámica o número de ciudad incorporados. Es una cuestión de abstracción.

Por ejemplo, un tipo de objeto tensor discreto presenta una interfaz de software específica, pero un tensor es un concepto matemático dinámico alrededor del cual se puede utilizar una interfaz común. Un tensor discreto puede ser un escalar, un vector, una matriz, un cubo o un hipercubo, y el rango de variables dependientes para cada dimensión puede ser variable.

Puede darse el caso de que la cantidad de nodos en una capa del sistema definida en un Gráfico Computacional Dinámico pueda ser una función del número de entradas de un tipo particular, y eso también puede ser un cálculo diferido para el tiempo de ejecución.

El marco puede ser programado para seleccionar la estructura de la capa (una extensión del paradigma de cambio de caja nuevamente) o calcular los parámetros que definen los tamaños de la estructura y la profundidad o activación. Sin embargo, estas características sofisticadas no son lo que califica el marco como un marco de gráficos computacionales dinámicos.

¿Qué califica un marco para soportar gráficos computacionales dinámicos?

Para calificar como un marco de Gráfico Computacional Dinámico, el marco debe simplemente apoyar la postergación de la determinación del algoritmo para el tiempo de ejecución, abriendo así la puerta a una gran cantidad de operaciones sobre las dependencias computacionales y el flujo de datos en el tiempo de ejecución. Los conceptos básicos de las operaciones diferidas deben incluir la especificación, manipulación, ejecución y almacenamiento de los gráficos dirigidos que representan los sistemas de operaciones.

Si la especificación del algoritmo NO se difiere hasta el tiempo de ejecución, sino que se compila en el ejecutable diseñado para un sistema operativo específico con solo la flexibilidad tradicional proporcionada por lenguajes de bajo nivel como if-then-else, switch-case, polymorphism, arrays of functores y cadenas de longitud variable, se considera un algoritmo estático.

Si las operaciones, las dependencias entre ellas, el flujo de datos, la dimensionalidad de los datos dentro del flujo y la adaptabilidad del sistema a la cantidad y dimensionalidad de entrada son variables en el tiempo de ejecución para crear un sistema altamente adaptativo, entonces el algoritmo es dinámico de estas formas.

Una vez más, los programas LISP que operan en programas LISP, motores de reglas con capacidades de meta-reglas, motores de expresión, bibliotecas de objetos de tensor discretos e incluso patrones de diseño de comandos relativamente simples son dinámicos en cierto sentido, diferiendo algunas características para el tiempo de ejecución. Los DCG son flexibles y completos en sus capacidades para soportar construcciones computacionales arbitrarias de tal manera que creen un ambiente rico para la experimentación de aprendizaje profundo y la implementación de sistemas.

Cuándo usar gráficos computacionales dinámicos

Los pros y los contras de los DCG son completamente específicos del problema. Si investiga los diversos conceptos de programación dinámica anteriores y otros que pueden estar estrechamente relacionados con ellos en la literatura asociada, será obvio si necesita un Gráfico Computacional Dinámico o no.

En general, si necesita representar un modelo de cómputo arbitrario y cambiante para facilitar la implementación del sistema de aprendizaje profundo, sistema de manipulación matemática, sistema adaptativo u otra construcción de software flexible y compleja que se corresponda bien con el paradigma DCG, entonces una prueba El concepto de uso de un marco de Gráficos Computatónicos Dinámicos es un buen primer paso para definir su arquitectura de software para la solución del problema.

No todo el software de aprendizaje utiliza DCG, pero a menudo son una buena opción, cuando la manipulación sistemática y posiblemente continua de una estructura computacional arbitraria es un requisito de tiempo de ejecución.


" PyTorch es la integración del marco de Torch para el lenguaje Python ". Creo que esta declaración puede malinterpretarse como " PyTorch es una biblioteca de contenedor para el marco de Torch para el lenguaje de Python ", lo que sería una declaración falsa. Probablemente deberías reformularlo.
nbro

" Con los marcos de gráficos computacionales dinámicos, a diferencia de las declaraciones de mayúsculas y minúsculas o los modelos AST intermedios en los compiladores, uno puede manipular las operaciones " ... " traducirlas ". ¿Qué quiere decir con "operaciones de traducción"?
nbro

1

En resumen, los gráficos de cálculo dinámico pueden resolver algunos problemas que los estáticos no pueden o son ineficientes debido a que no permiten el entrenamiento en lotes.

Para ser más específicos, el entrenamiento moderno de la red neuronal generalmente se realiza en lotes , es decir, procesando más de una instancia de datos a la vez. Algunos investigadores eligen un tamaño de lote como 32, 128, mientras que otros usan un tamaño de lote mayor a 10,000. El entrenamiento de instancia única suele ser muy lento porque no puede beneficiarse del paralelismo de hardware.

Por ejemplo, en el procesamiento del lenguaje natural, los investigadores quieren entrenar redes neuronales con oraciones de diferentes longitudes. Usando gráficos de cálculo estáticos, generalmente tendrían que hacer primero relleno , es decir, agregar símbolos sin sentido al principio o al final de las oraciones más cortas para hacer todas las oraciones de la misma longitud. Esta operación complica mucho la capacitación (por ejemplo, necesita enmascarar, redefinir las métricas de evaluación, desperdiciar una cantidad significativa de tiempo de cálculo en esos símbolos rellenados). Con un gráfico de cálculo dinámico, ya no se necesita relleno (o solo dentro de cada lote).

Un ejemplo más complicado sería (usar la red neuronal para) procesar las oraciones en función de sus árboles de análisis. Como cada oración tiene su propio árbol de análisis, cada una requiere un gráfico de cálculo diferente, lo que significa que el entrenamiento con un gráfico de cálculo estático solo puede permitir el entrenamiento de una sola instancia. Un ejemplo similar a esto es las redes neuronales recursivas .


0

Muchas redes neuronales profundas tienen un gráfico de flujo de datos estático, lo que significa aproximadamente que la estructura de su cálculo (su gráfico de cálculo) permanece estable en diferentes entradas. Esto es bueno, ya que podemos aprovechar esta característica para el rendimiento, como por ejemplo, mini-lote (procesando un montón de entradas a la vez).

Pero algunas redes neuronales podrían tener un gráfico de cálculo diferente para cada entrada. Esto causa algunos problemas (dificultades de procesamiento por lotes, la construcción de gráficos es computacionalmente costosa) y, por lo tanto, estas redes son un poco difíciles de usar.

El documento que vincula supera este problema al proponer un método que puede agrupar varios gráficos de cálculo en uno. Entonces, podemos hacer nuestras técnicas habituales de NN.

Los beneficios son las aceleraciones, lo que incentiva a los investigadores a explorar diferentes estructuras y ser más creativos, supongo.

La ventaja de los gráficos computacionales dinámicos parece incluir la capacidad de adaptarse a cantidades variables en los datos de entrada. Parece que puede haber una selección automática del número de capas, el número de neuronas en cada capa, la función de activación y otros parámetros NN, dependiendo de cada instancia de conjunto de entrada durante el entrenamiento. ¿Es esta una caracterización precisa?

Esto es incorrecto.


0

Los gráficos computacionales dinámicos son simplemente CG modificados con un mayor nivel de abstracción. La palabra 'Dinámico' lo explica todo: cómo los datos fluyen a través del gráfico depende de la estructura de entrada, es decir, la estructura DCG es mutable y no estática. Una de sus aplicaciones importantes es en redes neuronales de PNL.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.