Qu'est-ce qu'un graphe de calcul dynamique?


19

Des cadres tels que PyTorch et TensorFlow à TensorFlow Fold prennent en charge les graphiques de calcul dynamiques et reçoivent l'attention des scientifiques des données.

Cependant, il semble y avoir un manque de ressources pour aider à comprendre les graphiques de calcul dynamiques.

L'avantage des graphiques de calcul dynamiques semble inclure la possibilité de s'adapter à des quantités variables dans les données d'entrée. Il semble qu'il puisse y avoir une sélection automatique du nombre de couches, du nombre de neurones dans chaque couche, de la fonction d'activation et d'autres paramètres NN, en fonction de chaque instance d'ensemble d'entrée pendant la formation. Est-ce une caractérisation précise?

Quels sont les avantages des modèles dynamiques par rapport aux modèles statiques? Est-ce pour cela que les DCG reçoivent beaucoup d'attention? En résumé, que sont les DCG et quels sont les avantages et les inconvénients de leur utilisation?

Réponses:


8

Deux réponses courtes

La réponse courte d'un point de vue théorique est que ...

Un graphique de calcul dynamique est un système modifiable représenté comme un graphique dirigé du flux de données entre les opérations. Il peut être visualisé comme des formes contenant du texte relié par des flèches, les sommets (formes) représentant les opérations sur les données circulant le long des bords (flèches).

Notez qu'un tel graphique définit des dépendances dans le flux de données mais pas nécessairement l'ordre temporel de l'application des opérations, qui peut devenir ambigu dans la conservation de l'état dans les sommets ou les cycles dans le graphique sans mécanisme supplémentaire pour spécifier la priorité temporelle.

La réponse courte du point de vue du développement d'applications est que ...

Un framework Dynamic Computational Graph est un système de bibliothèques, d'interfaces et de composants qui fournit une interface d'exécution flexible et programmatique qui facilite la construction et la modification des systèmes en connectant un ensemble d'opérations fini mais peut-être extensible.

Le cadre PyTorch

PyTorch est l'intégration du framework Torch avec le langage Python et la structuration des données. Torch est en concurrence avec Theano, TensorFlow et d'autres cadres de construction de systèmes informatiques dynamiques.


———   Approches supplémentaires pour comprendre   ———

Structures de calcul arbitraires de tenseurs discrets arbitraires

L'un des composants qui peut être utilisé pour construire un système informatique est un élément conçu pour être interconnecté pour créer des réseaux de neurones. La disponibilité de ceux-ci prend en charge la construction d'apprentissage en profondeur et la propagation des réseaux de neurones. Une grande variété d'autres systèmes impliquant l'assemblage de composants qui fonctionnent avec des données potentiellement multidimensionnelles dans des structures de calcul définies arbitrairement peuvent également être construits.

Les données peuvent être des valeurs scalaires, telles que des nombres à virgule flottante, des entiers ou des chaînes, ou des agrégations orthogonales de ceux-ci, telles que des vecteurs, des matrices, des cubes ou des hyper-cubes. Les opérations de généralisation de ces fiches sont des tenseurs discrets et les structures créées à partir de l'assemblage d'opérations de tenseurs en systèmes de travail sont des flux de données.

Points de référence pour comprendre le concept de calcul dynamique

Les graphiques de calcul dynamiques ne sont pas un concept particulièrement nouveau, même si le terme est relativement nouveau. L'intérêt des DCG pour les informaticiens n'est pas aussi nouveau que le terme Data Scientist. Néanmoins, la question indique correctement qu'il y a peu de ressources bien écrites disponibles (autres que des exemples de code) à partir desquelles on peut apprendre le concept global entourant leur émergence et leur utilisation.

Un point de référence possible pour commencer à comprendre les DCG est le modèle de conception Command qui est l'un des nombreux modèles de conception popularisés par les partisans de la conception orientée objet. Le modèle de conception de commande considère les opérations comme des unités de calcul dont les détails sont cachés aux objets de commande qui les déclenchent. Le modèle de conception Command est souvent utilisé en conjonction avec le modèle de conception Interpreter.

