Co to jest dynamiczny wykres obliczeniowy?

19

Struktury takie jak PyTorch i TensorFlow poprzez TensorFlow Fold obsługują dynamiczne wykresy obliczeniowe i zwracają uwagę naukowców zajmujących się danymi.

Wydaje się jednak, że brakuje zasobów, które mogłyby pomóc w zrozumieniu dynamicznych wykresów obliczeniowych.

Wydaje się, że zaletą dynamicznych wykresów obliczeniowych jest możliwość dostosowania się do zmiennych ilości danych wejściowych. Wydaje się, że może istnieć automatyczny wybór liczby warstw, liczby neuronów w każdej warstwie, funkcji aktywacji i innych parametrów NN, w zależności od każdego zestawu danych wejściowych podczas treningu. Czy to dokładna charakterystyka?

Jakie są zalety modeli dynamicznych w porównaniu z modelami statycznymi? Czy dlatego DCG przyciągają tak wiele uwagi? Podsumowując, jakie są DCG i jakie są zalety i wady ich zastosowania?

Blaszard
źródło

Odpowiedzi:

8

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.

Douglas Daseeco
źródło
PyTorch jest integracją frameworka Torch dla języka Python ” - Myślę, że to zdanie może być źle interpretowane, ponieważ „ PyTorch jest biblioteką otoki dla frameworka dla języka Python ”, co byłoby fałszywą instrukcją. Prawdopodobnie powinieneś to zmienić.
nro
W ramach frameworku Dynamic Computational Graph, w przeciwieństwie do instrukcji case-switch lub pośrednich modeli AST w kompilatorach, można manipulować operacjami „ ... ” je tłumaczyć - co rozumiesz przez„ tłumaczenia ”?
nro
1

Krótko mówiąc, dynamiczne wykresy obliczeniowe mogą rozwiązać niektóre problemy, których statyczne nie mogą lub są nieefektywne z powodu niedopuszczenia treningu w partiach.

Mówiąc ściślej, nowoczesne szkolenie w sieci neuronowej jest zwykle wykonywane partiami , tj. Przetwarzaniem więcej niż jednej instancji danych na raz. Niektórzy badacze wybierają wielkość partii jak 32, 128, podczas gdy inni używają wielkości partii większej niż 10.000. Trening z jedną instancją jest zwykle bardzo wolny, ponieważ nie może korzystać z równoległości sprzętowej.

Na przykład w przetwarzaniu języka naturalnego badacze chcą trenować sieci neuronowe przy użyciu zdań o różnej długości. Używając statycznych wykresów obliczeniowych, zwykle musieliby najpierw uzupełniać , tj. Dodawać bez znaczenia symbole na początku lub na końcu krótszych zdań, aby wszystkie zdania miały tę samą długość. Ta operacja bardzo komplikuje szkolenie (np. Potrzeba maskowania, ponownego zdefiniowania wskaźników oceny, marnowania znacznej ilości czasu obliczeniowego na te wypełnione symbole). W przypadku dynamicznego wykresu obliczeniowego wypełnianie nie jest już potrzebne (lub potrzebne tylko w ramach każdej partii).

Bardziej skomplikowanym przykładem byłoby (wykorzystanie sieci neuronowej) przetwarzanie zdań w oparciu o parsujące drzewa. Ponieważ każde zdanie ma swoje własne drzewo analizujące, każde z nich wymaga innego wykresu obliczeniowego, co oznacza, że ​​szkolenie przy użyciu statycznego wykresu obliczeniowego może zezwalać tylko na szkolenie z jedną instancją. Przykładem podobnym do tego są rekurencyjne sieci neuronowe .

użytkownik12075
źródło
0

Wiele głębokich sieci neuronowych ma statyczny wykres przepływu danych, co z grubsza oznacza, że ​​struktura jego obliczeń (wykres obliczeń) pozostaje stabilna dla różnych danych wejściowych. Jest to dobre, ponieważ możemy wykorzystać tę funkcję do zwiększenia wydajności, na przykład poprzez mini-batchowanie (przetwarzanie wielu danych wejściowych jednocześnie).

Ale niektóre sieci neuronowe mogą mieć inny wykres obliczeniowy dla każdego wejścia. Powoduje to pewne problemy (problemy z partiami, budowa grafów jest droga obliczeniowo), a zatem sieci te są nieco trudne w użyciu.

Artykuł, który łączysz, rozwiązuje ten problem, proponując metodę, która może grupować kilka wykresów obliczeniowych w jeden. Następnie możemy wykonać nasze zwykłe techniki NN.

Korzyści to przyśpieszenie, które zachęca badaczy do odkrywania różnych struktur i, jak sądzę, do większej kreatywności.

Wydaje się, że zaletą dynamicznych wykresów obliczeniowych jest możliwość dostosowania się do zmiennych ilości danych wejściowych. Wydaje się, że może istnieć automatyczny wybór liczby warstw, liczby neuronów w każdej warstwie, funkcji aktywacji i innych parametrów NN, w zależności od każdego zestawu danych wejściowych podczas treningu. Czy to dokładna charakterystyka?

To jest niepoprawne.

kc sayz „kc sayz”
źródło
0

Dynamiczne wykresy obliczeniowe to po prostu zmodyfikowane CG o wyższym poziomie abstrakcji. Słowo „dynamiczne” wyjaśnia wszystko: sposób przepływu danych przez wykres zależy od struktury wejściowej, tj. Struktura DCG jest zmienna i niestatyczna. Jednym z jej ważnych zastosowań są sieci neuronowe NLP.

CHEO FUSI
źródło