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.