Dans le cas des DCG, les modèles de conception Composite et Façade sont également impliqués pour faciliter la définition des opérations de tenseurs discrets plug-and-play qui peuvent être assemblées en modèles pour former des systèmes.

Cette combinaison particulière de modèles de conception pour former des systèmes est en fait une abstraction logicielle qui ressemble en grande partie à l'idée radicale qui a conduit à l'émergence de l'architecture Von Neumann, au cœur de la plupart des ordinateurs aujourd'hui. La contribution de Von Neumann à l'émergence de l'ordinateur est l'idée de permettre aux algorithmes arbitraires contenant la logique booléenne, l'arithmétique et la ramification d'être représentés et stockés sous forme de données - un programme.

Les moteurs d'expression sont un autre précurseur des DCG. Les moteurs d'expression peuvent être aussi simples que des moteurs arithmétiques et aussi complexes que des applications telles que Mathematica. Un moteur de règles est un peu comme les DCG, sauf que les moteurs de règles sont déclaratifs et que les méta-règles des moteurs de règles fonctionnent sur ces déclarations.

Programmes Manipulation de programmes

Ce qu'ils ont en commun avec les DCG, c'est que le flux de données et les opérations à appliquer peuvent être définis au moment de l'exécution. Comme pour les DCG, certaines de ces bibliothèques et applications logicielles disposent d'API ou d'autres mécanismes permettant d'appliquer des opérations sur des détails fonctionnels. C'est essentiellement l'idée d'un programme permettant la manipulation d'un autre programme.

Un autre point de référence pour comprendre ce principe à un niveau primitif est la déclaration de cas de commutation disponible dans certains langages informatiques. Il s'agit d'une structure de code source par laquelle le programmeur exprime essentiellement: "Nous ne sommes pas sûrs de ce qui doit être fait, mais la valeur de cette variable indiquera au modèle d'exécution en temps réel ce qu'il faut faire à partir d'un ensemble de possibilités."

L'instruction switch-case est une abstraction qui étend l'idée de reporter la décision quant à la direction du calcul jusqu'au moment de l'exécution. C'est la version logicielle de ce qui se fait à l'intérieur de l'unité de contrôle d'un CPU contemporain et une extension du concept de différer certains détails de l'algorithme. Une table de foncteurs (pointeurs de fonction) en C ou polymorphisme en C ++, Java ou Python sont d'autres exemples primitifs.

Le calcul dynamique va plus loin dans l'abstraction. Ils reportent la plupart sinon la totalité de la spécification des calculs et les relations entre eux au moment de l'exécution. Cette généralisation complète élargit les possibilités de modification fonctionnelle lors de l'exécution.

Représentation graphique dirigée du calcul

C'est ce qu'est le modèle de calcul dynamique. Maintenant, pour la partie graphique.

