2016-02-28 6 views
65

Recentemente ho iniziato a studiare deep learning e altre tecniche ML, e ho iniziato a cercare framework che semplifichino il processo di costruzione di una rete e di addestramento, quindi ho trovato TensorFlow, avendo poca esperienza sul campo, per me, sembra che la velocità è un fattore importante per rendere ancora più grande un sistema ML di grandi dimensioni se si lavora con deep learning, quindi perché Python è stato scelto da Google per creare TensorFlow? Non sarebbe meglio farlo su un linguaggio che può essere compilato e non interpretato?TensorFlow, perché Python era la lingua scelta?

Quali sono i vantaggi dell'utilizzo di Python su un linguaggio come C++ per l'apprendimento automatico?

+1

Minore nitpick: la compilazione e l'interpretazione non sono opposti. Inoltre, qualsiasi linguaggio di programmazione può essere implementato con un compilatore o con un interprete o entrambi. C'è una bella [risposta] (https://softwareengineering.stackexchange.com/a/269878/121035) sulla distinzione rispetto a Software Engineering. – 8bittree

risposta

117

La cosa più importante da capire su tensorflow è che, per la maggior parte, il nucleo non è scritto in Python: E 'scritto in una combinazione di altamente ottimizzato C++ e CUDA (lingua di Nvidia per le GPU di programmazione). Molto di ciò accade, a sua volta, utilizzando Eigen (una libreria numerica C++ e CUDA ad alte prestazioni) e NVidia's cuDNN (una libreria DNN ottimizzata per NVidia GPUs, per funzioni come convolutions).

Il modello per TensorFlow è che il programmatore utilizza "un linguaggio" (molto probabilmente Python!) Per esprimere il modello. Questo modello, scritto nel tensorflow costrutti quali:

h1 = tf.nn.relu(tf.matmul(l1, W1) + b1) 
h2 = ... 

non è in realtà eseguita quando il Python viene eseguito. Invece, ciò che viene effettivamente creato è un dataflow graph che dice di prendere particolari input, applicare particolari operazioni, fornire i risultati come input ad altre operazioni, e così via. Questo modello viene eseguito con un codice C++ veloce e, per la maggior parte, i dati che vanno tra le operazioni non vengono mai ricondotti al codice Python.

Poi il programmatore "spinge" l'esecuzione di questo modello tirando su nodi - per la formazione, di solito in Python, e per servire, a volte in Python e talvolta in RAW C++:

sess.run(eval_results) 

Questo Python (o chiamata di funzione C++) utilizza una chiamata in-process a C++ o uno RPC per la versione distribuita per chiamare nel server C++ TensorFlow per dirgli di eseguire, e quindi copia i risultati.

Quindi, con ciò detto, riformuliamo la domanda: perché TensorFlow ha scelto Python come il primo linguaggio ben supportato per esprimere e controllare l'allenamento dei modelli?

La risposta è semplice: Python è probabilmente il più comodo lingua per una vasta gamma di scienziati di dati e gli esperti di apprendimento automatico che è anche facile da integrare e avere il controllo di un back-end C++, mentre anche essere generale, ampiamente utilizzato sia all'interno che all'esterno di Google e open source. Dato che con il modello base di TensorFlow, le prestazioni di Python non sono così importanti, era una scelta naturale.È anche un enorme vantaggio che lo NumPy rende facile eseguire la pre-elaborazione in Python, anche con alte prestazioni, prima di inviarlo a TensorFlow per le cose veramente pesanti della CPU.

C'è anche un po 'di complessità nell'esprimere il modello che non viene usato durante l'esecuzione - inferenza della forma (ad esempio, se si fa matmul (A, B), qual è la forma dei dati risultanti?) E calcolo automatico gradient. È stato bello essere in grado di esprimere quelli in Python, anche se penso che a lungo termine si sposteranno probabilmente sul backend C++ per facilitare l'aggiunta di altre lingue.

(La speranza, ovviamente, è supportare altre lingue in futuro per la creazione e l'espressione di modelli È già abbastanza semplice eseguire inferenza usando diversi altri linguaggi - C++ funziona ora, qualcuno da Facebook ha contribuito con Go associazioni stiamo rivedendo ora, ecc.)

+1

Come stai definendo "inferenza" in "È già abbastanza semplice eseguire inferenza usando diversi altri linguaggi" Essendo un programmatore Prolog, non è adatto a me; sembra una parola fuori luogo. –

+1

In esecuzione solo la pass forward del modello. Applicandolo ai dati e alla formazione. – dga

+0

Riguardo alla forma dell'inferenza.Sto convertendo alcune reti neurali in un linguaggio tipizzato staticamente solo per uso didattico e la scrittura di Duck in Ptyhon rende sicuramente più facile scrivere quella parte del codice. Dal lato filp, scrivere codice Python senza i tipi rende molto più difficile l'apprendimento di Ptyhon prima di eseguire i tipi. Vedo molti più errori di runtime utilizzando Ptyhon rispetto all'altra lingua che è F #. Potrebbe valere la pena notare che Duck digitava la risposta. –

3

Python consente di creare moduli di estensione utilizzando C e C++, l'interfaccia con il codice nativo e ancora i vantaggi offerti da Python.

TensorFlow utilizza Python, sì, ma contiene anche grandi quantità di C++.

Ciò consente un'interfaccia più semplice per la sperimentazione di un sovraccarico di pensiero umano con Python e per aggiungere prestazioni programmando le parti più importanti in C++.

11

TF non è scritto in python. È scritto in C++ (e utilizza il codice numerico ad alta prestazione libraries e CUDA) e puoi verificarlo guardando il loro github. Così the core is written not in python ma TF fornire un'interfaccia a molte altre lingue (python, C++, Java, Go)

enter image description here

Se si proviene da un mondo di analisi dei dati, si può pensare a questo proposito, come NumPy (non scritto in python, ma fornisce un'interfaccia per Python) o se sei un web-developer - pensateci come un database (PostgreSQL, MySQL, che può essere richiamato da Java, Python, PHP)


Python frontend (la lingua in cui le persone scrivono modelli in TF) è il più popolare a causa di manyreasons. A mio avviso il motivo principale è storico: la maggior parte degli utenti di ML lo usa già (un'altra scelta popolare è R) quindi se non fornirai un'interfaccia a Python, la tua libreria probabilmente sarà destinata all'oscurità.


Ma essere scritto in python non significa che il modello sia eseguito in python. Al contrario, se hai scritto il tuo modello nel modo giusto Python non viene mai eseguito durante la valutazione del grafico TF (eccetto lo tf.py_func(), che esiste per il debug e dovrebbe essere evitato nel modello reale esattamente perché viene eseguito da Python).

Questo è diverso da per esempio numpy. Ad esempio, se esegui np.linalg.eig(np.matmul(A, np.transpose(A)) (che è eig(AA')), l'operazione calcolerà trasporre in un linguaggio veloce (C++ o fortran), restituirlo a python, prenderlo da python insieme ad A e calcolare una moltiplicazione in qualche lingua veloce e restituire a Python, quindi calcola gli autovalore e lo restituisce a python. Ciononostante, operazioni costose come Matmul ed Eig sono calcolate in modo efficiente, ma perdi tempo spostando i risultati su Python e forzandoli. TF non lo fa, una volta definito il grafico, i tensori non sono in python ma in C++/CUDA/qualcos'altro.