Derivato del ruolo della funzione sigmoidea nelle reti neurali


18

Cerco di capire il ruolo della derivata della funzione sigmoidea nelle reti neurali. inserisci qui la descrizione dell'immagine

Per prima cosa ho tracciato la funzione sigmoide e la derivata di tutti i punti dalla definizione usando Python. Qual è esattamente il ruolo di questo derivato? inserisci qui la descrizione dell'immagine

import numpy as np
import matplotlib.pyplot as plt

def sigmoid(x):
    return 1 / (1 + np.exp(-x))

def derivative(x, step):
    return (sigmoid(x+step) - sigmoid(x)) / step

x = np.linspace(-10, 10, 1000)

y1 = sigmoid(x)
y2 = derivative(x, 0.0000000000001)

plt.plot(x, y1, label='sigmoid')
plt.plot(x, y2, label='derivative')
plt.legend(loc='upper left')
plt.show()

2
Se hai altre domande, non esitare a chiedere
JahKnows,

Risposte:


23

L'uso di derivati ​​nelle reti neurali è per il processo di addestramento chiamato backpropagation . Questa tecnica utilizza la discesa gradiente per trovare un set ottimale di parametri del modello al fine di minimizzare una funzione di perdita. Nel tuo esempio devi usare la derivata di un sigmoide perché è l'attivazione che usano i tuoi singoli neuroni.


La funzione di perdita

L'essenza dell'apprendimento automatico è l'ottimizzazione di una funzione di costo in modo tale che possiamo minimizzare o massimizzare alcune funzioni target. Questo è in genere chiamato la funzione di perdita o costo. In genere vogliamo ridurre al minimo questa funzione. La funzione di costo, , associa una certa penalità in base agli errori risultanti quando si passano i dati attraverso il modello in funzione dei parametri del modello.C

Diamo un'occhiata all'esempio in cui proviamo ad etichettare se un'immagine contiene un gatto o un cane. Se abbiamo un modello perfetto, possiamo dare una foto al modello e ci dirà se è un gatto o un cane. Tuttavia, nessun modello è perfetto e farà errori.

Quando formiamo il nostro modello per poter inferire il significato dai dati di input, vogliamo ridurre al minimo la quantità di errori che commette. Quindi usiamo un set di addestramento, questi dati contengono molte immagini di cani e gatti e abbiamo l'etichetta di verità di base associata a quell'immagine. Ogni volta che eseguiamo un'iterazione di addestramento del modello calcoliamo il costo (la quantità di errori) del modello. Vorremmo ridurre al minimo questo costo.

Esistono molte funzioni di costo ognuna con il proprio scopo. Una funzione di costo comune utilizzata è il costo quadratico definito come

.C=1Ni=0N(y^y)2

Questo è il quadrato della differenza tra l'etichetta prevista e l'etichetta di verità di base per le immagini cui ci siamo allenati. Vorremmo minimizzare questo in qualche modo.N

Ridurre al minimo una funzione di perdita

In effetti, la maggior parte dell'apprendimento automatico è semplicemente una famiglia di framework in grado di determinare una distribuzione minimizzando alcune funzioni di costo. La domanda che possiamo porre è "come possiamo minimizzare una funzione"?

Riduciamo al minimo la seguente funzione

.y=x24x+6

Se tracciamo questo, possiamo vedere che esiste un minimo in . Per fare questo analiticamente possiamo prendere la derivata di questa funzione comex=2

dydx=2x4=0

.x=2

Tuttavia, spesso non è possibile trovare analiticamente un minimo globale. Quindi invece utilizziamo alcune tecniche di ottimizzazione. Qui esistono anche molti modi diversi come: Newton-Raphson, ricerca della griglia, ecc. Tra questi c'è la discesa del gradiente . Questa è la tecnica utilizzata dalle reti neurali.

Discesa a gradiente

Usiamo un'analogia notoriamente usata per capirlo. Immagina un problema di minimizzazione 2D. Ciò equivale a fare un'escursione montuosa nel deserto. Vuoi tornare al villaggio che sai essere nel punto più basso. Anche se non conosci le direzioni cardinali del villaggio. Tutto quello che devi fare è continuare a scendere sempre più ripido e alla fine arriverai al villaggio. Quindi scenderemo lungo la superficie in base alla pendenza del pendio.

Assumiamo la nostra funzione

y=x24x+6

determineremo la per la quale y è ridotta a icona. L'algoritmo di discesa gradiente dice innanzitutto che sceglieremo un valore casuale per x . Inizializziamo su x = 8 . Quindi l'algoritmo farà iterativamente quanto segue fino a raggiungere la convergenza.xyxx=8

xnew=xoldνdydx

