Come scegliere il numero di strati e nodi nascosti in una rete neurale feedforward?


542

Esiste un metodo standard e accettato per selezionare il numero di layer e il numero di nodi in ciascun layer in una rete neurale feed-forward? Sono interessato ai modi automatizzati di costruire reti neurali.


4
Tra tutte le ottime risposte, ho trovato utile questo documento dstath.users.uth.gr/papers/IJRS2009_Stathakis.pdf
Sigillo Debpriya

@DebpriyaSeal non è poi così utile ...
DarkCygnus

Risposte:


469

Mi rendo conto che a questa domanda è stata data una risposta, ma non credo che la risposta esistente coinvolga davvero la domanda oltre a indicare un collegamento generalmente correlato all'argomento della domanda. In particolare, il collegamento descrive una tecnica per la configurazione di rete programmatica, ma non si tratta di un " metodo accettato e standard " per la configurazione di rete.

Seguendo un piccolo insieme di regole chiare, è possibile impostare a livello di programmazione un'architettura di rete competente (cioè il numero e il tipo di strati neuronali e il numero di neuroni che compongono ogni strato). Seguendo questo schema questo ti darà un'architettura competente ma probabilmente non ottimale.

Ma una volta inizializzata questa rete, è possibile ottimizzare in modo iterativo la configurazione durante l'allenamento usando una serie di algoritmi ausiliari; una famiglia di questi funziona potando i nodi in base a (piccoli) valori del vettore del peso dopo un certo numero di epoche di addestramento - in altre parole, eliminando i nodi superflui / superflui (ne parleremo più avanti).

Quindi ogni NN ha tre tipi di livelli: input , nascosto e output .


Creare l'architettura NN significa quindi trovare valori per il numero di layer di ciascun tipo e il numero di nodi in ciascuno di questi layer.

Il livello di input

Semplice - ogni NN ne ha esattamente una - senza eccezioni di cui sono a conoscenza.

Per quanto riguarda il numero di neuroni che compongono questo strato, questo parametro viene determinato in modo completo e unico una volta che si conosce la forma dei dati di allenamento. In particolare, il numero di neuroni che compongono quel livello è uguale al numero di caratteristiche (colonne) nei dati . Alcune configurazioni NN aggiungono un nodo aggiuntivo per un termine di polarizzazione.


Il livello di output

Come il livello di input, ogni NN ha esattamente un livello di output. Determinare le sue dimensioni (numero di neuroni) è semplice; è completamente determinato dalla configurazione del modello scelto.

