Cómo implementar SVM yo mismo

La antigua forma de implementar máquinas de vectores de soporte (SVM) era usar el algoritmo de optimización mínima secuencial (SMO), pero el enfoque moderno actual es lanzar SVM como optimización de la función de pérdida de bisagra regularizada utilizando algoritmos de optimización basados ​​en gradientes decentes. SMO también es fácil de implementar, pero si desea un SVM lineal rápidamente, este es el mejor enfoque.

Debe implementar el descenso de gradiente estocástico (SGD) porque esto realmente se puede usar con la regularización para entrenar SVM. De hecho, he hecho esto para un SVM lineal, pero también puedes extenderlo fácilmente a los métodos del núcleo.

Por lo tanto, la SVM puede verse como una minimización de la función de pérdida de bisagra dada por:

[matemáticas] f (W, b) = \ frac {1} {n} \ sum_ {i = 1} ^ {n} max (0,1-y_i (W ^ {T} X_i + b)) + \ frac {\ lambda} {2} \ | W \ | ^ 2 [/ math]

La solución a la función de pérdida de bisagra da como resultado un hiperplano de margen máximo que es solo un SVM, esta es una interpretación moderna y encaja muy bien con la mayoría de los algoritmos de aprendizaje automático.

Aquí estoy usando la regularización [math] L_2 [/ math] pero también puedes probar esto con la regularización [math] L_1 [/ math]. El término de error en realidad no es diferenciable, por lo tanto, hay dos formas de minimizar la función de pérdida.

  1. Utilice la función de pérdida de registro diferenciable en su lugar: [matemática] L (x) = log (1 + e ^ {- x}) [/ matemática]
  2. O usa los sub-gradientes

Prefiero los sub-gradientes, en cuyo caso tendrá la siguiente regla de actualización SGD.

[matemáticas] W \ longleftarrow W- \ gamma_ {t} \ begin {cases} {\ lambda} W, & \ text {if} {y_t} W ^ {T} {X_i} + b> 1 \\ \ lambda { W} – {y_i} X_i, & \ text {de lo contrario} \ end {cases} [/ math]

Esto es realmente muy fácil, pero necesitarás jugar con [math] \ lambda [/ math] el factor de regularización para que esto funcione bien. También debe establecer la velocidad de aprendizaje [matemática] \ gamma_t [/ matemática], ya sea un valor constante [matemática] \ aprox [/ matemática] 0.02 o uno en decadencia con impulso. La elección es suya, puede hacer esto tan complejo como te gusta dependiendo de qué tan estable sea la optimización.

También puede regularizar el sesgo agregándolo al vector [math] W [/ math]. Luego deberá agregar una entrada correspondiente a todos los vectores de entrada, las X, con un valor de 1.

Entonces las ecuaciones se vuelven.

[matemáticas] f (W) = \ frac {1} {n} \ sum_ {i = 1} ^ {n} max (0,1-y_i (W ^ {T} X_i)) + \ frac {\ lambda} {2} \ | W \ | ^ 2 [/ matemáticas]

Y la regla de actualización SGD se convierte en

[matemáticas] W \ longleftarrow W- \ gamma_ {t} \ begin {cases} {\ lambda} W, & \ text {if} {y_t} W ^ {T} {X_i}> 1 \\ \ lambda {W} – {y_i} X_i, & \ text {de lo contrario} \ end {cases} [/ math]

Espero que esto ayude.

En realidad tienes dos preguntas. 1) ¿Cómo implemento SVM? y 2) ¿Qué es una función de costo, hipótesis, etc.? Son muy diferentes

Pregunta 1.

Eche un vistazo a Bernhard Scholkopf y Alex J. Smola (2002) “Aprendizaje con núcleos: máquinas de vectores de soporte, regularización, optimización y más” en la página 310.

Explican el código SMO (optimización mínima secuencial), que es un algoritmo eficiente y escalable para resolver el problema de optimización SVM, y presentan el pseudocódigo.

Otra fuente es Platt (1998) “Optimización mínima secuencial: un algoritmo rápido para máquinas de vectores de soporte de entrenamiento”.

Pregunta 2.

Eche un vistazo a Bernhard Scholkopf y Alex J. Smola (2002) “Aprender con núcleos: máquinas de vectores de soporte, regularización, optimización y más allá”. Aquí puede encontrar una explicación de lo que es una función de costo, hipótesis, etc.

La forma más sencilla de encontrar los parámetros óptimos es usar el descenso de gradiente en la formulación primaria con pérdida de bisagra. Otra solución más eficiente y fácil de implementar es usar SMO en formulación dual. Chomba Bupe explicó el descenso del gradiente muy bien.

La solución que usa los métodos anteriores se explica muy bien en el siguiente video:

Intente implementar la optimización mínima secuencial para resolver el problema dual de SVM. Es bastante simple de entender e implementar.