Une fois que l'on décide de reporter le choix des opérations à préformer jusqu'au moment de l'exécution, une structure est requise pour contenir les opérations, leurs relations de dépendance et peut-être les paramètres de mappage. Une telle représentation est plus qu'un arbre syntaxique (tel qu'un arbre représentant la hiérarchie du code source). Contrairement à un programme en langage assembleur ou à un code machine, il doit être facilement et arbitrairement modifiable. Il doit contenir plus d'informations qu'un graphe de flux de données et bien plus qu'une carte mémoire. À quoi doit ressembler cette structure de données qui spécifie la structure de calcul?

Heureusement, tout algorithme arbitraire, fini et borné peut être représenté comme un graphe orienté des dépendances entre les opérations spécifiées. Dans un tel graphique, les sommets (souvent représentés sous forme de nœuds de formes diverses lorsqu'ils sont affichés) représentent des opérations effectuées sur les données et les bords (souvent représentés sous forme de flèches lorsqu'ils sont affichés) sont des représentations numériques d'informations provenant d'une opération (ou entrée système) et dont dépendent d'autres opérations (ou sorties du système).

Gardez à l'esprit que le graphe orienté n'est ni un algorithme (en ce sens qu'une séquence précise d'opérations est spécifiée) ni une déclaration (en ce que les données peuvent être explicitement stockées et les boucles, les branches, les fonctions et les modules peuvent être définissables et imbriqués).

La plupart de ces cadres et bibliothèques de graphiques de calcul dynamiques permettent aux composants d'effectuer des calculs sur l'entrée de composant qui prennent en charge l'apprentissage automatique. Les sommets du graphe orienté peuvent être des simulations de neurones pour la construction d'un réseau neuronal ou des composants qui prennent en charge le calcul différentiel. Ces cadres présentent des possibilités de constructions qui peuvent être utilisées pour l'apprentissage en profondeur dans un sens plus généralisé.

Dans le contexte de l'histoire de l'ordinateur

Encore une fois, rien de mentionné jusqu'à présent n'est nouveau pour l'informatique. LISP permet de modifier les schémas de calcul par d'autres algorithmes. Et la dimensionnalité et la numérocité généralisées des entrées sont intégrées dans un certain nombre d'interfaces et de protocoles plug-and-play de longue date. L'idée d'un cadre d'apprentissage remonte également à la même période du milieu du XXe siècle.

Ce qui est nouveau et gagne en popularité est une combinaison particulière de fonctionnalités intégrées et de l'ensemble de terminologie associé, une agrégation de la terminologie existante pour chacune des fonctionnalités, conduisant à une base plus large de compréhension par ceux qui étudient déjà et travaillent dans l'industrie du logiciel. .

  • Saveur contemporaine (tendance) des interfaces API
  • Orientation objet
  • Support tenseur discret
  • L'abstraction dirigée du graphe
  • Interopérabilité avec des langages et des packages populaires qui prennent en charge le Big Data, l'exploration de données, l'apprentissage automatique et l'analyse statistique
  • Prise en charge de la construction de réseaux neuronaux arbitraires et systématiques
  • La possibilité d'une adaptation structurelle dynamique du réseau neuronal (ce qui facilite l'expérimentation sur la plasticité neuronale)

Bon nombre de ces cadres prennent en charge l'adaptabilité aux changements de dimensionnalité des intrants (nombre de dimensions et plage de chacune).

Similitude avec les arbres de symboles abstraits dans les compilateurs

Un graphique de dépendance des entrées et des sorties des opérations apparaît également dans les arbres de symboles abstraits (AST), que certains des compilateurs les plus progressistes construisent lors de l'interprétation de la structure du code source. L'AST est ensuite utilisé pour générer des instructions d'assembleur ou des instructions machine dans le processus de liaison avec des bibliothèques et de formation d'un exécutable. L'AST est un graphique orienté qui représente la structure des données, les opérations effectuées et le flux de contrôle spécifié par le code source.

Le flux de données est simplement l'ensemble des dépendances entre les opérations, qui doit être inhérent à l'AST pour que l'AST soit utilisé pour créer des instructions d'exécution dans un code assembleur ou machine qui suit précisément l'algorithme spécifié dans le code source.

Les cadres de graphiques de calcul dynamiques, contrairement aux instructions de casse de commutation ou aux modèles AST dans les compilateurs, peuvent être manipulés en temps réel, optimisés, ajustés (comme dans le cas des filets artificiels en plastique), inversés, transformés par des tenseurs, décimés, modifiés pour ajouter ou supprimer entropie, muté selon un ensemble de règles, ou autrement traduit en formes dérivées. Ils peuvent être stockés sous forme de fichiers ou de flux, puis récupérés à partir d'eux.

Il s'agit d'un concept banal pour les programmeurs LISP ou ceux qui comprennent la nature de la recommandation de John von Neumann de stocker les spécifications opérationnelles sous forme de données. Dans ce sens ultérieur, un programme est un flux de données pour instruire, via un compilateur et un système d'exploitation, un système de calcul dynamique implémenté dans des circuits numériques VLSI.

Atteindre une dimensionnalité et une numérocité adaptables

Dans la question est le commentaire que l'on n'a pas, "Besoin d'avoir un ensemble de données - que toutes les instances en son sein ont le même nombre fixe d'entrées." Cette déclaration ne favorise pas une compréhension exacte. Il existe des moyens plus clairs de dire ce qui est vrai au sujet de l'adaptabilité des entrées.

