Zwei kurze Antworten
Die kurze theoretische Antwort lautet:
Ein dynamischer Computergraph ist ein veränderliches System, das als gerichteter Graph des Datenflusses zwischen Operationen dargestellt wird. Es kann als Form mit durch Pfeile verbundenem Text dargestellt werden, wobei die Eckpunkte (Formen) Operationen auf den Daten darstellen, die entlang der Kanten (Pfeile) fließen.
Es ist zu beachten, dass ein solches Diagramm Abhängigkeiten im Datenfluss definiert, jedoch nicht unbedingt die zeitliche Reihenfolge der Anwendung von Operationen, die bei der Beibehaltung des Zustands in Scheitelpunkten oder Zyklen im Diagramm mehrdeutig werden können, ohne dass ein zusätzlicher Mechanismus zum Festlegen der zeitlichen Priorität erforderlich ist.
Die kurze Antwort aus Sicht der Anwendungsentwicklung lautet: ...
Ein Dynamic Computational Graph-Framework ist ein System aus Bibliotheken, Schnittstellen und Komponenten, die eine flexible, programmgesteuerte Laufzeitschnittstelle bereitstellen, die das Erstellen und Ändern von Systemen erleichtert, indem eine endliche, aber möglicherweise erweiterbare Gruppe von Operationen verbunden wird.
Das PyTorch-Framework
PyTorch ist die Integration des Torch-Frameworks in die Python-Sprache und die Datenstrukturierung. Torch konkurriert mit Theano, TensorFlow und anderen Frameworks für den Aufbau dynamischer Computersysteme.
——— Zusätzliche Ansätze zum Verständnis ———
Beliebige Rechenstrukturen beliebiger diskreter Tensoren
Eine der Komponenten, die zum Aufbau eines Rechensystems verwendet werden kann, ist ein Element, das zur Schaffung neuronaler Netze miteinander verbunden werden kann. Die Verfügbarkeit dieser unterstützt den Aufbau von Deep-Learning- und Back-Propaging-Neuronalen Netzen. Eine Vielzahl anderer Systeme, bei denen Komponenten zusammengesetzt werden, die mit potenziell mehrdimensionalen Daten in willkürlich definierten Rechenstrukturen arbeiten, können ebenfalls konstruiert werden.
Die Daten können skalare Werte wie Gleitkommazahlen, Ganzzahlen oder Zeichenfolgen oder orthogonale Aggregationen davon wie Vektoren, Matrizen, Würfel oder Hyperwürfel sein. Die Operationen zur Verallgemeinerung dieser Datenformen sind diskrete Tensoren, und die Strukturen, die aus der Assemblierung von Tensoroperationen in Arbeitssysteme erzeugt werden, sind Datenflüsse.
Anhaltspunkte für das Verständnis des Konzepts der dynamischen Berechnung
Dynamische Computergraphen sind kein besonders neues Konzept, obwohl der Begriff relativ neu ist. Das Interesse der Informatiker an DCGs ist nicht so neu wie der Begriff Data Scientist. Die Frage besagt jedoch zu Recht, dass es nur wenige gut geschriebene Ressourcen gibt (außer Codebeispielen), aus denen man das Gesamtkonzept für deren Entstehung und Verwendung lernen kann.
Ein möglicher Bezugspunkt für das Verständnis von DCGs ist das Befehlsentwurfsmuster, eines der vielen Entwurfsmuster, die von den Befürwortern des objektorientierten Entwurfs populär gemacht wurden. Das Befehlsentwurfsmuster betrachtet Operationen als Berechnungseinheiten, deren Details vor den Befehlsobjekten, die sie auslösen, verborgen sind. Das Befehlsentwurfsmuster wird häufig in Verbindung mit dem Interpreterentwurfsmuster verwendet.
Im Fall von DCGs sind auch die Entwurfsmuster für Verbundwerkstoffe und Fassaden beteiligt, um die Plug-and-Play-Operationen für diskrete Tensoren zu vereinfachen, die zu Mustern zusammengesetzt werden können, um Systeme zu bilden.
Diese besondere Kombination von Entwurfsmustern zur Bildung von Systemen ist eigentlich eine Softwareabstraktion, die weitgehend der radikalen Idee ähnelt, die zur Entstehung der Von Neumann-Architektur führte, die für die meisten heutigen Computer von zentraler Bedeutung ist. Von Neumanns Beitrag zur Entstehung des Computers ist die Idee, beliebige Algorithmen mit Boolescher Logik, Arithmetik und Verzweigung als Daten darstellen und speichern zu lassen - ein Programm.
Ein weiterer Vorläufer von DCGs sind Expression Engines. Ausdrucksmaschinen können so einfach wie arithmetische Maschinen und so komplex wie Anwendungen wie Mathematica sein. Eine Rules-Engine ähnelt DCGs, mit der Ausnahme, dass Rules-Engines deklarativ sind und Metaregeln für Rules-Engines diese Deklarationen verarbeiten.
Programme Manipulieren von Programmen
Gemeinsam ist diesen DCGs, dass der anzuwendende Datenfluss und die anzuwendenden Operationen zur Laufzeit definiert werden können. Wie bei DCGs verfügen einige dieser Softwarebibliotheken und -anwendungen über APIs oder andere Mechanismen, mit denen Operationen auf funktionale Details angewendet werden können. Es ist im Wesentlichen die Idee eines Programms, das die Manipulation eines anderen Programms ermöglicht.
Ein weiterer Bezugspunkt für das Verständnis dieses Prinzips auf primitiver Ebene ist die switch-case-Anweisung, die in einigen Computersprachen verfügbar ist. Es ist eine Quellcodestruktur, bei der der Programmierer im Wesentlichen ausdrückt: "Wir sind uns nicht sicher, was zu tun ist, aber der Wert dieser Variablen gibt dem Echtzeit-Ausführungsmodell an, was aus einer Reihe von Möglichkeiten zu tun ist."
Die switch-case-Anweisung ist eine Abstraktion, die den Gedanken erweitert, die Entscheidung über die Berechnungsrichtung bis zur Laufzeit aufzuschieben. Es ist die Softwareversion dessen, was in der Steuereinheit einer modernen CPU geschieht, und eine Erweiterung des Konzepts, einige Algorithmusdetails aufzuschieben. Eine Tabelle mit Funktoren (Funktionszeigern) in C oder Polymorphismus in C ++, Java oder Python sind weitere einfache Beispiele.
Dynamic Computation bringt die Abstraktion weiter. Sie verschieben die meisten, wenn nicht alle Angaben zu Berechnungen und deren Beziehung zur Laufzeit. Diese umfassende Verallgemeinerung erweitert die Möglichkeiten der Funktionsänderung zur Laufzeit.
Gerichtete Graphendarstellung der Berechnung
Das ist das Dynamic Computational-Modell. Nun zum Graph-Teil.
Sobald entschieden wird, die Auswahl der durchzuführenden Operationen bis zur Laufzeit aufzuschieben, ist eine Struktur erforderlich, um die Operationen, ihre Abhängigkeitsbeziehungen und möglicherweise Zuordnungsparameter zu speichern. Eine solche Darstellung ist mehr als ein syntaktischer Baum (wie ein Baum, der die Hierarchie des Quellcodes darstellt). Anders als ein Assembler-Programm oder ein Maschinencode muss es leicht und willkürlich änderbar sein. Es muss mehr Informationen enthalten als ein Datenflussdiagramm und viel mehr als eine Speicherzuordnung. Wie muss diese Datenstruktur aussehen, die die Rechenstruktur angibt?
Glücklicherweise kann jeder beliebige, begrenzte Algorithmus als gerichteter Graph der Abhängigkeiten zwischen bestimmten Operationen dargestellt werden. In einem solchen Graphen repräsentieren die Eckpunkte (bei der Anzeige oft als Knoten verschiedener Formen dargestellt) Operationen, die an den Daten ausgeführt werden, und die Kanten (bei der Anzeige oft als Pfeile dargestellt) sind digitale Repräsentationen von Informationen, die aus einer Operation (oder einer Systemeingabe) stammen. und von denen andere Operationen (oder Systemausgaben) abhängen.
Beachten Sie, dass der gerichtete Graph weder ein Algorithmus (in dem eine genaue Abfolge von Operationen angegeben ist) noch eine Deklaration ist (in dem Daten explizit gespeichert werden können und Schleifen, Verzweigungen, Funktionen und Module definierbar und verschachtelt sein können).
Die meisten dieser Dynamic Computational Graph-Frameworks und -Bibliotheken ermöglichen es den Komponenten, Berechnungen für die Komponenteneingabe durchzuführen, die das maschinelle Lernen unterstützen. Scheitelpunkte im gerichteten Graphen können Simulationen von Neuronen für den Aufbau eines neuronalen Netzes oder von Komponenten sein, die Differentialrechnung unterstützen. Diese Frameworks bieten Möglichkeiten für Konstrukte, die in einem allgemeineren Sinne für tiefes Lernen verwendet werden können.
Im Kontext der Computergeschichte
Auch hier ist nichts bisher Erwähntes neu in der Informatik. Mit LISP können Berechnungsschemata durch andere Algorithmen geändert werden. Die verallgemeinerte Eingabedimensionalität und Numerizität ist in eine Reihe langjähriger Plug-and-Play-Schnittstellen und -Protokolle integriert. Die Idee eines Lernrahmens stammt ebenfalls aus der Mitte des 20. Jahrhunderts.
Neu und immer beliebter wird eine bestimmte Kombination integrierter Funktionen und der damit verbundenen Terminologie. Dabei handelt es sich um eine Zusammenfassung der vorhandenen Terminologie für jede der Funktionen, die für diejenigen, die bereits in der Softwareindustrie studieren und arbeiten, zu einer breiteren Basis für das Verständnis führt .
- Zeitgemäßes (trendiges) API-Interface
- Objektorientierung
- Diskrete Tensorunterstützung
- Die gerichtete Graphabstraktion
- Interoperabilität mit gängigen Sprachen und Paketen, die Big Data, Data Mining, maschinelles Lernen und statistische Analysen unterstützen
- Unterstützung für den Aufbau willkürlicher und systematischer neuronaler Netze
- Die Möglichkeit einer dynamischen Strukturanpassung des neuronalen Netzwerks (die das Experimentieren mit neuronaler Plastizität erleichtert)
Viele dieser Frameworks unterstützen die Anpassung an sich ändernde Eingabedimensionalitäten (Anzahl der Dimensionen und deren Bereich).
Ähnlichkeit mit abstrakten Symbolbäumen in Compilern
Ein Abhängigkeitsgraph von Eingaben und Ausgaben von Operationen erscheint auch in abstrakten Symbolbäumen (AST), die einige der progressiveren Compiler während der Interpretation der Quellcodestruktur erstellen. Der AST wird dann verwendet, um Assembler-Anweisungen oder Maschinenanweisungen im Prozess des Verbindens mit Bibliotheken und des Bildens einer ausführbaren Datei zu generieren. Der AST ist ein gerichteter Graph, der die Struktur der Daten, die ausgeführten Operationen und den vom Quellcode angegebenen Kontrollfluss darstellt.
Der Datenfluss ist einfach die Menge der Abhängigkeiten zwischen Operationen, die dem AST inhärent sein müssen, damit der AST zum Erstellen von Ausführungsanweisungen in Assembler- oder Maschinencode verwendet werden kann, der genau dem im Quellcode angegebenen Algorithmus folgt.
Im Gegensatz zu Switch-Case-Anweisungen oder AST-Modellen in Compilern können Dynamic Computational Graph-Frameworks in Echtzeit bearbeitet, optimiert, abgestimmt (wie im Fall von künstlichen Kunststoffnetzen), invertiert, durch Tensoren transformiert, dezimiert, zum Hinzufügen oder Entfernen modifiziert werden Entropie, mutiert nach einer Reihe von Regeln oder anderweitig in abgeleitete Formen übersetzt. Sie können als Dateien oder Streams gespeichert und dann von ihnen abgerufen werden.
Dies ist ein triviales Konzept für LISP-Programmierer oder diejenigen, die die Natur der Empfehlung von John von Neumann verstehen, Betriebsspezifikationen als Daten zu speichern. In diesem späteren Sinne ist ein Programm ein Datenstrom, der über einen Compiler und ein Betriebssystem ein dynamisches Rechensystem anweist, das in einer digitalen VLSI-Schaltung implementiert ist.
Anpassungsfähige Dimensionalität und Numerizität erzielen
In der Frage steht der Kommentar, dass man nicht "Datensatz haben muss - dass alle Instanzen in ihm die gleiche, feste Anzahl von Eingaben haben". Diese Aussage fördert kein genaues Verständnis. Es gibt klarere Möglichkeiten, um zu sagen, was an der Eingabeanpassungsfähigkeit wahr ist.
Die Schnittstelle zwischen einem DCG und anderen Komponenten eines Gesamtsystems muss definiert werden. In diese Schnittstellen kann jedoch eine dynamische Dimensionierung oder Numerizität integriert sein. Es ist eine Frage der Abstraktion.
Beispielsweise stellt ein diskreter Tensorobjekttyp eine bestimmte Softwareschnittstelle dar, während ein Tensor ein dynamisches mathematisches Konzept ist, um das eine gemeinsame Schnittstelle verwendet werden kann. Ein diskreter Tensor kann ein Skalar, ein Vektor, eine Matrix, ein Würfel oder ein Hyperwürfel sein, und der Bereich abhängiger Variablen für jede Dimension kann variabel sein.
Es kann der Fall sein, dass die Anzahl der Knoten in einer Schicht des Systems, die in einem dynamischen Rechengraphen definiert ist, eine Funktion der Anzahl der Eingaben eines bestimmten Typs ist, und dass dies auch eine Berechnung sein kann, die auf die Laufzeit verschoben wird.
Das Framework kann so programmiert werden, dass es die Schichtstruktur auswählt (eine Erweiterung des Switch-Case-Paradigmas) oder Parameter berechnet, die die Strukturgrößen und -tiefe oder -aktivierung definieren. Diese ausgeklügelten Funktionen sind jedoch nicht das, was das Framework als Dynamic Computational Graph-Framework qualifiziert.
Was qualifiziert ein Framework zur Unterstützung dynamischer Computergraphen?
Um als Dynamic Computational Graph-Framework eingestuft zu werden, muss das Framework lediglich die Verzögerung der Bestimmung des Algorithmus für die Laufzeit unterstützen und damit die Tür für eine Vielzahl von Vorgängen in Bezug auf die Abhängigkeiten von Computern und den Datenfluss zur Laufzeit öffnen. Die Grundlagen der zurückgestellten Operationen müssen die Spezifikation, Bearbeitung, Ausführung und Speicherung der gerichteten Graphen umfassen, die Operationssysteme darstellen.
Wenn die Spezifikation des Algorithmus NICHT bis zur Laufzeit zurückgestellt wird, sondern in die für ein bestimmtes Betriebssystem entwickelte ausführbare Datei kompiliert wird, wobei nur die traditionelle Flexibilität gegeben ist, die durch niedrigstufige Sprachen wie If-then-else, Switch-Case, Polymorphismus und Arrays von bereitgestellt wird Funktoren und Zeichenfolgen variabler Länge gelten als statischer Algorithmus.
Wenn die Operationen, die Abhängigkeiten zwischen ihnen, der Datenfluss, die Dimensionalität der Daten innerhalb des Flusses und die Anpassungsfähigkeit des Systems an die eingegebene Numerizität und Dimensionalität zur Laufzeit so variabel sind, dass ein hochgradig anpassungsfähiges System entsteht, dann ist der Algorithmus auf diese Weise dynamisch.
Wiederum sind LISP-Programme, die mit LISP-Programmen arbeiten, Regelmodule mit Metaregelfähigkeiten, Ausdrucksmodule, diskrete Tensorobjektbibliotheken und sogar relativ einfache Befehlsentwurfsmuster in gewisser Weise dynamisch, wodurch einige Eigenschaften auf die Laufzeit verschoben werden. DCGs sind flexibel und umfassend in ihren Fähigkeiten, beliebige Computerkonstruktionen so zu unterstützen, dass eine umfangreiche Umgebung für Deep-Learning-Experimente und Systemimplementierungen entsteht.
Verwendung dynamischer Berechnungsdiagramme
Die Vor- und Nachteile von DCGs sind völlig problemspezifisch. Wenn Sie sich mit den verschiedenen oben genannten Konzepten der dynamischen Programmierung und anderen Konzepten befassen, die in der zugehörigen Literatur möglicherweise eng damit verknüpft sind, wird deutlich, ob Sie einen dynamischen Computergraphen benötigen oder nicht.
Wenn Sie im Allgemeinen ein willkürliches und sich änderndes Berechnungsmodell darstellen müssen, um die Implementierung des Deep-Learning-Systems, des mathematischen Manipulationssystems, des adaptiven Systems oder eines anderen flexiblen und komplexen Softwarekonstrukts zu erleichtern, das dem DCG-Paradigma gut zugeordnet ist, dann ist dies ein Beweis Die Verwendung eines Dynamic Computatonal Graph-Frameworks ist ein guter erster Schritt zur Definition Ihrer Softwarearchitektur für die Lösung des Problems.
Nicht jede Lernsoftware verwendet DCGs, aber sie sind oft eine gute Wahl, wenn die systematische und möglicherweise kontinuierliche Manipulation einer beliebigen Rechenstruktur eine Laufzeitanforderung ist.