Inizierò a fare un elenco qui di quelli che ho imparato finora. Come ha detto @marcodena, i pro ei contro sono più difficili perché è soprattutto solo l'euristica imparata dal provare queste cose, ma immagino che almeno avere un elenco di ciò che sono non può far male.
Innanzitutto, definirò esplicitamente la notazione in modo che non ci sia confusione:
Notazione
Questa notazione è tratta dal libro di Neilsen .
Una rete neurale Feedforward è composta da molti strati di neuroni collegati tra loro. Accetta un input, quindi quell'ingresso "gocciola" attraverso la rete e la rete neurale restituisce un vettore di output.
Più formalmente, chiama l'attivazione ( come output) del neurone nello strato , dove è l' elemento nel vettore di input. j t h i t h a 1 j j t haijjthitha1jjth
Quindi possiamo mettere in relazione l'input del livello successivo con quello precedente tramite la seguente relazione:
aij=σ(∑k(wijk⋅ai−1k)+bij)
dove
- σ è la funzione di attivazione,
- k t h ( i - 1 ) t h j t h i t hwijk è il peso dal neurone nello strato al neurone nello strato ,kth(i−1)thjthith
- j t h i t hbij è il pregiudizio del neurone nello strato ejthith
- j t h i t haij rappresenta il valore di attivazione del neurone nel livello .jthith
A volte scriviamo per rappresentare , in altre parole, il valore di attivazione di un neurone prima di applicare la funzione di attivazione . ∑ k ( w i j k ⋅ a i - 1 k ) + b i jzij∑k(wijk⋅ai−1k)+bij
Per una notazione più concisa possiamo scrivere
ai=σ(wi×ai−1+bi)
Per utilizzare questa formula per calcolare l'output di una rete feedforward per alcuni input , imposta , quindi calcola , dove è il numero di strati.a 1 = I a 2 , a 3 , … , a m mI∈Rna1=Ia2,a3,…,amm
Funzioni di attivazione
(di seguito, scriveremo invece di per leggibilità)e xexp(x)ex
Identità
Conosciuta anche come funzione di attivazione lineare.
aij=σ(zij)=zij
Passo
aij=σ(zij)={01if zij<0if zij>0
Lineare a tratti
Scegli alcuni e , che è il nostro "intervallo". Tutto ciò che è inferiore a questo intervallo sarà 0 e tutto quanto maggiore di questo intervallo sarà 1. Qualsiasi altra cosa viene linearmente interpolata tra. formalmente:xminxmax
aij=σ(zij)=⎧⎩⎨⎪⎪⎪⎪0mzij+b1if zij<xminif xmin≤zij≤xmaxif zij>xmax
Dove
m=1xmax−xmin
e
b=−mxmin=1−mxmax
sigmoid
aij=σ(zij)=11+exp(−zij)
Log-log complementare
aij=σ(zij)=1−exp(−exp(zij))
Bipolare
aij=σ(zij)={−1 1if zij<0if zij>0
Sigmoide bipolare
aij=σ(zij)=1−exp(−zij)1+exp(−zij)
tanh
aij=σ(zij)=tanh(zij)
LeCun's Tanh
Vedi Backprop efficiente .
aij=σ(zij)=1.7159tanh(23zij)
Scaled:
Tanh duro
aij=σ(zij)=max(−1,min(1,zij))
Assoluto
aij=σ(zij)=∣zij∣
Rectifier
Conosciuta anche come Unità lineare rettificata (ReLU), Max o Funzione rampa .
aij=σ(zij)=max(0,zij)
Modifiche di ReLU
Queste sono alcune funzioni di attivazione con cui ho giocato che sembrano avere ottime prestazioni per MNIST per ragioni misteriose.
aij=σ(zij)=max(0,zij)+cos(zij)
Scaled:
aij=σ(zij)=max(0,zij)+sin(zij)
Scaled:
Raddrizzatore liscio
Conosciuto anche come unità lineare rettificata liscia, Smooth max o Soft plus
aij=σ(zij)=log(1+exp(zij))
logit
aij=σ(zij)=log(zij(1−zij))
Scaled:
probit
aij=σ(zij)=2–√erf−1(2zij−1)
.
Dove è la funzione di errore . Non può essere descritto tramite funzioni elementari, ma puoi trovare il modo di approssimare il contrario su quella pagina di Wikipedia e qui .erf
In alternativa, può essere espresso come
aij=σ(zij)=ϕ(zij)
.
Dove è la funzione di distribuzione cumulativa (CDF). Vedi qui per i mezzi per approssimare questo.ϕ
Scaled:
Coseno
Vedi lavelli da cucina casuali .
aij=σ(zij)=cos(zij)
.
SoftMax
Conosciuto anche come esponenziale normalizzato.
aij=exp(zij)∑kexp(zik)
Questo è un po 'strano perché l'output di un singolo neurone dipende dagli altri neuroni in quello strato. Inoltre, diventa difficile da calcolare, poiché può essere un valore molto alto, nel qual caso probabilmente traboverà. Allo stesso modo, se è un valore molto basso, underflow e diventerà .zijexp(zij)zij0
Per combattere questo, calcoleremo invece . Questo ci dà:log(aij)
log(aij)=log⎛⎝⎜exp(zij)∑kexp(zik)⎞⎠⎟
log(aij)=zij−log(∑kexp(zik))
Qui dobbiamo usare il trucco log-sum-exp :
Diciamo che stiamo elaborando:
log(e2+e9+e11+e−7+e−2+e5)
Per prima cosa classificheremo i nostri esponenziali per grandezza:
log(e11+e9+e5+e2+e−2+e−7)
Quindi, poiché è il nostro massimo, moltiplichiamo per :e11e−11e−11
log(e−11e−11(e11+e9+e5+e2+e−2+e−7))
log(1e−11(e0+e−2+e−6+e−9+e−13+e−18))
log(e11(e0+e−2+e−6+e−9+e−13+e−18))
log(e11)+log(e0+e−2+e−6+e−9+e−13+e−18)
11+log(e0+e−2+e−6+e−9+e−13+e−18)
Possiamo quindi calcolare l'espressione sulla destra e prenderne il registro. Va bene farlo perché quella somma è molto piccola rispetto a , quindi qualsiasi underflow su 0 non sarebbe stato abbastanza significativo da fare comunque la differenza. Il overflow non può verificarsi nell'espressione a destra perché ci viene garantito che dopo aver moltiplicato per , tutti i poteri saranno .log(e11)e−11≤0
Formalmente, chiamiamo . Poi:m=max(zi1,zi2,zi3,...)
log(∑kexp(zik))=m+log(∑kexp(zik−m))
La nostra funzione softmax diventa quindi:
aij=exp(log(aij))=exp(zij−m−log(∑kexp(zik−m)))
Anche come sidenote, la derivata della funzione softmax è:
dσ(zij)dzij=σ′(zij)=σ(zij)(1−σ(zij))
Massimizzare
Anche questo è un po 'complicato. Fondamentalmente l'idea è che suddividiamo ogni neurone nel nostro strato massimo in molti sub-neuroni, ognuno dei quali ha i propri pesi e pregiudizi. Quindi l'input di un neurone va a ciascuno dei suoi sub-neuroni invece, e ogni sub-neurone emette semplicemente le loro (senza applicare alcuna funzione di attivazione). L' di quel neurone è quindi il massimo di tutte le uscite del suo sub-neurone.zaij
Formalmente, in un singolo neurone, diciamo che abbiamo sub-neuroni. Poin
aij=maxk∈[1,n]sijk
dove
sijk=ai−1∙wijk+bijk
( è il prodotto punto )∙
Per aiutarci a pensare a questo, considera la matrice di peso per lo strato di una rete neurale che sta usando, diciamo, una funzione di attivazione sigmoidea. è una matrice 2D, in cui ogni colonna è un vettore per il neurone contenente un peso per ogni neurone nel livello precedente .WiithWiWijji−1
Se avremo sub-neuroni, avremo bisogno di una matrice di peso 2D per ogni neurone, poiché ogni sub-neurone avrà bisogno di un vettore contenente un peso per ogni neurone nel livello precedente. Ciò significa che è ora una matrice di peso 3D, dove ogni è la matrice di peso 2D per un singolo neurone . E poi è un vettore per il sub-neurone nel neurone che contiene un peso per ogni neurone nel livello precedente .WiWijjWijkkji−1
Allo stesso modo, in una rete neurale che sta di nuovo usando, diciamo, una funzione di attivazione sigmoidea, è un vettore con un bias per ogni neurone nello strato .bibijji
Per fare questo con i sub-neuroni, abbiamo bisogno di una matrice di bias 2D per ogni livello , dove è il vettore con un bias per ogni subneuron nel neurone.biibijbijkkjth
Avere una matrice di peso e un vettore di polarizzazione per ciascun neurone rende quindi molto chiare le espressioni di cui sopra, sta semplicemente applicando i pesi di ciascun sub-neurone alle uscite da strato , quindi applicando i loro pregiudizi e prendendone il massimo.wijbijwijkai−1i−1bijk
Reti di funzioni a base radiale
Le reti di funzioni a base radiale sono una modifica delle reti neurali Feedforward, dove invece di utilizzare
aij=σ(∑k(wijk⋅ai−1k)+bij)
abbiamo un peso per nodo nel livello precedente (come normale) e anche un vettore medio e un vettore di deviazione standard per ogni nodo in il livello precedente.wijkkμijkσijk
Quindi chiamiamo la nostra funzione di attivazione per evitare di confonderla con i vettori di deviazione standard . Ora per calcolare dobbiamo prima calcolare uno per ciascun nodo nel livello precedente. Un'opzione è usare la distanza euclidea:ρσijkaijzijk
zijk=∥(ai−1−μijk∥−−−−−−−−−−−√=∑ℓ(ai−1ℓ−μijkℓ)2−−−−−−−−−−−−−√
Dove è l' elemento di . Questo non usa . In alternativa c'è la distanza di Mahalanobis, che presumibilmente funziona meglio:μijkℓℓthμijkσijk
zijk=(ai−1−μijk)TΣijk(ai−1−μijk)−−−−−−−−−−−−−−−−−−−−−−√
dove è la matrice di covarianza , definita come:Σijk
Σijk=diag(σijk)
In altre parole, è la matrice diagonale con in quanto elementi diagonali. Definiamo qui e come vettori di colonna perché questa è la notazione che viene normalmente utilizzata.Σijkσijkai−1μijk
Questi stanno davvero solo dicendo che la distanza di Mahalanobis è definita come
zijk=∑ℓ(ai−1ℓ−μijkℓ)2σijkℓ−−−−−−−−−−−−−−⎷
Dove è l' elemento di . Nota che deve essere sempre positivo, ma questo è un requisito tipico per la deviazione standard, quindi non è così sorprendente.σijkℓℓthσijkσijkℓ
Se lo si desidera, la distanza di Mahalanobis è abbastanza generale da poter definire la matrice di covarianza come altre matrici. Ad esempio, se la matrice di covarianza è la matrice dell'identità, la nostra distanza di Mahalanobis si riduce alla distanza euclidea. è piuttosto comune, ed è noto come distanza euclidea normalizzata .ΣijkΣijk=diag(σijk)
Ad ogni modo, una volta scelta la nostra funzione di distanza, possiamo calcolare viaaij
aij=∑kwijkρ(zijk)
In queste reti scelgono di moltiplicarsi per pesi dopo aver applicato la funzione di attivazione per motivi.
Descrive come creare una rete con funzione di base radiale multistrato, tuttavia, di solito esiste solo uno di questi neuroni e il suo output è l'output della rete. È disegnato come neuroni multipli perché ogni vettore medio e ogni vettore di deviazione standard di quel singolo neurone è considerato un "neurone" e quindi dopo tutti questi output c'è un altro livello che prende la somma di quei valori calcolati moltiplicata per i pesi, proprio come sopra. Dividerlo in due strati con un vettore di "somma" alla fine mi sembra strano, ma è quello che fanno.μijkσijkaij
Vedi anche qui .
Funzione di base radiale Funzioni di attivazione della rete
gaussiana
ρ(zijk)=exp(−12(zijk)2)
Multiquadratic
Scegli un punto . Quindi calcoliamo la distanza da a :(x,y)(zij,0)(x,y)
ρ(zijk)=(zijk−x)2+y2−−−−−−−−−−−−√
Questo è da Wikipedia . Non è limitato e può avere un valore positivo, anche se mi chiedo se c'è un modo per normalizzarlo.
Quando , questo è equivalente a assoluto (con uno spostamento orizzontale ).y=0x
Multiquadratico inverso
Come quadratico, tranne che capovolto:
ρ(zijk)=1(zijk−x)2+y2−−−−−−−−−−−−√
* Grafica dai grafici di intmath usando SVG .