Il tuo NN sta funzionando in modalità Macchina o Regressione (la convenzione ML sull'uso di un termine che viene utilizzato anche nelle statistiche ma che assegna un significato diverso ad essa è molto confusa). Modalità macchina: restituisce un'etichetta di classe (ad es. "Account Premium" / "Account di base"). La modalità di regressione restituisce un valore (ad es. Prezzo).

Se NN è un regressore, il livello di output ha un singolo nodo.

Se NN è un classificatore, ha anche un singolo nodo a meno che non venga utilizzato softmax, nel qual caso il layer di output ha un nodo per etichetta di classe nel modello.

Gli strati nascosti

Quindi quelle poche regole stabiliscono il numero di livelli e dimensioni (neuroni / livello) sia per i livelli di input che di output. Questo lascia gli strati nascosti.

Quanti strati nascosti? Bene, se i tuoi dati sono linearmente separabili (cosa che conosci spesso quando inizi a scrivere un codice NN), non hai bisogno di alcun livello nascosto. Naturalmente, non è necessario nemmeno un NN per risolvere i dati, ma continuerà a fare il lavoro.

Oltre a ciò, come probabilmente saprai, c'è una montagna di commenti sulla questione della configurazione del livello nascosto negli NN (vedi le FAQ NN follemente approfondite e approfondite per un eccellente riassunto di quel commento). Un problema in questo argomento su cui esiste un consenso è la differenza di prestazioni dall'aggiunta di ulteriori livelli nascosti: le situazioni in cui le prestazioni migliorano con un secondo (o terzo, ecc.) Livello nascosto sono molto poche. Un livello nascosto è sufficiente per la maggior parte dei problemi.

E che dire delle dimensioni degli strati nascosti: quanti neuroni? Esistono alcune regole empiriche derivate empiricamente, di queste, la più comunemente invocata è " la dimensione ottimale del livello nascosto è di solito tra la dimensione dell'input e la dimensione dei layer di output ". Jeff Heaton, autore di Introduzione alle reti neurali in Java, ne offre alcune in più.

In breve, per la maggior parte dei problemi, si potrebbero probabilmente ottenere prestazioni decenti (anche senza una seconda fase di ottimizzazione) impostando la configurazione del livello nascosto usando solo due regole: (i) il numero di livelli nascosti è uguale a uno; e (ii) il numero di neuroni in quello strato è la media dei neuroni negli strati di input e output.


Ottimizzazione della configurazione di rete

Potaturadescrive una serie di tecniche per tagliare le dimensioni della rete (per nodi e non livelli) per migliorare le prestazioni computazionali e talvolta le prestazioni di risoluzione. L'essenza di queste tecniche sta rimuovendo i nodi dalla rete durante l'addestramento identificando quei nodi che, se rimossi dalla rete, non influenzerebbero notevolmente le prestazioni della rete (cioè la risoluzione dei dati). (Anche senza usare una tecnica di potatura formale, puoi avere un'idea approssimativa di quali nodi non sono importanti guardando la tua matrice di peso dopo l'allenamento; guarda i pesi molto vicini allo zero - sono i nodi su entrambe le estremità di quei pesi che sono spesso rimosso durante la potatura.) Ovviamente, se si utilizza un algoritmo di potatura durante l'allenamento, iniziare con una configurazione di rete che ha maggiori probabilità di avere nodi in eccesso (cioè "potabili"), in altre parole,

Detto in altro modo, applicando un algoritmo di potatura alla tua rete durante l'allenamento, puoi avvicinarti alla configurazione ottimale della rete; se riesci a farlo in un singolo "up-front" (come un algoritmo basato su algoritmo genetico) non lo so, anche se so che per ora questa ottimizzazione in due passaggi è più comune.


31
Affermate che per la maggior parte dei problemi è necessario solo un livello nascosto. Forse è meglio dire che le NN con più livelli nascosti sono estremamente difficili da addestrare (se vuoi sapere come, controlla le pubblicazioni del gruppo di Hinton a Uof Toronto, "deep learning") e quindi quei problemi che richiedono più di un nascosto gli strati sono considerati "non risolvibili" dalle reti neurali.
Bayerj,

13
Scrivi Se l'NN è un regressore, il livello di output ha un singolo nodo. . Perché solo un singolo nodo? Perché non posso avere più uscite continue?
Gerrit,

5
@gerrit Puoi sicuramente avere più output continui se il tuo output target ha un valore vettoriale. La definizione di una funzione di perdita appropriata per gli output con valori vettoriali può essere un po 'più complicata rispetto a un output.
lmjohns3,

5
Ho pensato che fosse l'opposto di questo: se NN è un classificatore, allora ha anche un singolo nodo a meno che non venga utilizzato softmax, nel qual caso il livello di output ha un nodo per etichetta di classe nel modello.
viyps

2
@doug Grazie per questa meravigliosa risposta. Questo mi ha permesso di ridurre la mia ANN da 3 strati nascosti fino a 1 e ottenere la stessa precisione di classificazione impostando il giusto numero di neuroni nascosti ... Ho appena usato la media dell'input e dell'output sommati insieme. Grazie!
Rayryeng,

130

La risposta di @ Doug ha funzionato per me. C'è un'ulteriore regola empirica che aiuta a risolvere i problemi di apprendimento. Di solito è possibile prevenire un eccesso di adattamento se si mantiene il numero di neuroni di seguito:

Nh=Ns(α(Ni+No))

Ni
No
Ns
α

alpha

Ns(Ni+No)α

Per una procedura automatizzata, inizieresti con un valore alfa pari a 2 (il doppio dei gradi di libertà nei dati di allenamento rispetto al modello) e aumenterai fino a 10 se l'errore (perdita) per il set di dati di allenamento è significativamente inferiore rispetto a il set di dati di test.


7
Questa formula è molto interessante e utile. C'è qualche riferimento per questa formula? Sarebbe più utile.
prashanth,

2
@prashanth Ho combinato diverse asserzioni e formule nel testo di NN Design sopra citato. Ma non penso che sia esplicitamente richiamato nella forma che mostro. E la mia versione è un'approssimazione molto grezza con molte ipotesi di semplificazione. Quindi YMMV.
piani cottura

1
Prima di tutto volevo scrivere un set di allenamento invece del set di test nel commento precedente. Forse questa formula ha senso se la leggiamo come "hai bisogno di almeno molti neuroni per apprendere abbastanza caratteristiche (il DOF che hai citato) dal set di dati". Se le caratteristiche del set di dati sono rappresentative della popolazione e di quanto bene il modello possa generalizzare, forse è una domanda diversa (ma importante).
kon psych,

3
Nh(Ni+No)

2
@mateus, forse una regola empirica leggermente migliore per più livelli è la soluzione N_h(numero medio di neuroni nascosti per strato) a questo N_s = (N_i + N_o) * N_h ^ N_hidden_layers. Ma non userei ancora questa formula. È solo per problemi di base (problemi con i giocattoli) quando non prevedi di implementare altri approcci di regolarizzazione.
piani cottura

61

Da Introduction to Neural Networks for Java (seconda edizione) di Jeff Heaton - anteprima disponibile gratuitamente su Google Libri e precedentemente sul sito Web dell'autore :

Il numero di strati nascosti

Ci sono davvero due decisioni che devono essere prese riguardo agli strati nascosti: quanti strati nascosti devono effettivamente avere nella rete neurale e quanti neuroni saranno presenti in ciascuno di questi strati. Esamineremo innanzitutto come determinare il numero di strati nascosti da utilizzare con la rete neurale.

Raramente si verificano problemi che richiedono due livelli nascosti. Tuttavia, le reti neurali con due livelli nascosti possono rappresentare funzioni con qualsiasi tipo di forma. Non esiste attualmente alcun motivo teorico per utilizzare le reti neurali con non più di due livelli nascosti. In effetti, per molti problemi pratici, non c'è motivo di usare più di un livello nascosto. La Tabella 5.1 riassume le capacità delle architetture di reti neurali con vari livelli nascosti.

Tabella 5.1: Determinazione del numero di strati nascosti

| Numero di strati nascosti | Risultato |

 0 - In grado di rappresentare solo funzioni o decisioni lineari separabili.

 1 - Può approssimare qualsiasi funzione che contenga una mappatura continua
da uno spazio finito all'altro.

 2 - Può rappresentare una decisione arbitraria al limite dell'accuratezza arbitraria
con funzioni di attivazione razionale e può approssimare qualsiasi liscia
mappatura con precisione.

Decidere il numero di strati di neuroni nascosti è solo una piccola parte del problema. Devi anche determinare quanti neuroni saranno presenti in ciascuno di questi strati nascosti. Questo processo è trattato nella sezione successiva.

Il numero di neuroni negli strati nascosti

Decidere il numero di neuroni negli strati nascosti è una parte molto importante nel decidere la tua architettura di rete neurale generale. Sebbene questi layer non interagiscano direttamente con l'ambiente esterno, hanno un'enorme influenza sull'output finale. Sia il numero di strati nascosti che il numero di neuroni in ciascuno di questi strati nascosti devono essere attentamente considerati.

L'uso di un numero troppo limitato di neuroni negli strati nascosti comporterà qualcosa chiamato insufficiente. Il underfitting si verifica quando ci sono troppi neuroni negli strati nascosti per rilevare adeguatamente i segnali in un set di dati complicato.

L'uso di troppi neuroni negli strati nascosti può causare diversi problemi. In primo luogo, troppi neuroni negli strati nascosti possono causare un eccesso di adattamento. Il sovra-adattamento si verifica quando la rete neurale ha una capacità di elaborazione delle informazioni così grande che la quantità limitata di informazioni contenute nel set di addestramento non è sufficiente per addestrare tutti i neuroni negli strati nascosti. Un secondo problema può verificarsi anche quando i dati di allenamento sono sufficienti. Un numero eccessivamente elevato di neuroni negli strati nascosti può aumentare il tempo necessario per addestrare la rete. La quantità di tempo di addestramento può aumentare al punto che è impossibile addestrare adeguatamente la rete neurale. Ovviamente, è necessario raggiungere un compromesso tra troppi e troppo pochi neuroni negli strati nascosti.

Esistono molti metodi empirici per determinare il numero corretto di neuroni da utilizzare negli strati nascosti, come i seguenti:

  • Il numero di neuroni nascosti dovrebbe essere compreso tra la dimensione del livello di input e la dimensione del livello di output.
  • Il numero di neuroni nascosti dovrebbe essere pari a 2/3 della dimensione del livello di input, più la dimensione del livello di output.
  • Il numero di neuroni nascosti dovrebbe essere inferiore al doppio della dimensione del livello di input.

Queste tre regole forniscono un punto di partenza da prendere in considerazione. Alla fine, la selezione di un'architettura per la tua rete neurale finirà per tentativi ed errori. Ma cosa si intende esattamente per tentativi ed errori? Non vuoi iniziare a lanciare un numero casuale di strati e neuroni nella tua rete. Farlo richiederebbe molto tempo. Il capitolo 8, "Potatura di una rete neurale" esplorerà vari modi per determinare una struttura ottimale per una rete neurale.


Mi piace anche il seguente frammento di una risposta che ho trovato su researchgate.net , che trasmette molto in poche parole:

Steffen B Petersen · Università di Aalborg

[...]

Per garantire la capacità della rete di generalizzare il numero di nodi deve essere mantenuto il più basso possibile. Se si dispone di un grande eccesso di nodi, la rete diventa un banco di memoria in grado di richiamare alla perfezione il set di allenamento, ma non funziona bene su campioni che non facevano parte del set di allenamento.


Conosci la fonte della citazione di Steffen B Petersen?
Sebastian Nielsen,

Mi dispiace di no. Ho provato a cercarlo ma non sono riuscito a trovarlo ... Penso che l'articolo sia stato rimosso dal web. Forse puoi contattarlo direttamente?
jj_

Le dimensioni del set di allenamento non dovrebbero essere prese in considerazione? Ho un set di dati tabellare con ~ 300.000 campioni unici (prezzi delle auto). Il livello di input ha 89 nodi. Addestrando una rete senza regolarizzazione e solo 89 nodi in un singolo strato nascosto, dopo poche epoche la perdita dell'allenamento arriva al plateau. Altopiani RMSE a ~ $ 1,800 (il singolo nodo di output è il prezzo in questo problema di regressione).
rodrigo-silveira,

Penso che la fonte della citazione di Steffen B Petersen fosse qui: researchgate.net/post/…
TripleAntigen

43

Al momento sto lavorando a uno studio empirico su questo (approvando un secolo di simulazioni di processori sulla nostra struttura HPC!). Il mio consiglio sarebbe di usare una rete "grande" e la regolarizzazione, se usi la regolarizzazione allora l'architettura di rete diventa meno importante (a condizione che sia abbastanza grande da rappresentare la funzione sottostante che vogliamo catturare), ma devi regolare la regolarizzazione parametro correttamente.

Uno dei problemi con la selezione dell'architettura è che si tratta di un controllo discreto, piuttosto che continuo, della complessità del modello, e quindi può essere un po 'uno strumento contundente, specialmente quando la complessità ideale è bassa.

Tuttavia, tutto ciò è soggetto ai teoremi di "nessun pranzo libero", mentre la regolarizzazione è efficace nella maggior parte dei casi, ci saranno sempre casi in cui la selezione dell'architettura funziona meglio e l'unico modo per scoprire se ciò è vero per il problema attuale è provare entrambi gli approcci e convalidare in modo incrociato.

Se dovessi costruire un costruttore di reti neurali automatiche, utilizzerei l'approccio bayesiano basato sul campionamento Hybrid Monte Carlo (HMC) di Radford Neal, e utilizzerei una grande rete e si integrerei sui pesi anziché ottimizzare i pesi di una singola rete. Tuttavia, ciò è computazionalmente costoso e un po 'di "arte nera", ma i risultati ottenuti dal Prof. Neal suggeriscono che ne vale la pena!


"Al momento sto lavorando a uno studio empirico su questo" - C'è qualche aggiornamento?
Martin Thoma,

2
no, "fragile", consiglierei comunque la grande rete (ish) e la regolarizzazione, ma non esiste un proiettile d'argento, alcuni problemi non richiedono regolarizzazione, ma alcuni set di dati richiedono l'ottimizzazione delle dimensioni dei livelli nascosta e la regolarizzazione. Purtroppo ai recensori non è piaciuto il documento :-(
Dikran Marsupial

17

Per quanto ne so non c'è modo di selezionare automaticamente il numero di strati e neuroni in ogni strato. Ma ci sono reti che possono costruire automaticamente la loro topologia, come EANN (reti neurali artificiali evolutive, che usano algoritmi genetici per evolvere la topologia).

Esistono diversi approcci, uno più o meno moderno che sembrava dare buoni risultati era NEAT (Neuro Evolution of Augmented Topologies) .



6

Modi automatizzati di costruzione di reti neurali mediante la ricerca globale di iperparametri:

I livelli di input e output hanno dimensioni fisse.

Cosa può variare:

  • il numero di strati
  • numero di neuroni in ogni strato
  • il tipo di livello

È possibile utilizzare più metodi per questo problema di ottimizzazione discreta , con la rete fuori errore di esempio come funzione di costo.

  • 1) Ricerca griglia / casuale nello spazio dei parametri, per iniziare da una posizione leggermente migliore
  • 2) Molti metodi che potrebbero essere utilizzati per trovare l'architettura ottimale. (Sì, ci vuole tempo).
  • 3) Fai un po 'di regolarizzazione, risciacqua, ripeti.

