In che modo la funzione di attivazione rettilinea risolve il problema del gradiente evanescente nelle reti neurali?


40

Ho trovato l'unità lineare rettificata (ReLU) elogiata in diversi punti come soluzione al problema del gradiente di fuga per le reti neurali. Cioè, si usa max (0, x) come funzione di attivazione. Quando l'attivazione è positiva, è ovvio che è meglio, per esempio, della funzione di attivazione sigmoidea, poiché la sua derivazione è sempre 1 invece di un valore arbitrariamente piccolo per x grande. D'altra parte, la derivazione è esattamente 0 quando x è minore di 0. Nel caso peggiore, quando un'unità non viene mai attivata, anche i pesi per questa unità non cambieranno mai più e l'unità sarebbe per sempre inutile - il che sembra inutile molto peggio delle sfumature anche minuscole. In che modo gli algoritmi di apprendimento affrontano questo problema quando usano ReLU?


2
Quello che descrivi come il caso peggiore si chiama ReLU morente
Martin Thoma,

Penso che l'idea sia che per una funzione logistica, poiché il gradiente può diventare arbitrariamente piccolo, è possibile ottenere un gradiente numericamente evanescente componendo diverse logistiche "trascurabili" (il problema peggiorerebbe quindi per architetture più profonde). Per la funzione di rampa, poiché il gradiente è costante a tratti, un gradiente composito evanescente può verificarsi solo se esiste un componente che è effettivamente 0.
GeoMatt22