L'interface entre un DCG et d'autres composants d'un système global doit être définie, mais ces interfaces peuvent être dotées d'une dimensionnalité dynamique ou d'une numérocité. C'est une question d'abstraction.

Par exemple, un type d'objet tenseur discret présente une interface logicielle spécifique, mais un tenseur est un concept mathématique dynamique autour duquel une interface commune peut être utilisée. Un tenseur discret peut être un scalaire, un vecteur, une matrice, un cube ou un hyper-cube, et la plage de variables dépendantes pour chaque dimension peut être variable.

Il peut arriver que la quantité de nœuds dans une couche du système définie dans un graphe de calcul dynamique puisse être fonction du nombre d'entrées d'un type particulier, et cela aussi peut être un calcul différé au moment de l'exécution.

Le cadre peut être programmé pour sélectionner la structure des couches (une extension du paradigme du boîtier de commutation à nouveau) ou calculer des paramètres définissant les tailles et la profondeur de la structure ou l'activation. Cependant, ces fonctionnalités sophistiquées ne sont pas ce qui qualifie le framework en tant que framework Dynamic Computational Graph.

Qu'est-ce qui qualifie un cadre pour prendre en charge les graphiques de calcul dynamiques?

Pour être considéré comme un cadre de graphique de calcul dynamique, le cadre doit simplement prendre en charge le report de la détermination de l'algorithme au moment de l'exécution, ouvrant ainsi la porte à une pléthore d'opérations sur les dépendances de calcul et le flux de données au moment de l'exécution. Les bases des opérations différées doivent inclure la spécification, la manipulation, l'exécution et le stockage des graphiques dirigés qui représentent les systèmes d'opérations.

Si la spécification de l'algorithme n'est PAS différée jusqu'au moment de l'exécution mais est compilée dans l'exécutable conçu pour un système d'exploitation spécifique avec uniquement la flexibilité traditionnelle fournie par les langages de bas niveau tels que if-then-else, switch-case, polymorphisme, tableaux de foncteurs et chaînes de longueur variable, il est considéré comme un algorithme statique.

Si les opérations, les dépendances entre elles, le flux de données, la dimensionnalité des données au sein du flux et l'adaptabilité du système à la numérocité et à la dimensionnalité d'entrée sont toutes variables au moment de l'exécution de manière à créer un système hautement adaptatif, alors l'algorithme est dynamique de ces manières.

Encore une fois, les programmes LISP qui fonctionnent sur les programmes LISP, les moteurs de règles avec des capacités de méta-règles, les moteurs d'expression, les bibliothèques d'objets tenseurs discrets et même les modèles de conception de commandes relativement simples sont tous dynamiques dans un certain sens, différant certaines caractéristiques au moment de l'exécution. Les DCG sont flexibles et complets dans leurs capacités à prendre en charge des constructions de calcul arbitraires de manière à créer un environnement riche pour l'expérimentation d'apprentissage en profondeur et la mise en œuvre de systèmes.

Quand utiliser des graphiques de calcul dynamiques

Les avantages et les inconvénients des DCG sont entièrement spécifiques au problème. Si vous étudiez les divers concepts de programmation dynamique ci-dessus et d'autres qui peuvent leur être étroitement liés dans la littérature associée, il deviendra évident si vous avez besoin d'un graphique de calcul dynamique ou non.

En général, si vous devez représenter un modèle de calcul arbitraire et changeant pour faciliter la mise en œuvre du système d'apprentissage en profondeur, du système de manipulation mathématique, du système adaptatif ou de toute autre construction logicielle flexible et complexe qui correspond bien au paradigme DCG, alors une preuve de concept utilisant un framework Dynamic Computatonal Graph est une bonne première étape dans la définition de votre architecture logicielle pour la solution du problème.

Tous les logiciels d'apprentissage n'utilisent pas les DCG, mais ils sont souvent un bon choix, lorsque la manipulation systématique et éventuellement continue d'une structure de calcul arbitraire est une exigence d'exécution.