6

Mi dispiace non posso ancora pubblicare un commento, quindi per favore abbi pazienza. Ad ogni modo, mi sono imbattuto in questo thread di discussione che mi ha ricordato un documento che avevo visto molto di recente. Penso che potrebbe essere di interesse per le persone che partecipano qui:

AdaNet: apprendimento strutturale adattivo delle reti neurali artificiali

Corinna Cortes, Xavier Gonzalvo, Vitaly Kuznetsov, Mehryar Mohri, Scott Yang; Atti della 34a Conferenza internazionale sull'apprendimento automatico, PMLR 70: 874-883, 2017.

Riassunto Presentiamo un nuovo framework per l'analisi e l'apprendimento delle reti neurali artificiali. Il nostro approccio apprende simultaneamente e adattivamente sia la struttura della rete che i suoi pesi. La metodologia è basata e accompagnata da forti garanzie di apprendimento teorico dipendenti dai dati, in modo che l'architettura di rete finale si adatti in modo dimostrabile alla complessità di ogni dato problema.


5

Ho elencato molti modi di apprendimento della topologia nella mia tesi di master, capitolo 3 . Le grandi categorie sono:

  • Approcci in crescita
  • Approcci di potatura
  • Approcci genetici
  • Insegnamento rafforzativo
  • Tessuti neurali convoluzionali

