Due brevi risposte
La risposta breve da una prospettiva teorica è che ...
Un grafico computazionale dinamico è un sistema mutabile rappresentato come un grafico diretto del flusso di dati tra le operazioni. Può essere visualizzato come forme contenenti testo collegato da frecce, per cui i vertici (forme) rappresentano operazioni sui dati che scorrono lungo i bordi (frecce).
Si noti che tale grafico definisce le dipendenze nel flusso di dati ma non necessariamente l'ordine temporale dell'applicazione delle operazioni, che può diventare ambiguo nella conservazione dello stato in vertici o cicli nel grafico senza un meccanismo aggiuntivo per specificare la precedenza temporale.
La risposta breve dal punto di vista dello sviluppo di applicazioni è che ...
Un framework grafico computazionale dinamico è un sistema di librerie, interfacce e componenti che forniscono un'interfaccia di runtime flessibile, programmatica che facilita la costruzione e la modifica di sistemi collegando un insieme finito ma forse estensibile di operazioni.
Il framework PyTorch
PyTorch è l'integrazione del framework Torch con il linguaggio Python e la strutturazione dei dati. Torch compete con Theano, TensorFlow e altri framework di costruzione di sistemi di calcolo dinamico.
——— Approcci aggiuntivi alla comprensione ———
Strutture computazionali arbitrarie di tensori discreti arbitrari
Uno dei componenti che possono essere utilizzati per costruire un sistema computazionale è un elemento progettato per essere interconnesso per creare reti neurali. La disponibilità di questi supporta la costruzione di apprendimento profondo e la propagazione posteriore di reti neurali. È inoltre possibile costruire un'ampia varietà di altri sistemi che coinvolgono l'assemblaggio di componenti che funzionano con dati potenzialmente multidimensionali in strutture computazionali definite arbitrariamente.
I dati possono essere valori scalari, come numeri in virgola mobile, numeri interi o stringhe o aggregazioni ortogonali di questi, come vettori, matrici, cubi o ipercubi. Le operazioni sulla generalizzazione di questi moduli di dati sono tensori discreti e le strutture create dall'assemblaggio delle operazioni di tensore nei sistemi di lavoro sono flussi di dati.
Punti di riferimento per la comprensione del concetto di calcolo dinamico
I grafici computazionali dinamici non sono un concetto particolarmente nuovo, anche se il termine è relativamente nuovo. L'interesse per i DCG tra gli informatici non è nuovo come il termine Data Scientist. Tuttavia, la domanda afferma correttamente che ci sono poche risorse ben scritte disponibili (oltre agli esempi di codice) da cui è possibile apprendere il concetto generale che circonda il loro emergere e il loro uso.
Un possibile punto di riferimento per iniziare a comprendere i DCG è il modello di progettazione Command che è uno dei molti modelli di progettazione resi popolari dai sostenitori della progettazione orientata agli oggetti. Il modello di progettazione Comando considera le operazioni come unità di calcolo i cui dettagli sono nascosti agli oggetti comando che le attivano. Il modello di progettazione del comando viene spesso utilizzato insieme al modello di progettazione dell'interprete.
Nel caso dei DCG, sono coinvolti anche i modelli di progettazione composita e facciata per facilitare la definizione di operazioni discrete di tensore plug-and-play che possono essere assemblate in modelli per formare sistemi.
Questa particolare combinazione di modelli di progettazione per formare sistemi è in realtà un'astrazione software che assomiglia in gran parte all'idea radicale che ha portato alla nascita dell'architettura Von Neumann, centrale per la maggior parte dei computer di oggi. Il contributo di Von Neumann alla nascita del computer è l'idea di consentire che algoritmi arbitrari contenenti logica booleana, aritmetica e ramificazione siano rappresentati e archiviati come dati: un programma.
Un altro precursore dei DCG sono i motori di espressione. I motori di espressione possono essere semplici come i motori aritmetici e complessi come le applicazioni come Mathematica. Un motore delle regole è un po 'come i DCG, tranne per il fatto che i motori delle regole sono dichiarativi e le meta-regole per i motori delle regole operano su tali dichiarazioni.
Programmi Manipolazione dei programmi
Ciò che questi hanno in comune con i DCG è che il flusso di dati e operazioni da applicare può essere definito in fase di esecuzione. Come per i DCG, alcune di queste librerie e applicazioni software dispongono di API o altri meccanismi per consentire l'applicazione delle operazioni sui dettagli funzionali. È essenzialmente l'idea di un programma che consente la manipolazione di un altro programma.
Un altro punto di riferimento per comprendere questo principio a livello primitivo è l'istruzione case-switch disponibile in alcuni linguaggi informatici. È una struttura di codice sorgente in cui il programmatore esprime essenzialmente "Non siamo sicuri di cosa si debba fare, ma il valore di questa variabile dirà al modello di esecuzione in tempo reale cosa fare da un insieme di possibilità".
L'istruzione switch-case è un'astrazione che estende l'idea di rinviare la decisione sulla direzione del calcolo fino al tempo di esecuzione. È la versione software di ciò che viene fatto all'interno dell'unità di controllo di una CPU contemporanea e un'estensione del concetto di differimento di alcuni dettagli dell'algoritmo. Una tabella di functor (puntatori di funzione) in C o polimorfismo in C ++, Java o Python sono altri esempi primitivi.
Il calcolo dinamico porta ulteriormente l'astrazione. Difendono la maggior parte, se non tutte, le specifiche dei calcoli e le relazioni tra loro per eseguire il tempo. Questa generalizzazione completa amplia le possibilità di modifica funzionale in fase di esecuzione.
Rappresentazione grafica diretta del calcolo
Questo è il modello computazionale dinamico. Ora per la parte del grafico.
Una volta che si decide di rinviare la scelta delle operazioni da eseguire fino al tempo di esecuzione, è necessaria una struttura per contenere le operazioni, le loro relazioni di dipendenza e forse i parametri di mappatura. Tale rappresentazione è più di un albero sintattico (come un albero che rappresenta la gerarchia del codice sorgente). A differenza di un programma in linguaggio assembly o di un codice macchina, deve essere facilmente e arbitrariamente modificabile. Deve contenere più informazioni di un grafico del flusso di dati e molto più di una mappa di memoria. Come deve essere quella struttura di dati che specifica la struttura computazionale?
Fortunatamente qualsiasi algoritmo arbitrario, finito, limitato può essere rappresentato come un grafico diretto delle dipendenze tra operazioni specificate. In tale grafico, i vertici (spesso rappresentati come nodi di varie forme quando visualizzati) rappresentano operazioni eseguite sui dati e gli spigoli (spesso rappresentati come frecce quando visualizzati) sono rappresentazioni digitali di informazioni che derivano da alcune operazioni (o input di sistema) e da quali altre operazioni (o output di sistema) dipendono.
Tenere presente che il grafico diretto non è né un algoritmo (in quanto è specificata una sequenza precisa di operazioni) né una dichiarazione (in quanto i dati possono essere archiviati in modo esplicito e loop, rami, funzioni e moduli possono essere definibili e nidificati).
La maggior parte di questi framework e librerie di grafici computazionali dinamici consente ai componenti di eseguire calcoli sull'input dei componenti che supportano l'apprendimento automatico. I vertici nel grafico diretto possono essere simulazioni di neuroni per la costruzione di una rete neurale o componenti che supportano il calcolo differenziale. Questi quadri presentano possibilità di costrutti che possono essere utilizzati per l'apprendimento profondo in un senso più generalizzato.
Nel contesto della storia del computer
Ancora una volta, nulla di menzionato finora è nuovo per l'informatica. LISP consente di modificare gli schemi computazionali con altri algoritmi. Inoltre, la dimensionalità e la numerosità degli input generalizzate sono integrate in numerose interfacce e protocolli plug-and-play di lunga data. L'idea di un quadro per l'apprendimento risale allo stesso periodo della metà del XX secolo.
Ciò che è nuovo e che sta guadagnando popolarità è una particolare combinazione di funzionalità integrate e l'insieme di terminologia associato, un'aggregazione della terminologia esistente per ciascuna delle funzionalità, portando a una base più ampia per la comprensione da parte di coloro che già studiano e lavorano nel settore del software .
- Sapore contemporaneo (alla moda) delle interfacce API
- Orientamento agli oggetti
- Supporto tensore discreto
- L'astrazione del grafico diretto
- Interoperabilità con lingue e pacchetti popolari che supportano big data, data mining, machine learning e analisi statistiche
- Supporto per la costruzione di reti neurali arbitrarie e sistematiche
- La possibilità di adattamento strutturale della rete neurale dinamica (che facilita la sperimentazione sulla plasticità neurale)
Molti di questi framework supportano l'adattabilità al cambiamento della dimensionalità degli input (numero di dimensioni e intervallo di ciascuno).
Somiglianza con gli alberi di simboli astratti nei compilatori
Un grafico delle dipendenze di input e output di operazioni appare anche all'interno di alberi di simboli astratti (AST), che alcuni dei compilatori più progressivi costruiscono durante l'interpretazione della struttura del codice sorgente. L'AST viene quindi utilizzato per generare istruzioni assembler o istruzioni macchina nel processo di collegamento con le librerie e formazione di un eseguibile. L'AST è un grafico diretto che rappresenta la struttura dei dati, le operazioni eseguite e il flusso di controllo specificato dal codice sorgente.
Il flusso di dati è semplicemente l'insieme delle dipendenze tra le operazioni, che devono essere inerenti all'AST per l'AST da utilizzare per creare istruzioni di esecuzione nell'assemblatore o nel codice macchina che segue esattamente l'algoritmo specificato nel codice sorgente.
I framework grafici computazionali dinamici, a differenza delle istruzioni switch-case o dei modelli AST nei compilatori, possono essere manipolati in tempo reale, ottimizzati, sintonizzati (come nel caso delle reti artificiali in plastica), invertiti, trasformati da tensori, decimati, modificati per aggiungere o rimuovere entropia, mutata secondo un insieme di regole o altrimenti tradotta in forme derivate. Possono essere memorizzati come file o flussi e quindi recuperati da essi.
Questo è un concetto banale per i programmatori LISP o per coloro che comprendono la natura della raccomandazione di John von Neumann di memorizzare le specifiche operative come dati. In questo senso successivo, un programma è un flusso di dati per istruire, attraverso un compilatore e un sistema operativo, un sistema computazionale dinamico implementato nei circuiti digitali VLSI.
Raggiungimento di dimensionalità e numerosità adattabili
Nella domanda c'è il commento che non si ha, "Necessario avere un set di dati - che tutte le istanze al suo interno hanno lo stesso numero fisso di input". Tale affermazione non promuove una comprensione accurata. Esistono modi più chiari per dire ciò che è vero sull'adattabilità dell'input.
L'interfaccia tra un DCG e altri componenti di un sistema complessivo deve essere definita, ma queste interfacce possono avere dimensionalità dinamica o numerocità incorporate in essi. È una questione di astrazione.
Ad esempio, un tipo di oggetto tensore discreto presenta un'interfaccia software specifica, tuttavia un tensore è un concetto matematico dinamico attorno al quale è possibile utilizzare un'interfaccia comune. Un tensore discreto può essere uno scalare, un vettore, una matrice, un cubo o un ipercubo e l'intervallo di variabili dipendenti per ciascuna dimensione può essere variabile.
Può accadere che la quantità di nodi in uno strato del sistema definito in un grafico computazionale dinamico possa essere una funzione del numero di input di un particolare tipo e che anche questo possa essere un calcolo rinviato al tempo di esecuzione.
Il framework può essere programmato per selezionare la struttura del layer (un'estensione del paradigma switch-case) o per calcolare i parametri che definiscono le dimensioni della struttura e la profondità o l'attivazione. Tuttavia, queste sofisticate funzionalità non sono ciò che qualifica il framework come un framework grafico computazionale dinamico.
Cosa qualifica un framework per supportare i grafici computazionali dinamici?
Per qualificarsi come un quadro grafico computazionale dinamico, il quadro deve semplicemente supportare il differimento della determinazione dell'algoritmo per l'esecuzione del tempo, aprendo così la porta a una pletora di operazioni sulle dipendenze computazionali e sul flusso di dati in fase di esecuzione. Le basi delle operazioni differite devono includere le specifiche, la manipolazione, l'esecuzione e l'archiviazione dei grafici diretti che rappresentano i sistemi di operazioni.
Se la specifica dell'algoritmo NON viene differita fino al runtime ma viene compilata nell'eseguibile progettato per un sistema operativo specifico con solo la flessibilità tradizionale fornita da linguaggi di basso livello come if-then-else, switch-case, polimorfism, array of funzioni e stringhe di lunghezza variabile, è considerato un algoritmo statico.
Se le operazioni, le dipendenze tra loro, il flusso di dati, la dimensionalità dei dati all'interno del flusso e l'adattabilità del sistema alla numerosità e dimensionalità dell'input sono tutte variabili in fase di esecuzione in modo da creare un sistema altamente adattivo, quindi l'algoritmo è dinamico in questi modi.
Ancora una volta, i programmi LISP che operano su programmi LISP, i motori di regole con funzionalità di meta-regola, i motori di espressione, le librerie di oggetti tensore discreti e persino i modelli di progettazione dei comandi relativamente semplici sono tutti dinamici in un certo senso, rinviando alcune caratteristiche al tempo di esecuzione. I DCG sono flessibili e completi nelle loro capacità di supportare costrutti computazionali arbitrari in modo tale da creare un ambiente ricco per la sperimentazione di apprendimento profondo e l'implementazione di sistemi.
Quando utilizzare i grafici computazionali dinamici
I pro ei contro dei DCG sono interamente specifici del problema. Se studi i vari concetti di programmazione dinamica sopra e altri che potrebbero essere strettamente collegati a loro nella letteratura associata, diventerà ovvio se hai bisogno di un grafico computazionale dinamico o meno.
In generale, se è necessario rappresentare un modello di calcolo arbitrario e mutevole per facilitare l'implementazione del sistema di apprendimento profondo, del sistema di manipolazione matematica, del sistema adattivo o di altri costrutti software flessibili e complessi che si associano bene al paradigma DCG, allora una prova del concetto che utilizza un framework grafico computatonale dinamico è un buon primo passo nella definizione dell'architettura software per la soluzione del problema.
Non tutti i software di apprendimento utilizzano DCG, ma sono spesso una buona scelta, quando la manipolazione sistematica e possibilmente continua di una struttura computazionale arbitraria è un requisito di tempo di esecuzione.