Chiarimento sull'implementazione della Discendenza della regola di Perceptron rispetto alla discesa del gradiente rispetto alla discesa del gradiente stocastico


15

Ho sperimentato un po 'con diverse implementazioni di Perceptron e voglio assicurarmi di capire correttamente le "iterazioni".

La regola originale del percettrone di Rosenblatt

A quanto ho capito, nel classico algoritmo perceptron di Rosenblatt, i pesi vengono aggiornati simultaneamente dopo ogni esempio di allenamento tramite

Δw(t+1)=Δw(t)+η(targetactual)xi

dove è la regola di apprendimento qui. E il target e l'effettivo sono entrambi con soglia (-1 o 1). L'ho implementato come 1 iterazione = 1 passaggio sul campione di allenamento, ma il vettore del peso viene aggiornato dopo ogni campione di allenamento.eta

E calcolo il valore "effettivo" come

sign(wwTxx)=sign(w0+w1x1+...+wdxd)

Discesa gradiente stocastica

Δw(t+1)=Δw(t)+η(targetactual)xi

Uguale alla regola del percettrone, tuttavia, targete actualnon sono soglie ma valori reali. Inoltre, conto "iterazione" come percorso sul campione di addestramento.

Sia SGD che la classica regola perceptron convergono in questo caso linearmente separabile, tuttavia, ho problemi con l'implementazione della discesa del gradiente.

Discesa a gradiente

Qui, controllo il campione di allenamento e riassumo le variazioni di peso per 1 passaggio sul campione di allenamento e successivamente ho aggiornato i pesi, ad es.

per ogni campione di addestramento:

Δwnew+=Δw(t)+η(targetactual)xi

...

dopo 1 passaggio sul set di allenamento:

Δw+=Δwnew

Mi chiedo se questa ipotesi sia corretta o se mi manchi qualcosa. Ho provato vari tassi di apprendimento (fino a infinitamente piccoli), ma non sono mai riuscito a far sì che mostrasse alcun segno di convergenza. Quindi, mi chiedo se ho frainteso sth. Qui.

Grazie Sebastian

Risposte:


20

Hai un paio di errori nei tuoi aggiornamenti. Penso che generalmente confondi il valore dei pesi attuali con la differenza tra i pesi attuali e quelli precedenti. Hai simboli sparsi dove non ci dovrebbe essere alcuno, e + = dove dovresti avere =.Δ

perceptron:

,ww(t+1)=ww(t)+ηt(y(i)y^(i))xx(i)

dove y ( i )è la previsione del modello suy^(i)=sign(wwxx(i))sull'esempio di addestramento i t h .ith

Questo può essere visto come un metodo discendente stocastico discendente sulla seguente funzione "perdita percettron" *:

Perdita di Perceptron:

Lww(y(i))=max(0,y(i)wwxx(i))

.Lww(y(i))={0}, if y(i)wwxx(i)>0{y(i)xx(i)}, if y(i)wwxx(i)<0[1,0]×y(i)xx(i), if wwxx(i)=0

Poiché perceptron è già una forma di SGD, non sono sicuro del motivo per cui l'aggiornamento SGD dovrebbe essere diverso dall'aggiornamento perceptron. Il modo in cui hai scritto il passaggio SGD, con valori senza soglia, subisci una perdita se prevedi una risposta troppo corretta. Questo è male.

Il tuo gradiente batch è sbagliato perché stai usando "+ =" quando dovresti usare "=". I pesi correnti vengono aggiunti per ogni istanza di allenamento . In altre parole, il modo in cui l'hai scritto,

ww(t+1)=ww(t)+i=1n{ww(t)ηtLww(t)(y(i))}

Quello che dovrebbe essere è:

ww(t+1)=ww(t)ηti=1nLww(t)(y(i)) .

Inoltre, affinché l'algoritmo converga su tutti i set di dati, è necessario ridurre la frequenza di apprendimento su un programma, come ηt=η0t.


* L'algoritmo perceptron non è esattamente lo stesso di SSGD sulla perdita di perctron. Di solito in SSGD, in caso di pareggio (wwXX(io)=0), L=[-1,0]×y(io)XX(io), così 00L, quindi ti sarebbe permesso di non fare un passo. Di conseguenza, la perdita di percettrone può essere minimizzata aww=00, che è inutile. Ma nell'algoritmo perceptron , è necessario interrompere i legami e utilizzare la direzione del subgradient-y(io)XX(io)L se scegli la risposta sbagliata.

Quindi non sono esattamente gli stessi, ma se lavori partendo dal presupposto che l'algoritmo perceptron è SGD per qualche funzione di perdita, e decodifica la funzione di perdita, la perdita di perctron è ciò con cui finisci.


Thank you Sam, and I do apologize for my messy question. I don't know where the deltas come from, but the "+=" was the the thing that went wrong. I completely overlooked that part. Thanks for the thorough answer!
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.