¿Por qué las personas usan técnicas de programación cuadrática (como SMO) cuando se trata de SVM kernelized? ¿Qué hay de malo en el descenso de gradiente? ¿Es imposible de usar con los núcleos o es demasiado lento (y por qué?).
Aquí hay un poco más de contexto: tratando de entender un poco mejor los SVM, usé Gradient Descent para entrenar un clasificador lineal de SVM usando la siguiente función de costo:
Estoy usando las siguientes anotaciones:
- b es el peso de las características del modelo y es su parámetro de sesgo.
- es el vector de características de la instancia de entrenamiento .
- es la clase objetivo (-1 o 1) para la instancia .
- es el número de instancias de entrenamiento.
- es el hiperparámetro de regularización.
I derivado de un vector (sub) gradiente (con respecto a y ) de esta ecuación, y pendiente de descenso funcionaba bien.
Ahora me gustaría abordar problemas no lineales. ¿Puedo reemplazar todos los productos de punto con en la función de costo, donde es la función del núcleo (por ejemplo el RBF gaussiano, ), luego use el cálculo para obtener un vector (sub) gradiente y seguir con Gradient Descent?
Si es demasiado lento, ¿por qué es eso? ¿La función de costo no es convexa? ¿O es porque el gradiente cambia demasiado rápido (no es Lipschitz continuo) por lo que el algoritmo sigue saltando a través de los valles durante el descenso, por lo que converge muy lentamente? Pero incluso entonces, ¿cómo puede ser peor que la complejidad de tiempo de la programación cuadrática, que es ? Si se trata de mínimos locales, ¿no puede el GD estocástico con recocido simulado superarlos?
fuente
Si aplicamos una transformación a todos los vectores de peso de entrada ( ), obtenemos la siguiente función de costo:x ( i )ϕ X( i )
El truco del núcleo reemplaza por . Dado que el vector de peso es no transformado, el truco del núcleo no se puede aplicar a la función de coste superior .K ( u , v ) wϕ ( u )t⋅ ϕ ( v ) K( u , v ) w
La función de costo anterior corresponde a la forma primaria del objetivo SVM:
sujeto a y paraζ ( i ) ≥ 0 i = 1 , ⋯ , my( i )( wt⋅ ϕ ( x( i )) + b ) ≥ 1 - ζ( i )) ζ( i )≥ 0 i = 1 , ⋯ , m
La forma dual es:
sujeto a y para0≤ α i ≤Ci=1,2,⋯,myt⋅ α = 0 0 ≤ αyo≤ C i = 1 , 2 , ⋯ , m
donde es un vector lleno de 1s y es una matriz con elementos .Q m × m Q i j = y ( i ) y ( j ) ϕ ( x ( i ) ) t ⋅ ϕ ( x ( j ) )1 Q m × m Qyo j= y( i )y( j )ϕ ( x( i ))t⋅ ϕ ( x( j ))
Ahora podemos usar el truco del kernel calculando así:Qyo j
Por lo tanto, el truco del kernel solo se puede usar en la forma dual del problema SVM (además de algunos otros algoritmos como la regresión logística).
Ahora puede usar bibliotecas de programación cuadrática disponibles para resolver este problema, o usar multiplicadores lagrangianos para obtener una función sin restricciones (la función de doble costo), luego busque un mínimo usando Gradient Descent o cualquier otra técnica de optimización. Uno de los enfoques más eficientes parece ser el algoritmo SMO implementado por la
libsvm
biblioteca (para SVM kernelized).fuente
Podría estar equivocado, pero no veo cómo podemos reemplazar los productos de punto con núcleos sin convertirlo en el doble problema.
Los núcleos asignan la entrada implícitamente a algún espacio de características donde convierte en , la función de pérdida se convierte en Si se aplica el núcleo gaussiano, tendrá ifinite dimensiones, también lo hará .ϕ ( x ) J ( w , b ) = C m ∑ i = 1 m a x ( 0 , 1 - y ( i ) ( w t ⋅ ϕ ( x ( i ) ) + b ) )X ϕ ( x ) J( w , b ) = C∑i = 1metrom a x ( 0 , 1 - y( i )( wt⋅ ϕ ( x( i )) + b ) )+12wt⋅ w
ϕ ( x( i )) w
ϕ(x(i))w
Parece difícil optimizar un vector de dimensiones infinitas usando el descenso de gradiente directamente.
La respuesta de Actualización de Firebug ofrece una forma de reemplazar los productos de punto con granos en la formulación primaria.
fuente