Che cos'è un grafico computazionale dinamico?


19

Strutture come PyTorch e TensorFlow tramite TensorFlow Fold supportano grafici computazionali dinamici e stanno ricevendo attenzione da parte di esperti di dati.

Tuttavia, sembra che ci sia una mancanza di risorse per aiutare a comprendere i grafici computazionali dinamici.

Il vantaggio dei grafici computazionali dinamici sembra includere la capacità di adattarsi a quantità variabili nei dati di input. Sembra che ci possa essere una selezione automatica del numero di strati, il numero di neuroni in ogni strato, la funzione di attivazione e altri parametri NN, a seconda di ciascuna istanza del set di input durante l'allenamento. È una caratterizzazione accurata?

Quali sono i vantaggi dei modelli dinamici rispetto ai modelli statici? È per questo che i DCG stanno ricevendo molta attenzione? In sintesi, quali sono i DCG e quali sono i pro e i contro il loro utilizzo?

Risposte:


8

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.


" PyTorch è l'integrazione del framework Torch per il linguaggio Python " - Penso che questa affermazione possa essere interpretata erroneamente come " PyTorch è una libreria wrapper per il framework Torch per il linguaggio Python ", che sarebbe una falsa affermazione. Probabilmente dovresti riformularlo.
nbro,

" Con i framework di grafici computazionali dinamici, a differenza delle istruzioni switch-case o dei modelli AST intermedi nei compilatori, si possono manipolare le operazioni " ... " tradurle " - Cosa intendi con "traduzione delle operazioni"?
nbro,

1

In breve, i grafici di calcolo dinamico possono risolvere alcuni problemi che quelli statici non possono o sono inefficienti a causa della mancata formazione in batch.

Per essere più specifici, l'addestramento moderno della rete neurale viene solitamente svolto in batch , ovvero elaborando più di un'istanza di dati alla volta. Alcuni ricercatori scelgono dimensioni del lotto come 32, 128 mentre altri usano dimensioni del lotto superiori a 10.000. La formazione a istanza singola è generalmente molto lenta perché non può beneficiare del parallelismo hardware.

Ad esempio, in Natural Language Processing, i ricercatori vogliono formare reti neurali con frasi di diversa lunghezza. Usando i grafici di calcolo statico, di solito dovrebbero prima fare il padding , cioè aggiungere simboli insignificanti all'inizio o alla fine di frasi più brevi per fare tutte le frasi della stessa lunghezza. Questa operazione complica molto l'addestramento (ad esempio, è necessario mascherare, ridefinire le metriche di valutazione, sprecare una notevole quantità di tempo di calcolo su quei simboli imbottiti). Con un grafico di calcolo dinamico, il riempimento non è più necessario (o necessario solo all'interno di ciascun batch).

Un esempio più complicato potrebbe essere (utilizzare la rete neurale per) elaborare le frasi in base ai suoi alberi di analisi. Poiché ogni frase ha il proprio albero di analisi, ognuna richiede un diverso grafico di calcolo, il che significa che l'allenamento con un grafico di calcolo statico può consentire solo l'allenamento a istanza singola. Un esempio simile a questo è le reti neurali ricorsive .


0

Molte reti neurali profonde hanno un grafico del flusso di dati statico, il che significa approssimativamente che la struttura del suo calcolo (il suo grafico di calcolo) rimane stabile su input diversi. Ciò è positivo poiché possiamo sfruttare questa funzionalità per le prestazioni, ad esempio tramite mini-batch (elaborazione di una serie di input contemporaneamente).

Ma alcune reti neurali potrebbero avere un grafico di calcolo diverso per ciascun input. Ciò causa alcuni problemi (difficoltà di raggruppamento, la costruzione di grafici è costosa dal punto di vista computazionale), e quindi queste reti sono un po 'difficili da usare.

Il documento che colleghi risolve questo problema proponendo un metodo che può raggruppare diversi grafici di calcolo in uno solo. Quindi, possiamo fare le nostre solite tecniche NN.

I vantaggi sono le accelerazioni, che incentivano i ricercatori a esplorare diverse strutture ed essere più creativi, immagino.

Il vantaggio dei grafici computazionali dinamici sembra includere la capacità di adattarsi a quantità variabili nei dati di input. Sembra che ci possa essere una selezione automatica del numero di strati, il numero di neuroni in ogni strato, la funzione di attivazione e altri parametri NN, a seconda di ciascuna istanza del set di input durante l'allenamento. È una caratterizzazione accurata?

Questo non è corretto


0

I grafici computazionali dinamici sono semplicemente CG modificati con un livello di astrazione più elevato. La parola "Dinamica" spiega tutto: il modo in cui i dati fluiscono attraverso il grafico dipende dalla struttura di input, ovvero la struttura DCG è mutabile e non statica. Una delle sue applicazioni importanti è nelle reti neurali della PNL.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.