dove è il tasso di apprendimento, possiamo impostarlo su qualunque valore desideriamo. Tuttavia, esiste un modo intelligente per scegliere questo. Troppo grande e non raggiungeremo mai il nostro valore minimo, e troppo grande perderemo moltissimo tempo prima di arrivarci. È analogo alla dimensione dei gradini che si desidera percorrere per il ripido pendio. Piccoli passi e morirai sulla montagna, non scenderai mai. Troppo grande di un passo e rischi di sparare al villaggio e finire dall'altra parte della montagna. La derivata è il mezzo con cui percorriamo questa pendenza verso il nostro minimo.ν

dydx=2x4

ν=0.1

Iterazione 1:

x n e w = 6.8 - 0.1 ( 2 6.8 - 4 ) = 5.84 x n e w = 5.84 - 0.1 ( 2 5.84 - 4 ) = 5,07 x n e w = 5,07 - 0,1xnew=80.1(284)=6.8
xnew=6.80.1(26.84)=5.84
xnew=5.840.1(25.844)=5.07
x n e w = 4.45 - 0.1 ( 2 4.45 - 4 ) = 3.96 x n e w = 3.96 - 0.1 ( 2 3.96 - 4 ) = 3.57 x n e w = 3.57 - 0,1 ( 2 3,57 - 4 )xnew=5.070.1(25.074)=4.45
xnew=4.450.1(24.454)=3.96
xnew=3.960.1(23.964)=3.57
x n e w = 3.25 - 0.1 ( 2 3.25 - 4 ) = 3.00 x n e w = 3.00 - 0.1 ( 2 3.00 - 4 ) = 2.80 x n e w = 2.80 - 0.1 ( 2 2.80 - 4 ) = 2,64 x n e w =xnew=3.570.1(23.574)=3.25
xnew=3.250.1(23.254)=3.00
xnew=3.000.1(23.004)=2.80
xnew=2.800.1(22.804)=2.64
x n e w = 2.51 - 0.1 ( 2 2.51 - 4 ) = 2.41 x n e w = 2.41 - 0.1 ( 2 2.41 - 4 ) = 2.32 x n e w = 2,32 - 0,1 ( 2 2,32xnew=2.640.1(22.644)=2.51
xnew=2.510.1(22.514)=2.41
xnew=2.410.1(22.414)=2.32
x n e w = 2,26 - 0,1 ( 2 2,26 - 2 2,06 - 4 ) = 2,05 x n e w = 2,05 - 0,1 ( 2,02 x n e w =xnew=2.320.1(22.324)=2.26
x n e w = 2,21 - 0,1 ( 2 2,21 - 4 ) = 2,16 x n e w = 2,16 - 0,1 ( 2 2,16 - 4 ) = 2,13 x nxnew=2.260.1(22.264)=2.21
xnew=2.210.1(22.214)=2.16
xnew=2.160.1(22.164)=2.13
x n e w =2,10-0,1(2*2,10-4)=2,08 x n e w =2.08-0,1(2*2.08-4)=2.06 x n e w =2,06-0,1(xnew=2.130.1(22.134)=2.10
xnew=2.100.1(22.104)=2.08
xnew=2.080.1(22.084)=2.06
xnew=2.060.1(22.064)=2.05
x n e w = 2,04 - 0,1 ( 2 2,04 - 4 ) = 2,03 x n e w = 2,03 - 0,1 ( 2 2,03 - 4 ) =xnew=2.050.1(22.054)=2.04
xnew=2.040.1(22.044)=2.03
xnew=2.030.1(22.034)=2.02
- 0,1 ( 2 2,01 - 4 ) = 2,01 x n e w = 2,01 - 0,1xnew=2.020.1(22.024)=2.02
x n e w = 2,01 - 0,1 ( 2 2,01 - 4 ) = 2,01 x n e w = 2,01xnew=2.020.1(22.024)=2.01
xnew=2.010.1(22.014)=2.01
xnew=2.010.1(22.014)=2.01
x n e w = 2,00 - 0,1 ( 2 2,00 - 4 ) = 2,00 x n e w = 2,00 - 0,1 ( 2 2,00 -xnew=2.010.1(22.014)=2.00
xnew=2.000.1(22.004)=2.00
x n e w = 2,00 - 0,1 ( 2 2,00 - 4 ) = 2,00 x n e w = 2,00 - 0,1 ( 2 2,00 - 4 ) = 2,00xnew=2.000.1(22.004)=2.00
xnew=2.000.1(22.004)=2.00
xnew=2.000.1(22.004)=2.00

E vediamo che l'algoritmo converge in ! Abbiamo trovato il minimo.x=2


Applicato alle reti neurali

Le prime reti neurali aveva solo un singolo neurone che prese in alcuni input e quindi fornire un'uscita y . Una funzione comune utilizzata è la funzione sigmoidexy^

σ(z)=11+exp(z)

y^(wTx)=11+exp(wTx+b)

dove è il peso associato per ogni input x e abbiamo una propensione b . Vogliamo quindi ridurre al minimo la nostra funzione di costowxb

.C=12Ni=0N(y^y)2

Come addestrare la rete neurale?

Useremo discesa del gradiente di formare i pesi base all'output della funzione sigmoide ed useremo qualche funzione di costo e treno su lotti di dati di dimensione N .CN

C=12NiN(y^y)2

è la classe prevista ottenuto dalla funzione sigmoide edyè l'etichetta verità a terra. Useremo la discesa gradiente per ridurre al minimo la funzione di costo rispetto ai pesiw. Per semplificare la vita, divideremo la derivata come seguey^yw

.Cw=Cy^y^w

Cy^=y^y

e abbiamo che y = σ ( w T x ) e la derivata della funzione sigmoide è σ ( z )y^=σ(wTx)quindi abbiamo,σ(z)z=σ(z)(1σ(z))

y^w=11+exp(wTx+b)(111+exp(wTx+b))

Quindi possiamo quindi aggiornare i pesi tramite discesa gradiente come

wnew=woldηCw

η


2
per favore dimmi perché questo processo non è così ben descritto nei libri? Hai un blog? Quali materiali consigliate per l'apprendimento delle reti neurali? Ho dei dati di test e voglio addestrarli. Posso disegnare una funzione che minimizzerò? Vorrei visualizzare questo processo per capirlo meglio.
lukassz,

Puoi spiegare la backpropagation in questo modo semplice?
lukassz,

1
Risposta incredibile ... (+ 1)
Aditya

1
Backprop è anche simile a quello che JahKnows ha spiegato sopra ... È solo il gradiente che viene portato fino agli input direttamente dagli output .. Una rapida ricerca su Google lo chiarirà .. Lo stesso vale per tutte le altre funzioni di attivazione ..
Aditya,

1
Cw=(y^-y)*derivato di sigmoidey^-yy^y

2

XWX+bσ(WX+b)

y^y L(y,y^)=L(y,σ(WX+B))WB

WB

Uno dei motivi per cui la funzione sigmoide è popolare tra le reti neurali, è perché il suo derivato è facile da calcolare .


1

In parole semplici:

Il derivato mostra la capacità del neurone di apprendere su particolari input.

Ad esempio, se l'input è 0 o 1 o -2 , la derivata (la "capacità di apprendimento") è alta e la propagazione all'indietro migliorerà notevolmente i pesi dei neuroni per questo campione.

D'altra parte, se l'input è 20 , la derivata sarà molto vicina a 0 . Significa che la retro-propagazione su questo campione non "insegnerà" a questo neurone a produrre un risultato migliore.

Le cose sopra sono valide per un singolo campione.

Diamo un'occhiata al quadro più grande, per tutti i campioni nel set di allenamento. Qui abbiamo diverse situazioni:

  • Se la derivata è 0 per tutti i campioni nel tuo set di allenamento, il neurone produce sempre risultati errati , significa che il neurone è saturo (stupido) e non migliorerà.
  • Se il derivato è 0 per tutti i campioni nel tuo set di allenamento E il neurone produce sempre risultati corretti - significa che il neurone ha studiato davvero bene e già il più intelligente possibile (nota a margine: questo caso è buono ma può indicare un potenziale overfitting, che non va bene)

  • Se il derivato è 0 su alcuni campioni, diverso da 0 su altri campioni E il neurone produce risultati contrastanti - indica che questo neurone sta facendo un buon lavoro e potenzialmente può migliorare da un ulteriore allenamento (anche se non necessariamente poiché dipende da altri neuroni e dai dati di allenamento che avere)

Quindi, quando stai guardando il diagramma derivato, puoi vedere quanto il neurone si è preparato per apprendere e assorbire le nuove conoscenze, dato un input particolare.


0

Il derivato che vedi qui è importante nelle reti neurali. È il motivo per cui le persone generalmente preferiscono qualcos'altro come l'unità lineare rettificata .

Vedi il calo derivativo per le due estremità? Cosa succede se la tua rete si trova sul lato sinistro, ma deve spostarsi sul lato destro? Immagina di essere su -10.0 ma vuoi 10.0. Il gradiente sarà troppo piccolo per consentire alla tua rete di convergere rapidamente. Non vogliamo aspettare, vogliamo una convergenza più rapida. RLU non ha questo problema.

Chiamiamo questo problema " Saturazione della rete neurale ".

Si prega di consultare https://www.quora.com/What-is-special-about-rectifier-neural-units-used-in-NN-learning

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.