Dwie krótkie odpowiedzi
Krótka odpowiedź z teoretycznego punktu widzenia brzmi:
Dynamiczny wykres obliczeniowy to zmienny system reprezentowany jako ukierunkowany wykres przepływu danych między operacjami. Można go wizualizować jako kształty zawierające tekst połączony strzałkami, przy czym wierzchołki (kształty) reprezentują operacje na danych przepływających wzdłuż krawędzi (strzałki).
Zauważ, że taki wykres definiuje zależności w przepływie danych, ale niekoniecznie czasową kolejność stosowania operacji, które mogą stać się niejednoznaczne w utrzymywaniu stanu w wierzchołkach lub cyklach na wykresie bez dodatkowego mechanizmu określającego pierwszeństwo czasowe.
Krótka odpowiedź z perspektywy rozwoju aplikacji jest taka, że ...
Struktura Dynamic Computational Graph to system bibliotek, interfejsów i komponentów, które zapewniają elastyczny, programowy interfejs w czasie wykonywania, który ułatwia budowę i modyfikację systemów poprzez połączenie skończonego, ale być może rozszerzalnego zestawu operacji.
Framework PyTorch
PyTorch to integracja frameworka Torch z językiem Python i strukturą danych. Torch konkuruje z Theano, TensorFlow i innymi dynamicznymi strukturami konstrukcyjnymi systemów obliczeniowych.
——— Dodatkowe podejścia do zrozumienia ———
Arbitralne struktury obliczeniowe arbitralnych dyskretnych tensorów
Jednym z elementów, które można wykorzystać do budowy systemu obliczeniowego, jest element zaprojektowany do połączenia ze sobą w celu stworzenia sieci neuronowych. Ich dostępność wspiera głębokie uczenie się budowy i propagowanie wsteczną sieci neuronowych. Można również zbudować wiele innych systemów obejmujących montaż komponentów, które pracują z potencjalnie wielowymiarowymi danymi w dowolnie zdefiniowanych strukturach obliczeniowych.
Dane mogą być wartościami skalarnymi, takimi jak liczby zmiennoprzecinkowe, liczby całkowite lub łańcuchy, lub ich ortogonalne agregacje, takie jak wektory, macierze, kostki lub hipersześciany. Operacje uogólnienia tych formularzy danych to dyskretne tensory, a struktury utworzone z połączenia operacji tensora w działające systemy to przepływy danych.
Punkty odniesienia dla zrozumienia koncepcji obliczeń dynamicznych
Dynamiczne wykresy obliczeniowe nie są szczególnie nową koncepcją, nawet jeśli termin jest stosunkowo nowy. Zainteresowanie informatyków DCG nie jest tak nowe, jak termin Data Scientist. Niemniej jednak pytanie poprawnie stwierdza, że istnieje niewiele dobrze napisanych zasobów (innych niż przykłady kodu), z których można poznać ogólną koncepcję ich powstawania i użytkowania.
Jednym z możliwych punktów odniesienia do zrozumienia DCG jest wzorzec projektowania poleceń, który jest jednym z wielu wzorców spopularyzowanych przez zwolenników projektowania obiektowego. Wzorzec projektowania poleceń traktuje operacje jako jednostki obliczeniowe, których szczegóły są ukryte przed obiektami poleceń, które je uruchamiają. Wzorzec projektowy Polecenie jest często używany w połączeniu ze wzorcem projektowym Tłumacza.
W przypadku DCG wzięte są również wzorce projektowe Kompozyt i Fasada, aby ułatwić definicję dyskretnych operacji tensorowych plug-and-play, które można łączyć ze sobą we wzory, tworząc systemy.
Ta szczególna kombinacja wzorców projektowych do tworzenia systemów jest w rzeczywistości abstrakcją oprogramowania, która w dużej mierze przypomina radykalną ideę, która doprowadziła do pojawienia się architektury Von Neumann, która jest obecnie kluczowa dla większości komputerów. Wkład von Neumanna w powstanie komputera polega na umożliwieniu reprezentacji i przechowywania dowolnych algorytmów zawierających logikę logiczną, arytmetykę i rozgałęzienia jako dane - program.
Kolejnym prekursorem DCG są silniki ekspresji. Silniki wyrażeń mogą być tak proste jak silniki arytmetyczne i tak złożone jak aplikacje takie jak Mathematica. Silnik reguł przypomina trochę DCG, z tym wyjątkiem, że silniki reguł są deklaratywne, a meta-reguły dla silników reguł działają na tych deklaracjach.
Programy Manipulowanie programami
To, co łączy je z DCG, polega na tym, że przepływ danych i operacje, które należy zastosować, można zdefiniować w czasie wykonywania. Podobnie jak w przypadku DCG, niektóre z tych bibliotek oprogramowania i aplikacji mają interfejsy API lub inne mechanizmy umożliwiające zastosowanie operacji na szczegółach funkcjonalnych. Zasadniczo jest to idea programu umożliwiającego manipulowanie innym programem.
Innym punktem odniesienia dla zrozumienia tej zasady na prymitywnym poziomie jest instrukcja skrzynki rozdzielczej dostępna w niektórych językach komputerowych. Jest to struktura kodu źródłowego, w której programista zasadniczo wyraża: „Nie jesteśmy pewni, co należy zrobić, ale wartość tej zmiennej powie modelowi wykonania w czasie rzeczywistym, co robić z zestawu możliwości”.
Instrukcja case-case jest abstrakcją, która rozszerza ideę odroczenia decyzji co do kierunku obliczeń do czasu wykonania. Jest to wersja oprogramowania tego, co dzieje się w jednostce sterującej współczesnego procesora, oraz rozszerzenie koncepcji odroczenia niektórych szczegółów algorytmu. Tabela funktorów (wskaźników funkcji) w C lub polimorfizm w C ++, Java lub Python to inne prymitywne przykłady.
Obliczenia dynamiczne posuwają dalej abstrakcję. Odkładają większość, jeśli nie całą specyfikację obliczeń i relacje między nimi na czas wykonywania. To kompleksowe uogólnienie rozszerza możliwości modyfikacji funkcjonalnej w czasie wykonywania.
Reprezentacja kierowanego wykresu obliczeń
Taki właśnie jest dynamiczny model obliczeniowy. Teraz część graficzna.
Gdy ktoś zdecyduje się odroczyć wybór operacji, które mają zostać wykonane do czasu wykonania, wymagana jest struktura do przechowywania operacji, ich zależności zależności i być może parametrów odwzorowania. Taka reprezentacja jest czymś więcej niż drzewem składniowym (takim jak drzewo reprezentujące hierarchię kodu źródłowego). W przeciwieństwie do programu w języku asemblera lub kodu maszynowego, musi on być łatwo i dowolnie zmieniany. Musi zawierać więcej informacji niż wykres przepływu danych i znacznie więcej niż mapę pamięci. Jak musi wyglądać struktura danych określająca strukturę obliczeniową?
Na szczęście dowolny arbitralny, ograniczony algorytm może być reprezentowany jako ukierunkowany wykres zależności między określonymi operacjami. Na takim wykresie wierzchołki (często przedstawiane jako węzły o różnych kształtach, gdy są wyświetlane) reprezentują operacje wykonywane na danych, a krawędzie (często przedstawiane jako strzałki, gdy są wyświetlane) są cyfrowymi reprezentacjami informacji pochodzących z niektórych operacji (lub danych wejściowych systemu) i od których zależą inne operacje (lub dane wyjściowe systemu).
Należy pamiętać, że ukierunkowany wykres nie jest ani algorytmem (w tym, że określona jest dokładna sekwencja operacji), ani deklaracją (w tym, że dane mogą być jawnie przechowywane, a pętle, gałęzie, funkcje i moduły mogą być definiowane i zagnieżdżane).
Większość tych frameworków i bibliotek Dynamic Computational Graph pozwala komponentom wykonywać obliczenia na wejściowych komponentach, które wspierają uczenie maszynowe. Wierzchołki na ukierunkowanym wykresie mogą być symulacjami neuronów do budowy sieci neuronowej lub elementów obsługujących rachunek różniczkowy. Ramy te przedstawiają możliwości konstrukcji, które można wykorzystać do głębokiego uczenia się w bardziej ogólnym ujęciu.
W kontekście historii komputerów
Ponownie nic dotychczas nie wspomniano w informatyce. LISP pozwala modyfikować schematy obliczeniowe za pomocą innych algorytmów. Uogólniona wymiarowość i liczność wejściowa jest wbudowana w szereg długotrwałych interfejsów i protokołów plug-and-play. Idea ram uczenia się pochodzi także z tego samego okresu w połowie XX wieku.
Nowością i zyskuje na popularności jest szczególna kombinacja zintegrowanych funkcji i powiązanego zestawu terminologii, agregacja istniejącej terminologii dla każdej z tych funkcji, co prowadzi do szerszej bazy dla osób, które już studiują i pracują w branży oprogramowania .
- Współczesny (modny) smak interfejsów API
- Orientacja obiektowa
- Dyskretne wsparcie tensora
- Abstrakcja grafów kierowanych
- Interoperacyjność z popularnymi językami i pakietami obsługującymi duże zbiory danych, eksplorację danych, uczenie maszynowe i analizy statystyczne
- Wsparcie dla arbitralnej i systematycznej budowy sieci neuronowej
- Możliwość dynamicznej adaptacji strukturalnej sieci neuronowej (co ułatwia eksperymentowanie z plastycznością neuronową)
Wiele z tych ram obsługuje adaptowalność do zmieniających się wymiarów wejściowych (liczba wymiarów i zakres każdego z nich).
Podobieństwo do drzew symboli abstrakcyjnych w kompilatorach
Wykres zależności wejść i wyjść operacji pojawia się również w drzewach symboli abstrakcyjnych (AST), które niektóre z bardziej postępowych kompilatorów konstruują podczas interpretacji struktury kodu źródłowego. AST jest następnie wykorzystywany do generowania instrukcji asemblera lub instrukcji maszynowych w procesie łączenia się z bibliotekami i tworzenia pliku wykonywalnego. AST jest grafem ukierunkowanym, który reprezentuje strukturę danych, wykonywane operacje i przepływ kontrolny określony przez kod źródłowy.
Przepływ danych jest po prostu zbiorem zależności między operacjami, które muszą być nieodłącznie związane z AST, aby AST mogła być używana do tworzenia instrukcji wykonania w asemblerze lub kodzie maszynowym dokładnie zgodnych z algorytmem określonym w kodzie źródłowym.
Ramy Dynamic Computational Graph, w przeciwieństwie do instrukcji przełączania lub modeli AST w kompilatorach, mogą być manipulowane w czasie rzeczywistym, zoptymalizowane, dostrojone (jak w przypadku sztucznych sieci sztucznych), odwrócone, przekształcone przez tensory, zdziesiątkowane, zmodyfikowane w celu dodania lub usunięcia entropia, zmutowana zgodnie z zestawem reguł lub w inny sposób przetłumaczona na formy pochodne. Mogą być przechowywane jako pliki lub strumienie, a następnie pobierane z nich.
Jest to banalna koncepcja dla programistów LISP lub tych, którzy rozumieją naturę zalecenia Johna von Neumanna, aby przechowywać specyfikacje operacyjne jako dane. W tym późniejszym sensie program jest strumieniem danych, który instruuje, poprzez kompilator i system operacyjny, dynamiczny system obliczeniowy zaimplementowany w obwodach cyfrowych VLSI.
Osiąganie adaptowalnych wymiarów i liczby
W pytaniu jest komentarz, że nie ma potrzeby: „Potrzebujesz mieć zestaw danych - że wszystkie zawarte w nim instancje mają tę samą, stałą liczbę danych wejściowych”. To stwierdzenie nie promuje dokładnego zrozumienia. Istnieją wyraźniejsze sposoby na powiedzenie, co jest prawdą w kwestii adaptacji wejściowej.
Interfejs między DCG a innymi komponentami całego systemu musi zostać zdefiniowany, ale interfejsy te mogą mieć wbudowaną dynamiczną wymiarowość lub liczbę. To kwestia abstrakcji.
Na przykład dyskretny typ obiektu tensorowego przedstawia określony interfejs oprogramowania, jednak tensor to dynamiczna koncepcja matematyczna, wokół której można zastosować wspólny interfejs. Dyskretny tensor może być skalarem, wektorem, macierzą, sześcianem lub hipersześcianem, a zakres zmiennych zależnych dla każdego wymiaru może być zmienny.
Może się zdarzyć, że liczba węzłów w warstwie systemu zdefiniowana w dynamicznym grafie obliczeniowym może być funkcją liczby danych wejściowych określonego typu, a także może być obliczeniem odroczonym do czasu wykonania.
Ramy można zaprogramować do wybierania struktury warstw (ponowne rozszerzenie paradygmatu skrzynki rozdzielczej) lub obliczania parametrów określających rozmiary i głębokość struktury lub aktywację. Jednak te wyrafinowane funkcje nie są tym, co kwalifikuje strukturę jako strukturę dynamicznego wykresu obliczeniowego.
Co kwalifikuje strukturę do obsługi dynamicznych wykresów obliczeniowych?
Aby kwalifikować się jako środowisko dynamicznego wykresu obliczeniowego, środowisko musi po prostu wspierać odroczenie wyznaczania algorytmu do czasu wykonywania, otwierając w ten sposób drzwi do wielu operacji dotyczących zależności obliczeniowych i przepływu danych w czasie wykonywania. Podstawy odroczonych operacji muszą obejmować specyfikację, manipulowanie, wykonywanie i przechowywanie ukierunkowanych wykresów reprezentujących systemy operacji.
Jeśli specyfikacja algorytmu NIE zostanie odroczona do czasu wykonania, ale zostanie skompilowana do pliku wykonywalnego zaprojektowanego dla konkretnego systemu operacyjnego z jedynie tradycyjną elastycznością zapewnianą przez języki niskiego poziomu, takie jak jeśli-to-inaczej, przypadek przełączania, polimorfizm, tablice funktory i łańcuchy o zmiennej długości, jest uważany za algorytm statyczny.
Jeśli operacje, zależności między nimi, przepływ danych, wymiarowość danych w przepływie oraz możliwość dostosowania systemu do wejściowej liczby i wymiarów są zmienne w czasie wykonywania w sposób umożliwiający stworzenie wysoce adaptacyjnego systemu, algorytm jest dynamiczny w ten sposób.
Ponownie, programy LISP działające na programach LISP, silniki reguł z możliwościami meta reguł, silniki wyrażeń, dyskretne biblioteki obiektów tensorowych, a nawet stosunkowo proste wzorce projektowania komend są w pewnym sensie dynamiczne, odraczając pewne cechy w czasie działania. DCG są elastyczne i wszechstronne w zakresie obsługi dowolnych konstrukcji obliczeniowych w taki sposób, aby stworzyć bogate środowisko do eksperymentów z głębokim uczeniem się i wdrażania systemów.
Kiedy stosować dynamiczne wykresy obliczeniowe
Plusy i minusy DCG są całkowicie specyficzne dla problemu. Jeśli przeanalizujesz różne koncepcje programowania dynamicznego powyżej i inne, które mogą być ściśle z nimi związane w powiązanej literaturze, stanie się oczywiste, czy potrzebujesz dynamicznego wykresu obliczeniowego, czy nie.
Ogólnie rzecz biorąc, jeśli musisz przedstawić arbitralny i zmieniający się model obliczeń, aby ułatwić wdrożenie systemu głębokiego uczenia się, systemu manipulacji matematycznych, systemu adaptacyjnego lub innej elastycznej i złożonej konstrukcji oprogramowania, która dobrze odwzorowuje na paradygmat DCG, to dowód koncepcji przy użyciu frameworku Dynamic Computatonal Graph jest dobrym pierwszym krokiem do zdefiniowania architektury oprogramowania dla rozwiązania problemu.
Nie wszystkie programy do nauki wykorzystują DCG, ale często są dobrym wyborem, gdy systematyczne i być może ciągłe manipulowanie dowolną strukturą obliczeniową jest wymogiem czasu działania.