2009-12-02 7 views
7

Per il mio progetto universitario sto creando una rete neurale in grado di classificare la probabilità che una transazione con carta di credito sia fraudolenta o meno. Mi sto allenando con backpropagation. Sto scrivendo questo in Java. Vorrei applicare il multithreading, perché il mio computer è un i7 quad-core. Mi dà fastidio passare ore ad allenarmi e vedere la maggior parte dei miei core inutilizzati.Come posso applicare il multithreading al training della rete neurale di backpropagation?

Ma come applicare il multithreading a backpropagation? Backprop funziona regolando gli errori all'indietro attraverso la rete. Uno strato deve essere fatto prima che l'altro possa continuare. C'è un modo in cui posso modificare il mio programma per fare lo sfondo multicore?

risposta

10

Prima di tutto non utilizzare backpropagation. Ci sono molte altre opzioni là fuori. Suggerirei di provare RPROP (propagazione resiliente). Non sarà così grande di modifiche al tuo algoritmo di backpropagation. Non è necessario specificare il tasso di apprendimento o la quantità di moto. È quasi come se tu avessi una velocità di apprendimento individuale, variabile per ogni connessione nella rete neurale.

Come applicare il multithreading a backpropagation. Ho appena scritto un articolo su questo argomento.

http://www.heatonresearch.com/encog/mprop/compare.html

Fondamentalmente creare un numero di fili e dividere i dati di addestramento così ogni thread ha un numero uguale vicino. Sto calcolando i gradienti in ogni thread e sono sommati in una fase di riduzione. Il modo in cui i gradienti vengono applicati ai pesi dipende dall'algoritmo di addestramento della propagazione utilizzato, ma l'aggiornamento del peso viene eseguito in una sezione critica.

Quando si dispone di un numero di campioni di allenamento considerevolmente maggiore del peso, il codice impiega molto più tempo nel calcolo del gradiente multi-thread rispetto all'aggiornamento del peso di sezione critico.

Fornisco alcuni dei risultati delle prestazioni al collegamento sopra. Fa davvero accelerare le cose!

+1

come si uniscono i pesi? Che cosa "unisce" significa qui, li aggiungi tutti? – PeeS

+0

I pesi non vengono uniti. Sto calcolando i gradienti in ogni thread e sono sommati in una fase di riduzione. Il modo in cui i gradienti vengono applicati ai pesi dipende dall'algoritmo di addestramento della propagazione utilizzato, ma l'aggiornamento del peso viene eseguito in una sezione critica. Quando si dispone di un numero di campioni di allenamento considerevolmente maggiore di quello del peso, il codice impiega molto più tempo nel calcolo del gradiente multi-thread rispetto all'aggiornamento del peso di sezione critico. – JeffHeaton

+1

Il tuo link serve una "Pagina non trovata". –

0

Per utilizzare più core CPU con Java si può solo provare più opzioni per la JVM senza modificare il codice:

  • -server
  • -d64
  • XX: -UseParallelGC

e altre opzioni al http://java.sun.com/javase/technologies/hotspot/vmoptions.jsp

+3

Queste opzioni possono velocizzare l'esecuzione, ma non renderanno parallelo il tuo algoritmo ... Se vuoi utilizzare più core per eseguire un algoritmo, dovrai modificarlo. – paradigmatic

+0

Sì. Ovviamente. Queste opzioni sono solo quelle minimamente necessarie quando si prova qualcosa di parallelo in Java. –