" PyTorch est l'intégration du framework Torch pour le langage Python " - je pense que cette déclaration peut être mal interprétée comme " PyTorch est une bibliothèque de wrapper pour le framework Torch pour le langage Python ", ce qui serait une fausse déclaration. Vous devriez probablement le reformuler.
nbro

" Avec les frameworks Dynamic Computational Graph, contrairement aux instructions switch-case ou aux modèles AST intermédiaires dans les compilateurs, on peut manipuler les opérations " ... "les traduire " - Qu'entendez-vous par "traduire les opérations"?
nbro

1

En bref, les graphiques de calcul dynamiques peuvent résoudre certains problèmes que les statiques ne peuvent pas, ou sont inefficaces car ils ne permettent pas la formation par lots.

Pour être plus précis, la formation sur les réseaux neuronaux modernes se fait généralement par lots , c'est-à-dire en traitant plus d'une instance de données à la fois. Certains chercheurs choisissent une taille de lot comme 32, 128 tandis que d'autres utilisent une taille de lot supérieure à 10 000. La formation sur une seule instance est généralement très lente car elle ne peut pas bénéficier du parallélisme matériel.

Par exemple, dans le traitement du langage naturel, les chercheurs veulent former des réseaux de neurones avec des phrases de différentes longueurs. En utilisant des graphiques de calcul statiques, ils devraient généralement faire d'abord un remplissage , c'est-à-dire ajouter des symboles sans signification au début ou à la fin de phrases plus courtes pour faire toutes les phrases de la même longueur. Cette opération complique beaucoup la formation (par exemple, besoin de masquage, redéfinition des métriques d'évaluation, perte de temps de calcul important sur ces symboles rembourrés). Avec un graphe de calcul dynamique, le remplissage n'est plus nécessaire (ou seulement nécessaire dans chaque lot).

Un exemple plus compliqué serait de (utiliser un réseau de neurones pour) traiter les phrases en fonction de ses arbres d'analyse. Étant donné que chaque phrase a son propre arbre d'analyse, elles nécessitent chacune un graphe de calcul différent, ce qui signifie que la formation avec un graphe de calcul statique ne peut permettre qu'une formation à une seule instance. Un exemple similaire à celui-ci est les réseaux neuronaux récursifs .


0

De nombreux réseaux de neurones profonds ont un graphique de flux de données statique, ce qui signifie à peu près que la structure de son calcul (son graphique de calcul) reste stable sur différentes entrées. C'est une bonne chose car nous pouvons tirer parti de cette fonctionnalité pour les performances, par exemple par mini-batching (traitement d'un tas d'entrées à la fois).

Mais certains réseaux de neurones pourraient avoir un graphe de calcul différent pour chaque entrée. Cela pose quelques problèmes (difficultés de traitement par lots, la construction des graphes est coûteux en calcul), et donc ces réseaux sont un peu difficiles à utiliser.

Le document que vous liez surmonte ce problème en proposant une méthode qui peut regrouper plusieurs graphiques de calcul en un seul. Ensuite, nous pouvons faire nos techniques NN habituelles.

Les avantages sont les accélérations, ce qui incite les chercheurs à explorer différentes structures et à être plus créatifs, je suppose.

L'avantage des graphiques de calcul dynamiques semble inclure la possibilité de s'adapter à des quantités variables dans les données d'entrée. Il semble qu'il puisse y avoir une sélection automatique du nombre de couches, du nombre de neurones dans chaque couche, de la fonction d'activation et d'autres paramètres NN, en fonction de chaque instance d'ensemble d'entrée pendant la formation. Est-ce une caractérisation précise?

Ceci est une erreur.


0

Les graphiques de calcul dynamiques sont simplement des CG modifiés avec un niveau d'abstraction plus élevé. Le mot «dynamique» explique tout: la façon dont les données circulent dans le graphique dépend de la structure d'entrée, c'est-à-dire que la structure DCG est modifiable et non statique. L'une de ses applications importantes est dans les réseaux neuronaux PNL.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.