sfumatura di fuga e zero gradiente
V'è un problema ben noto vanishing gradienta BackPropagationformazione di Feedforward Neural Network (FNN)(qui non consideriamo il gradiente di fuga di Recurrent Neural Network).
Non capisco perché il gradiente di fuga non significhi il gradiente zero ovvero la soluzione ottimale che vogliamo? Ho visto una risposta che diceva che il gradiente di fuga non è esattamente il gradiente zero, significa solo che l'aggiornamento del parametro è molto lento. Tuttavia, nel gradiente decente, non vogliamo ottenere il gradiente zero esatto e ci fermeremo quando il parametro non cambia all'interno$\epsilon,$ che è lo stesso caso del gradiente di fuga.
Quindi qualcuno può darmi una risposta chiara?
Risposte
Un gradiente relativamente basso non significa sempre che abbiamo raggiunto un punto critico
Avere un valore basso in una componente del gradiente non significa necessariamente che siamo vicini a un punto critico per quel parametro. Significa che la funzione cambierà poco se effettuiamo un aggiornamento basato esclusivamente su quel componente gradiente.
Ad esempio, pensa alla funzione $f(w_1,w_2) = 0.001w_1^2 + w_2^2\rightarrow$ per un punto con coordinate simili avremo una componente gradiente $1000$ volte più grande nel $w_2$ direzione rispetto a $w_1$ direzione.
Quindi in quella funzione (che possiamo interpretare come la nostra funzione di costo) se inizializziamo i nostri parametri su un valore simile questo porterà a un miglioramento molto più lento nel $w_1$ direzione come possiamo vedere nel prossimo grafico di contorno per un tasso di apprendimento di $0.5$:
Come possiamo vedere, anche essendo lontani dal minimo a $(0, 0)^T$, i miglioramenti su $w_1$ sono molto piccoli, quindi abbiamo bisogno di molte iterazioni per raggiungere il minimo $w_1$. E ha raggiunto il minimo dopo$1000$iterazioni! Quindi, se avessimo inizializzato l'algoritmo con un punto più lontano, non avrebbe raggiunto il minimo.
Quindi ora comprendiamo che anche se abbiamo un valore basso del gradiente, i nostri parametri non devono necessariamente essere vicini al valore che raggiunge il minimo (o un punto critico in generale) della funzione di costo. Al contrario, potrebbero vedere il loro processo di apprendimento notevolmente rallentato .
In pratica possiamo evitare questo comportamento indesiderato utilizzando alcune modifiche al metodo di discesa del gradiente. Ad esempio, vedere Adagrad . Con questo metodo, i componenti del gradiente vengono normalizzati in base ai valori attuali e precedenti dell'intensità del gradiente in ciascuna direzione. In tal modo abbiamo un tasso di apprendimento specifico per ogni dimensione.
Ragionare con backpropagation utilizzando un semplice NN
Per capire perché queste componenti di gradiente più piccole possono verificarsi anche nelle reti neurali, possiamo utilizzare un semplice NN costituito da un solo neurone per strato, proprio come il successivo:
Come sappiamo, l'elemento del gradiente dato dalla derivata della funzione di costo, $C$, rispetto a un peso $w^l$ dello strato $l$, in un NN completamente connesso è dato dal termine a sinistra: $$\frac{\partial C}{\partial w^l}= \delta^l (a^{l-1})^T \,\,\,\,\,\,\,\,\xrightarrow[]{\text{in our simple NN}}\,\,\,\,\,\,\,\, \frac{\partial C}{\partial w^l}=\delta^l a^{l-1}$$
Dove $\delta^l$ è il termine "errore" ($\partial C/\partial z^l$), e $a^{l-1}$ rappresenta il vettore di attivazioni dei neuroni dallo strato precedente ($l-1$). Si noti che nel semplice NN presentato sopra non è necessario trasporre$a^{l-1}$ poiché è uno scalare (un neurone per strato $\rightarrow$ un'attivazione per livello).
Tipicamente, siamo in grado di calcolare facilmente il termine "errore" dell'ultimo strato ($\delta^L$), ma non sappiamo come calcolarlo per i livelli precedenti, quindi utilizziamo backpropagation :
$$\delta^l = \left((w^{l+1})^T\,\,\delta^{l+1}\right)\odot g(z^l) \,\,\,\,\,\,\,\,\xrightarrow[]{\text{in our simple NN}}\,\,\,\,\,\,\,\, \delta^l=w^{l+1} \,g(z^l) \,\,\delta^{l+1} $$
Dove $g(z^l)$ rappresenta la funzione di attivazione del neurone dato il termine $z^l$.
Quindi, per qualsiasi livello $l$, com'è il termine $\partial C/ \partial w^l$calcolato ?. Usando il ragionamento precedente per il semplice NN, ora sappiamo che:
$$ \begin{align} \delta^{l} &= w^{l+1} \,g(z^{l}) \,\,\color{blue}{\delta^{l+1}}\\ \\ & = w^{l+1} \,g(z^{l}) \,\,\color{blue}{w^{l+2} \,g(z^{l+1}) \,\,\delta^{l+2}}\\ \\ &= w^{l+1}\color{blue}{w^{l+2}...w^{L}}\,\,g(z^{l})\color{blue}{g(z^{l+1})...g(z^{L})\,\,\delta^L} \end{align} $$ Dove i termini blu sono equivalenti $\delta^{l+1}$.
Come abbiamo visto prima, questo termine $\delta^l$ moltiplicato per l'attivazione del neurone dallo strato precedente $a^{l-1}$, ci dà il nostro desiderato $\partial C/\partial w^l$:
$$ \frac{\partial C}{\partial w^l} = \delta^{l}a^{l-1} = w^{l+1}\color{blue}{w^{l+2}...w^{L}}\,\,g(z^{l})\color{blue}{g(z^{l+1})...g(z^{L})\,\,\delta^L} \,\,a^{l-1}$$
Quindi ora possiamo vedere chiaramente che gli aggiornamenti vengono effettuati su un peso $w^l$ dipendono direttamente dai valori di tutti i pesi e dalle attivazioni dei layer successivi.
Ciò significa che, per qualsiasi valore di$w^l$ (potrebbe essere molto lontano dall'ottimo come nella situazione tracciata all'inizio), la sua componente del gradiente può tendere a zero se uno qualsiasi dei pesi o delle attivazioni, $g(z)$(o una combinazione di essi) degli strati successivi tendono a zero. Questo effetto indesiderato, come hai detto nella domanda, è noto come gradiente di fuga .
Ora capiamo che anche se un peso presenta un valore di $\partial C/\partial w^l$vicino a zero questo non significa che abbiamo raggiunto un punto critico per quel peso. Inoltre, l'apprendimento di questi parametri rallenterà notevolmente perché i loro aggiornamenti sono proporzionali alla rispettiva componente del gradiente. Quindi potrebbero rimanere bloccati in un valore lontano dal minimo!
Si noti infine che questo effetto indesiderato può diventare più importante con l'aumentare del numero di strati successivi.