3

Vorrei suggerire un metodo meno comune ma super efficace .

Fondamentalmente, puoi sfruttare una serie di algoritmi chiamati "algoritmi genetici" che provano un piccolo sottoinsieme delle potenziali opzioni (numero casuale di livelli e nodi per strato). Quindi tratta questa popolazione di opzioni come "genitori" che creano bambini combinando / mutando uno o più genitori proprio come si evolvono gli organismi. I bambini migliori e alcuni bambini ok casuali sono tenuti in ogni generazione e nel corso delle generazioni, i più adatti sopravvivono.

Per ~ 100 o meno parametri (come la scelta del numero di strati, tipi di strati e numero di neuroni per strato), questo metodo è super efficace. Usalo creando una serie di potenziali architetture di rete per ogni generazione e addestrandole parzialmente fino a quando la curva di apprendimento può essere stimata (100-10k mini-batch in genere a seconda di molti parametri). Dopo alcune generazioni, potresti voler considerare il punto in cui il treno e la convalida iniziano a presentare un tasso di errore significativamente diverso (eccesso di adattamento) come funzione oggettiva per la scelta dei bambini. Potrebbe essere una buona idea utilizzare un sottoinsieme molto piccolo dei tuoi dati (10-20%) fino a quando non scegli un modello finale per raggiungere una conclusione più rapidamente. Inoltre, utilizzare un singolo seed per l'inizializzazione della rete per confrontare correttamente i risultati.

10-50 generazioni dovrebbero produrre grandi risultati per una rete di dimensioni decenti.


Un altro modo molto interessante è l'ottimizzazione bayesiana che è anche un metodo di ottimizzazione black box estremamente efficace per un numero relativamente piccolo di parametri. arxiv.org/pdf/1206.2944.pdf
Dan Erez,

2

Numero di strati nascosti e cosa possono ottenere:

0 - In grado di rappresentare solo funzioni o decisioni lineari separabili.

1 - Può approssimare qualsiasi funzione che contenga una mappatura continua da uno spazio finito ad un altro.

2 - Può rappresentare un limite decisionale arbitrario all'accuratezza arbitraria con funzioni di attivazione razionale e può approssimare qualsiasi mappatura regolare a qualsiasi accuratezza.

Più di 2: livelli aggiuntivi possono apprendere rappresentazioni complesse (una sorta di ingegneria automatica delle caratteristiche) per i livelli.


8
Fonte / i per favore. - Revisore
Jim,
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.