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.
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.
Risposte:
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.
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:
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.
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.
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.
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!
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) .
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:
È possibile utilizzare più metodi per questo problema di ottimizzazione discreta , con la rete fuori errore di esempio come funzione di costo.
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.
Ho elencato molti modi di apprendimento della topologia nella mia tesi di master, capitolo 3 . Le grandi categorie sono:
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.
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.