Por que as pessoas usam técnicas de programação quadrática (como SMO) ao lidar com SVMs kernelizados? O que há de errado com a descida do gradiente? É impossível usar com kernels ou é muito lento (e por quê?).
Aqui está um pouco mais de contexto: tentando entender um pouco melhor os SVMs, usei o Gradient Descent para treinar um classificador SVM linear usando a seguinte função de custo:
Estou usando as seguintes notações:
- é o peso do recurso do modelo é seu parâmetro de viés.
- é o vector recurso da instância de treinamento.
- é a classe de destino (-1 ou 1) para a instância.
- é o número de instâncias de treinamento.
- é o hiperparâmetro de regularização.
I derivado de um vector de (sub) gradiente (no que diz respeito a e ) a partir desta equação, e Gradiente Descida funcionou muito bem.
Se é muito lento, por que isso? A função de custo não é convexa? Ou é porque o gradiente muda muito rápido (não é contínuo em Lipschitz) para que o algoritmo continue pulando através dos vales durante a descida e converja muito lentamente? Mas mesmo assim, como pode ser pior que a complexidade de tempo da programação quadrática, que é ? Se é uma questão de mínimos locais, a GD Estocástica com recozimento simulado não pode superá-los?
fonte
Se aplicarmos uma transformação a todos os vetores de peso de entrada ( x ( i ) ), obteremos a seguinte função de custo:ϕ x(i)
Os substitui truque do kernel por K ( u , v ) . Como o vetor de peso w não é transformado, o truque do kernel não pode ser aplicado à função de custo acima .ϕ(u)t⋅ϕ(v) K(u,v) w
A função de custo acima corresponde à forma primária do objetivo SVM:
sujeito a e ζ ( i ) ≥ 0 para i = 1 , ⋯ , my(i)(wt⋅ϕ(x(i))+b)≥1−ζ(i)) ζ(i)≥0 i=1,⋯,m
A forma dupla é:
sujeito a e 0 ≤ α i ≤ C para i = 1 , 2 , ⋯ , myt⋅α=0 0≤αi≤C i=1,2,⋯,m
onde é um vector completo de 1s e Q é um m × m matriz com elementos Q i j = y ( i ) y ( j ) φ ( x ( i ) ) t ⋅ φ ( x ( j ) ) .1 Q m×m Qij=y(i)y(j)ϕ(x(i))t⋅ϕ(x(j))
Agora podemos usar o truque do kernel calculando assim:Qij
Portanto, o truque do kernel pode ser usado apenas na forma dupla do problema SVM (além de outros algoritmos, como a regressão logística).
Agora você pode usar as bibliotecas de programação quadrática prontas para resolver esse problema ou usar multiplicadores Lagrangianos para obter uma função irrestrita (a função de custo duplo) e, em seguida, procurar um mínimo usando a Descida de gradiente ou qualquer outra técnica de otimização. Uma das abordagens mais eficientes parece ser o algoritmo SMO implementado pela
libsvm
biblioteca (para SVM kernelizado).fonte
Posso estar errado, mas não vejo como podemos substituir os produtos por kernels sem transformá-lo no problema duplo.
Parece difícil otimizar um vetor de dimensões infinitas usando a descida gradiente diretamente.
Atualizar
A resposta do Firebug fornece uma maneira de substituir os produtos de ponto por kernels na formulação primária.
fonte