Aclaración sobre la implementación de la regla de Perceptron vs. el descenso del gradiente vs. el descenso del gradiente estocástico

15

Experimenté un poco con diferentes implementaciones de Perceptron y quiero asegurarme de entender las "iteraciones" correctamente.

La regla original del perceptrón de Rosenblatt

Según tengo entendido, en el clásico algoritmo perceptrón de Rosenblatt, los pesos se actualizan simultáneamente después de cada ejemplo de entrenamiento a través de

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

donde eta es la regla de aprendizaje aquí. Y el objetivo y el real están ambos trillados (-1 o 1). Lo implementé como 1 iteración = 1 pasada sobre la muestra de entrenamiento, pero el vector de peso se actualiza después de cada muestra de entrenamiento.

Y calculo el valor "real" como

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

Descenso de gradiente estocástico

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

Sin embargo, es igual a la regla del perceptrón targety actualno son valores trillados sino reales. Además, cuento la "iteración" como ruta sobre la muestra de entrenamiento.

Tanto SGD como la regla clásica de perceptrón convergen en este caso linealmente separable, sin embargo, estoy teniendo problemas con la implementación de descenso de gradiente.

Descenso de gradiente

Aquí, reviso la muestra de entrenamiento y sumo los cambios de peso para 1 pasada sobre la muestra de entrenamiento y actualizo los pesos a partir de entonces, por ejemplo,

para cada muestra de entrenamiento:

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

...

después de 1 pase sobre el conjunto de entrenamiento:

Δw+=Δwnew

Me pregunto si esta suposición es correcta o si me falta algo. Intenté varias tasas de aprendizaje (hasta infinitamente pequeñas) pero nunca pude lograr que mostrara ningún signo de convergencia. Entonces, me pregunto si entendí mal algo. aquí.

Gracias Sebastián


fuente

Respuestas:

20

Δ

Perceptrón:

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

donde y ( i )es la predicción del modelo en ely^(i)=sign(wwxx(i))ith

Esto puede verse como un método estocástico de descenso de subgradiente en la siguiente función de "pérdida de perceptrón" *:

Pérdida de perceptrón:

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.

Dado que perceptron ya es una forma de SGD, no estoy seguro de por qué la actualización de SGD debería ser diferente de la actualización de perceptron. La forma en que ha escrito el paso SGD, con valores no restringidos, sufre una pérdida si predice una respuesta demasiado correctamente. Eso es malo.

El paso de gradiente de lote es incorrecto porque está usando "+ =" cuando debería estar usando "=". Los pesos actuales se agregan para cada instancia de entrenamiento . En otras palabras, la forma en que lo has escrito,

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

What it should be is:

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

Also, in order for the algorithm to converge on every and any data set, you should decrease your learning rate on a schedule, like ηt=η0t.


* The perceptron algorithm is not exactly the same as SSGD on the perceptron loss. Usually in SSGD, in the case of a tie (wwxx(i)=0), L=[1,0]×y(i)xx(i), so 00L, so you would be allowed to not take a step. Accordingly, perceptron loss can be minimized at ww=00, which is useless. But in the perceptron algorithm, you are required to break ties, and use the subgradient direction y(i)xx(i)L if you choose the wrong answer.

So they're not exactly the same, but if you work from the assumption that the perceptron algorithm is SGD for some loss function, and reverse engineer the loss function, perceptron loss is what you end up with.

Sam Thomson
fuente
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!