(Non sono sicuro che questo sia "per sempre"? Non potrebbe diventare diverso da zero dopo un ulteriore addestramento? Dalle dipendenze su altri nodi e / o l'attuale mini-batch di dati? (Per la discesa stocastica del gradiente)
GeoMatt22

Risposte:


33

Ecco un documento che spiega il problema. Ne sto citando una parte per chiarire il problema.

La funzione di attivazione del raddrizzatore consente a una rete di ottenere facilmente rappresentazioni sparse. Ad esempio, dopo l'inizializzazione uniforme dei pesi, circa il 50% dei valori di uscita continui delle unità nascoste sono zeri reali e questa frazione può facilmente aumentare con la regolarizzazione che induce la scarsità.

Quindi la funzione di attivazione del raddrizzatore introduce l'effetto di scarsità sulla rete. Ecco alcuni vantaggi della scarsità dalla stessa carta;

  • Informazione districante . Uno degli obiettivi dichiarati degli algoritmi di deep learning (Bengio, 2009) è quello di districare i fattori che spiegano le variazioni nei dati. Una rappresentazione densa è fortemente intrecciata perché quasi ogni cambiamento nell'input modifica la maggior parte delle voci nel vettore di rappresentazione. Invece, se una rappresentazione è al contempo sparsa e robusta rispetto a piccole modifiche di input, l'insieme di funzioni diverse da zero è quasi sempre approssimativamente conservato da piccole modifiche di input.

  • Rappresentazione efficiente di dimensioni variabili . Input diversi possono contenere diverse quantità di informazioni e sarebbero rappresentati più convenientemente usando una struttura di dati di dimensioni variabili, che è comune nelle rappresentazioni informatiche di informazioni. La variazione del numero di neuroni attivi consente a un modello di controllare l'effettiva dimensionalità della rappresentazione per un dato input e la precisione richiesta.

  • Separabilità lineare . Le rappresentazioni sparse hanno anche maggiori probabilità di essere linearmente separabili, o più facilmente separabili con meno macchine non lineari, semplicemente perché le informazioni sono rappresentate in uno spazio ad alta dimensione. Inoltre, ciò può riflettere il formato dati originale. Nelle applicazioni relative al testo, ad esempio, i dati grezzi originali sono già molto scarsi.

  • Distribuito ma scarso . Le rappresentazioni distribuite dense sono le rappresentazioni più ricche, essendo potenzialmente esponenzialmente più efficienti di quelle puramente locali (Bengio, 2009). L'efficienza delle rappresentazioni sparse è ancora esponenzialmente maggiore, con la potenza dell'esponente il numero di caratteristiche diverse da zero. Possono rappresentare un buon compromesso rispetto ai criteri di cui sopra.

Risponde anche alla domanda che hai posto:

SoftPlus(X)=log(1+eX)(Dugas et al., 2001), una versione uniforme della non linearità rettificatrice. Perdiamo l'esatta scarsità, ma possiamo sperare di ottenere un allenamento più facile. Tuttavia, i risultati sperimentali tendono a contraddire questa ipotesi, suggerendo che gli zeri forti possono effettivamente aiutare l'allenamento supervisionato. Ipotizziamo che le non linearità rigide non danneggino finché il gradiente può propagarsi lungo alcuni percorsi, cioè che alcune delle unità nascoste in ogni livello sono diverse da zero Con il credito e la colpa assegnati a queste unità ON piuttosto che distribuite più uniformemente, ipotizziamo che l'ottimizzazione sia più semplice.

Puoi leggere l' articolo per maggiori dettagli.


18

Questo è il motivo per cui è probabilmente un'idea migliore usare PReLU, ELU o altre attivazioni simili a ReLU che non si estinguono solo a 0, ma che cadono a qualcosa come 0.1 * x quando x diventa negativo per continuare ad imparare. Per molto tempo mi è sembrato che le ReLU siano una storia come il sigmoide, anche se per qualche ragione la gente pubblica ancora articoli con queste. Perché? Non lo so.

Dmytro Mishkin e altri ragazzi hanno effettivamente testato una rete con molti diversi tipi di attivazione, dovresti esaminare i loro risultati sulle prestazioni delle diverse funzioni di attivazione e altre cose. Alcune funzioni, come XOR, tuttavia, vengono apprese meglio con ReLU semplice. Non pensare a nessun materiale neurale in termini di dogma, perché le reti neurali sono molto in fase di sviluppo. Nessuno al mondo in realtà li conosce e li capisce abbastanza bene da dire la verità divina. Nessuno. Prova le cose, fai le tue scoperte. Ricorda che l'utilizzo di ReLU stesso è uno sviluppo molto recente e per decenni tutti i diversi dottorandi del settore hanno utilizzato funzioni di attivazione troppo complicate di cui ora possiamo solo ridere. Troppo spesso "conoscere" troppo può ottenere risultati negativi. È importante capire che le reti neurali non sono una scienza esatta. Nulla in matematica dice che le reti neurali funzioneranno davvero bene come loro. È euristico. E quindi è molto malleabile.

FYI anche l'attivazione a valore assoluto ottiene buoni risultati su alcuni problemi, ad esempio problemi di tipo XOR. Diverse funzioni di attivazione sono più adatte a scopi diversi. Ho provato Cifar-10 con abs () e sembrava funzionare peggio. Tuttavia, non posso dire che "è una funzione di attivazione peggiore per il riconoscimento visivo", perché non sono sicuro, ad esempio, se la mia pre-inizializzazione fosse ottimale, ecc. Il fatto stesso che imparasse relativamente bene mi ha stupito.

Inoltre, nella vita reale, i "derivati" che passi al backprop non devono necessariamente corrispondere ai derivati ​​matematici effettivi.

Vorrei anche dire che dovremmo vietare di chiamarli "derivati" e iniziare a chiamarli qualcos'altro, ad esempio, error activation functionsnon chiudere le nostre menti alle possibilità di armeggiare con loro. In realtà è possibile, ad esempio, utilizzare l'attivazione ReLU, ma fornire 0,1 o qualcosa del genere invece di 0 come derivata per x <0. In un certo senso, hai quindi una semplice ReLU, ma con i neuroni che non sono in grado di "morire di adattabilità". Io lo chiamo NecroRelu, perché è una ReLU che non può morire. E in alcuni casi (sicuramente non nella maggior parte dei casi, però) funziona meglio del semplice LeakyReLU, che in realtà ha 0,1 derivate x x 0 e migliore del solito ReLU. Non penso che troppi altri abbiano studiato tale funzione, sebbene questa o qualcosa di simile possa in realtà essere una funzione di attivazione generalmente interessante che nessuno ha considerato solo perché è troppo concentrato sulla matematica.

Per quanto riguarda ciò che viene generalmente utilizzato, per la funzione di attivazione tanH (x) è normale passare 1 - x² invece di 1 - tanH (x) ² come derivato per calcolare le cose più velocemente.

Inoltre, tieni presente che ReLU non è poi così "ovviamente migliore" di, ad esempio, TanH. TanH può probabilmente essere migliore in alcuni casi. Solo, così sembra, non nel riconoscimento visivo. Tuttavia, ELU, ad esempio, ha un po 'di morbidezza sigmoidea ed è una delle funzioni di attivazione più conosciute per il riconoscimento visivo al momento. Non ci ho ancora provato, ma scommetto che uno può impostare diversi gruppi con diverse funzioni di attivazione sullo stesso livello di livello a un vantaggio. Perché, una diversa logica è meglio descritta con diverse funzioni di attivazione. E a volte probabilmente hai bisogno di diversi tipi di valutazione.

Si noti che è importante disporre di una inizializzazione che corrisponda al tipo di funzione di attivazione. Le ReLU che perdono hanno bisogno di altri init che le semplici ReLU, per esempio.

EDIT: In realtà, ReLU standard sembra meno incline a sovralimentare rispetto a quelli che perdono con le architetture moderne. Almeno nel riconoscimento delle immagini. Sembra che se stai cercando una rete ad altissima precisione con un carico enorme di parametri, potrebbe essere meglio attenersi a semplici opzioni ReLU vs perdite. Ma, naturalmente, prova tutto questo da solo. Forse, alcune cose che perdono funzioneranno meglio se viene data una maggiore regolarizzazione.


Sono interessato al tuo NecroReLU, ma non riesco a capire da cosa hai scritto come è diverso da LeakyReLU. Potresti chiarire?
Tom Hale,

Diverso in quanto l'attivazione è ReLU, ma il derivato è LReLU
Íhor Mé,

@ ÍhorMé, come hai menzionato initialization that corresponds to a type of activation function one is usingin a NOTEnel tuo post, potresti per favore fornire i tuoi suggerimenti per questo sulle stesse linee, non sono del tutto convinto che l'uso delle attivazioni ReLu su sigmoid / tanH sia una soluzione per il problema del gradiente che sta svanendo / esplodendo .
anu

16

Ecco una spiegazione euristica:

  • Ogni aggiornamento del gradiente nel backprop è costituito da una serie di fattori moltiplicati.
  • Più ci si avvicina all'avvio della rete, più questi fattori vengono moltiplicati insieme per ottenere l'aggiornamento del gradiente.
  • Molti di questi fattori sono derivati ​​della funzione di attivazione dei neuroni - il resto sono pesi, distorsioni, ecc.
  • Di questi fattori, quelli che contano intuitivamente sono i pesi, i preconcetti, ecc. I derivati ​​della funzione di attivazione sono più di una sorta di parametro di accordatura, progettati per far scendere la pendenza nella giusta direzione al giusto tipo di velocità.
  • Se moltiplichi un mucchio di termini che sono inferiori a 1, tenderanno a zero più termini avrai. Da qui il gradiente di sparizione man mano che ci si allontana dal livello di output se si hanno funzioni di attivazione con pendenza <1.
  • Se moltiplichi un mucchio di termini che sono maggiori di 1, tenderanno verso l'infinito più ne hai, quindi esplodi il gradiente man mano che ti allontani dal livello di output se hai funzioni di attivazione che hanno una pendenza> 1.
  • Che ne dite se potessimo, in qualche modo, magicamente, far sì che questi termini forniti dalla derivata delle funzioni di attivazione siano 1. Ciò significa intuitivamente che tutti i contributi agli aggiornamenti del gradiente provengono dall'input al problema e al modello: i pesi, input, pregiudizi - piuttosto che alcuni artefatti della funzione di attivazione scelta.
  • RELU ha un gradiente 1 quando output> 0 e zero altrimenti.
  • Quindi moltiplicare un gruppo di derivati ​​RELU insieme nelle equazioni di backprop ha la proprietà di essere 1 o zero - l'aggiornamento è nulla o prende interamente contributi dagli altri pesi e pregiudizi.

Si potrebbe pensare che sarebbe meglio avere una funzione lineare, piuttosto che appiattirsi quando x <0. L'idea qui è che RELU genera reti sparse con un numero relativamente piccolo di collegamenti utili, che ha più plausibilità biologica, quindi la perdita di un sacco di pesi è effettivamente utile. Inoltre, la simulazione di funzioni interessanti con reti neurali è possibile solo con una certa non linearità nella funzione di attivazione. Una funzione di attivazione lineare produce un output lineare, il che non è affatto interessante.


grande spiegazione, potresti approfondire di più sul sesto punto Inoltre, potresti per favore fornire i tuoi suggerimenti per questo sulle stesse linee, non sono del tutto convinto che l'uso delle attivazioni ReLu su sigmoid / tanH sia una soluzione per il problema del gradiente di fuga / esplosione.
anu

1
Anche l'inizializzazione del peso sensibile è importante; ma lo è anche la scelta della funzione di attivazione. A titolo di esempio banale, se tutti i tuoi pesi sono impostati su zero e usi RELU, allora tutti gli output dei tuoi neuroni saranno zero e resteranno zero ... Né RELU da sola né le tecniche di inizializzazione da sole risolvono completamente il gradiente di sparizione / esplosione, ma entrambi aiutano. Non sei sicuro di cosa intendi rielaborare al punto 6, cosa non è chiaro?
Tom Walker,

1

Consideriamo la relazione di ricorrenza principale che definisce la propagazione posteriore del segnale di errore.

WioBioiof

hioio

Sio=Wio(hio-1)+Bio

hio=f(Sio)

δio

δio=Wio+1(δio+1f'(Sio))

ff'(Sio)=(1-hio2)hio

f=Relu=mun'X(0,X)f'f'=numpy.where(hio>0,1,0)

Questa equazione mostra anche l'altro problema caratteristico dell'attivazione relu - neuroni morti: se un dato neurone fosse inizializzato in modo tale da non sparare per alcun input (la sua attivazione è zero), anche il suo gradiente sarebbe zero, e quindi non sarebbe mai attivato.

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.