Una domanda simile è stata posta sul CV: Elenco completo delle funzioni di attivazione nelle reti neurali con pro / contro .
Copio di seguito una delle risposte:
Uno di questi elenchi, anche se non molto esaustivo:
http://cs231n.github.io/neural-networks-1/
Funzioni di attivazione comunemente utilizzate
Ogni funzione di attivazione (o non linearità ) accetta un singolo numero ed esegue una determinata operazione matematica fissa su di esso. Esistono diverse funzioni di attivazione che potresti incontrare in pratica:
Sinistra: la non linearità del sigmoide schiaccia i numeri reali per variare tra [0,1] Destra: la non linearità tanh schiaccia i numeri reali tra [-1,1].
Sigma. La non linearità sigmoidea ha la forma matematica σ( x ) = 1 / ( 1 + e- x)e viene mostrato nell'immagine sopra a sinistra. Come accennato nella sezione precedente, prende un valore reale e lo "schiaccia" nell'intervallo tra 0 e 1. In particolare, i numeri negativi grandi diventano 0 e i numeri positivi grandi diventano 1. La funzione sigmoid ha visto storicamente un uso frequente poiché ha una buona interpretazione come la frequenza di sparo di un neurone: dal non sparare affatto (0) allo sparo completamente saturo alla frequenza massima presunta (1). In pratica, la non linearità sigmoidea è recentemente caduta in disgrazia e raramente viene mai utilizzata. Ha due principali inconvenienti:
- I sigmoidi saturano e uccidono i gradienti . Una proprietà molto indesiderabile del neurone sigmoideo è che quando l'attivazione del neurone si satura a una coda di 0 o 1, il gradiente in queste regioni è quasi zero. Ricordiamo che durante la backpropagation, questo gradiente (locale) verrà moltiplicato per il gradiente dell'output di questo gate per l'intero obiettivo. Pertanto, se il gradiente locale è molto piccolo, "ucciderà" effettivamente il gradiente e quasi nessun segnale fluirà attraverso il neurone fino ai suoi pesi e ricorsivamente ai suoi dati. Inoltre, è necessario prestare particolare attenzione quando si inizializzano i pesi dei neuroni sigmoidi per prevenire la saturazione. Ad esempio, se i pesi iniziali sono troppo grandi, la maggior parte dei neuroni si satura e la rete imparerà a malapena.
- x > 0f= wTx + bwf). Ciò potrebbe introdurre dinamiche a zig-zag indesiderabili negli aggiornamenti del gradiente per i pesi. Tuttavia, si noti che una volta sommati questi gradienti attraverso una serie di dati, l'aggiornamento finale per i pesi può avere segni variabili, mitigando in qualche modo questo problema. Pertanto, questo è un inconveniente, ma ha conseguenze meno gravi rispetto al problema di attivazione saturo sopra riportato.
tanh( x ) = 2 σ( 2 x ) - 1.
Sinistra: funzione di attivazione Unità lineare rettificata (ReLU), che è zero quando x <0 e quindi lineare con pendenza 1 quando x> 0. A destra: un diagramma di Krizhevsky et al. (pdf) documento che indica il miglioramento 6x della convergenza con l'unità ReLU rispetto all'unità tanh.
Relu. L'unità lineare rettificata è diventata molto popolare negli ultimi anni. Calcola la funzionef( x ) = max ( 0 , x ). In altre parole, l'attivazione è semplicemente a soglia zero (vedi immagine sopra a sinistra). Esistono diversi pro e contro nell'uso delle ReLU:
- (+) Si è scoperto che accelera notevolmente (ad esempio un fattore 6 in Krizhevsky et al. ) La convergenza della discesa gradiente stocastica rispetto alle funzioni sigmoide / tanh. Si sostiene che ciò sia dovuto alla sua forma lineare e non satura.
- (+) Rispetto ai neuroni tanh / sigmoidi che comportano operazioni costose (esponenziali, ecc.), La ReLU può essere implementata semplicemente portando a zero una matrice di attivazioni.
- (-) Sfortunatamente, le unità ReLU possono essere fragili durante l'allenamento e possono "morire". Ad esempio, una grande pendenza che fluisce attraverso un neurone ReLU potrebbe far aggiornare i pesi in modo tale che il neurone non si attiverà mai più su nessun punto dati. Se ciò accade, il gradiente che fluisce attraverso l'unità sarà per sempre zero da quel punto in poi. Cioè, le unità ReLU possono morire irreversibilmente durante l'allenamento poiché possono staccarsi dal collettore di dati. Ad esempio, potresti scoprire che fino al 40% della tua rete può essere "morto" (cioè neuroni che non si attivano mai nell'intero set di dati di allenamento) se il tasso di apprendimento è impostato su un valore troppo alto. Con una corretta impostazione del tasso di apprendimento, questo è meno frequentemente un problema.
Perdita ReLU. Perdite ReLU sono un tentativo di risolvere il problema "morire ReLU". Invece che la funzione sia zero quando x <0, una ReLU che perde avrà invece una piccola pendenza negativa (di 0,01 o giù di lì). Cioè, la funzione calcolaf( x ) = 1 ( x < 0 ) ( α x ) + 1 ( x > = 0 ) ( x ) dove αè una piccola costante. Alcune persone segnalano il successo con questa forma di funzione di attivazione, ma i risultati non sono sempre coerenti. La pendenza nella regione negativa può anche essere trasformata in un parametro di ciascun neurone, come visto nei neuroni PReLU, introdotto in Delving Deep in Rectifiers , da Kaiming He et al., 2015. Tuttavia, la coerenza del beneficio tra i compiti è attualmente poco chiaro.
Maxout . Sono stati proposti altri tipi di unità che non hanno la forma funzionalef( wTx + b )dove viene applicata una non linearità sul prodotto punto tra pesi e dati. Una scelta relativamente popolare è il neurone Maxout (introdotto di recente da
Goodfellow et al. ) Che generalizza la ReLU e la sua versione che perde. Il neurone Maxout calcola la funzionemax ( wT1x + b1, wT2x + b2). Si noti che sia ReLU che Leaky ReLU sono un caso speciale di questo modulo (ad esempio, per ReLU abbiamow1, b1= 0). Il neurone Maxout gode quindi di tutti i vantaggi di un'unità ReLU (regime di funzionamento lineare, nessuna saturazione) e non presenta i suoi svantaggi (ReLU morente). Tuttavia, a differenza dei neuroni ReLU, raddoppia il numero di parametri per ogni singolo neurone, portando a un elevato numero totale di parametri.
Questo conclude la nostra discussione sui tipi più comuni di neuroni e sulle loro funzioni di attivazione. Come ultimo commento, è molto raro mescolare e abbinare diversi tipi di neuroni nella stessa rete, anche se non vi è alcun problema fondamentale nel farlo.
TLDR : " Che tipo di neurone dovrei usare? " Usa la non linearità ReLU, fai attenzione alle tue percentuali di apprendimento e, eventualmente, controlla la frazione di unità "morte" in una rete. Se questo ti riguarda, prova Leaky ReLU o Maxout. Non usare mai sigmoid. Prova tanh, ma aspettati che funzioni peggio di ReLU / Maxout.
Licenza:
la licenza MIT (MIT)
Copyright (c) 2015 Andrej Karpathy
L'autorizzazione è concessa, gratuitamente, a chiunque ottenga una copia di questo software e dei file di documentazione associati (il "Software"), per trattare il Software senza restrizioni, incluso senza limitazione i diritti di utilizzo, copia, modifica, unione , pubblicare, distribuire, concedere in licenza e / o vendere copie del Software e consentire alle persone a cui il Software è fornito di farlo, fatte salve le seguenti condizioni:
La suddetta nota sul copyright e questa nota di autorizzazione devono essere incluse in tutte le copie o parti sostanziali del Software.
IL SOFTWARE È FORNITO "COSÌ COM'È", SENZA ALCUN TIPO DI GARANZIA, ESPRESSA O IMPLICITA, COMPRESO MA NON LIMITATO ALLE GARANZIE DI COMMERCIABILITÀ, IDONEITÀ PER UNO SCOPO PARTICOLARE E NON VIOLAZIONE. IN NESSUN CASO GLI AUTORI OI TITOLARI DEL COPYRIGHT SARANNO RESPONSABILI DI QUALSIASI RECLAMO, DANNO O ALTRO RESPONSABILITÀ, SE IN AZIONE DI CONTRATTO, TORT O ALTRO, DERIVANTE DA, FUORI O IN CONNESSIONE CON IL SOFTWARE O L'UTILIZZO O ALTRE OFFERTE NEL SOFTWARE.*