Ir al contenido

El truco del kernel

En simple: lee esto primero

Si los datos no se pueden separar con una recta, los «levantamos» a más dimensiones donde sí se puede; el truco del kernel hace eso sin calcularlo de verdad.

Imagínalo así

Tienes monedas rojas en el centro de una mesa y azules alrededor: ninguna recta las separa. Pero si das un golpe y las rojas saltan, en el aire (3D) una hoja plana las separa. El kernel calcula «cómo se verían en el aire» sin hacerlas saltar.

Lo que tienes que llevarte
  • Un mapa de features transforma cada punto en uno con más coordenadas (x → x, x², …).
  • Un kernel es un atajo: da directamente la similitud entre dos puntos en ese espacio grande, sin construirlo.
  • Funciona porque SVM (en su forma dual) solo necesita similitudes entre pares de puntos.
Palabras raras de esta página
kernel
una función que mide qué tan parecidos son dos puntos (en un espacio «escondido»).
mapa de features (φ)
la transformación que agrega dimensiones.
matriz de Gram
la tabla con la similitud de cada par de puntos.
semidefinida positiva
condición técnica para que una función sea un kernel válido (que se porte como una similitud «honesta»).

Más abajo viene la versión completa, con fórmulas. Si una palabra aparece subrayada con puntos, pasa el mouse (o tócala) para ver qué significa.

Tanto el entrenamiento como la predicción del SVM tocan los datos solo a través de productos internos:

W(α)=∑iαi−12∑i,jαiαjyiyjxi⊤xj⏟producto interno,f(x)=∑iαiyixi⊤x⏟producto interno+bW(\boldsymbol\alpha) = \sum_i\alpha_i-\frac12\sum_{i,j}\alpha_i\alpha_jy_iy_j\underbrace{\mathbf{x}_i^\top\mathbf{x}_j}_{\text{producto interno}},\qquad f(\mathbf{x}) = \sum_i\alpha_iy_i\underbrace{\mathbf{x}_i^\top\mathbf{x}}_{\text{producto interno}}+b

Ninguna coordenada cruda aparece sola. Si pudiéramos calcular productos internos en un espacio más rico sin visitarlo, el SVM trazaría una frontera ahí, y esa frontera, vista desde casa, sería curva. Ese es todo el plan.

Dos anillos concéntricos: está demostrado que ninguna recta los separa. Aplica ϕ(x)=(x12, 2 x1x2, x22)\phi(\mathbf{x}) = (x_1^2,\ \sqrt2\,x_1x_2,\ x_2^2) a cada punto (o, en la versión de la sesión 07, ϕ(x)=(x1,x2,x12+x22)\phi(\mathbf{x}) = (x_1, x_2, x_1^2+x_2^2)): un plano los separa limpiamente. Traducido de vuelta, el plano ϕ1+ϕ3=2\phi_1+\phi_3 = 2 es x12+x22=2x_1^2+x_2^2=2: un círculo de radio 2\sqrt2.

El SVM nunca aprendió nada curvo. Trazó una superficie perfectamente plana, en un espacio donde «plano» significa «círculo» al volver a casa. Todo método de kernels funciona así.

El problema: un mapa de grado 2 en dd dimensiones necesita ∼d2/2\sim d^2/2 features; grado pp, ∼dp\sim d^p. Con d=1000d=1000 y p=3p=3, medio billón de números por punto. Construir ϕ\phi no escala.

Para ese ϕ\phi de grado 2:

ϕ(x)⊤ϕ(z)=x12z12+2x1x2z1z2+x22z22=(x1z1+x2z2)2=(x⊤z)2\phi(\mathbf{x})^\top\phi(\mathbf{z}) = x_1^2z_1^2+2x_1x_2z_1z_2+x_2^2z_2^2 = (x_1z_1+x_2z_2)^2 = (\mathbf{x}^\top\mathbf{z})^2

Con números, x=(1,2)\mathbf{x}=(1,2), z=(3,−1)\mathbf{z}=(3,-1): ruta barata x⊤z=3−2=1\mathbf{x}^\top\mathbf{z} = 3-2 = 1, al cuadrado 1. Ruta cara ϕ(x)=(1,22,4)\phi(\mathbf{x}) = (1, 2\sqrt2, 4), ϕ(z)=(9,−32,1)\phi(\mathbf{z}) = (9,-3\sqrt2,1), producto 9−12+4=19-12+4 = 1. ✓ La ruta barata cuesta O(d)O(d) y nunca construye el vector levantado; el ahorro crece sin límite con el grado.

Lo mismo con K(x,x′)=(1+x⊤x′)2K(\mathbf{x},\mathbf{x}')=(1+\mathbf{x}^\top\mathbf{x}')^2: expandiendo aparece ϕ(x)=(1,2x1,2x2,x12,x22,2x1x2)\phi(\mathbf{x}) = (1,\sqrt2x_1,\sqrt2x_2,x_1^2,x_2^2,\sqrt2x_1x_2), un producto de 6 dimensiones calculado con un escalar al cuadrado.

Un kernel es una función K(x,x′)K(\mathbf{x},\mathbf{x}') que es igual a ϕ(x)⊤ϕ(x′)\phi(\mathbf{x})^\top\phi(\mathbf{x}') para algún mapa ϕ\phi. Reemplaza cada xi⊤xj\mathbf{x}_i^\top\mathbf{x}_j del dual por K(xi,xj)K(\mathbf{x}_i,\mathbf{x}_j) y el SVM ajusta un hiperplano de margen máximo en el espacio ϕ\phi sin calcular una sola coordenada de ϕ\phi:

max⁡α∑iαi−12∑i,jαiαjyiyj K(xi,xj),f(x)=∑iαiyi K(xi,x)+b\max_{\boldsymbol\alpha}\sum_i\alpha_i-\frac12\sum_{i,j}\alpha_i\alpha_jy_iy_j\,K(\mathbf{x}_i,\mathbf{x}_j),\qquad f(\mathbf{x}) = \sum_i\alpha_iy_i\,K(\mathbf{x}_i,\mathbf{x})+b

Todo lo demás (restricciones, casos KKT, esparcidad, convexidad) se traslada tal cual. El algoritmo ni se entera de que cambió de espacio.

KK es válido si y solo si es simétrico (K(x,x′)=K(x′,x)K(\mathbf{x},\mathbf{x}')=K(\mathbf{x}',\mathbf{x})) y semidefinido positivo (condición de Mercer): toda matriz de Gram Kij=K(xi,xj)K_{ij} = K(\mathbf{x}_i,\mathbf{x}_j) cumple c⊤Kc≥0\mathbf{c}^\top\mathbf{K}\mathbf{c}\ge0 para todo c\mathbf{c} (equivalentemente, autovalores ≥ 0). Eso garantiza que existe un ϕ\phi, aunque nunca lo escribamos.

  • La matriz de Gram es una matriz de similitud: ordenando filas y columnas por clase, se ven bloques brillantes dentro de cada clase. PSD es el sello algebraico de un producto interno genuino.
  • Reglas de cierre: si K1,K2K_1, K_2 son kernels, también lo son K1+K2K_1+K_2, K1K2K_1K_2 y aK1aK_1 con a>0a>0. Sumas y productos de similitudes válidas siguen siendo válidos.
  • El kernel sigmoide tanh⁡(a x⊤x′+c)\tanh(a\,\mathbf{x}^\top\mathbf{x}'+c) se usa a veces pero no siempre es PSD.

Verifica con x=(1,0)\mathbf{x}=(1,0), z=(2,3)\mathbf{z}=(2,3) que (1+x⊤z)2=ϕ(x)⊤ϕ(z)(1+\mathbf{x}^\top\mathbf{z})^2 = \phi(\mathbf{x})^\top\phi(\mathbf{z}) para el ϕ\phi de 6 dimensiones.

Ver solución

Ruta kernel: x⊤z=2\mathbf{x}^\top\mathbf{z} = 2, (1+2)2=9(1+2)^2 = 9.

Ruta φ: ϕ(x)=(1,2,0,1,0,0)\phi(\mathbf{x}) = (1,\sqrt2,0,1,0,0); ϕ(z)=(1,22,32,4,9,62)\phi(\mathbf{z}) = (1, 2\sqrt2, 3\sqrt2, 4, 9, 6\sqrt2). Producto: 1+2⋅22+0+1⋅4+0+0=1+4+4=91 + \sqrt2\cdot2\sqrt2 + 0 + 1\cdot4 + 0 + 0 = 1+4+4 = 9 ✓.

Autoevaluación

0/4 correctas · 0 respondidas
1. Un kernel válido debe ser…
2. Si K1K_1 y K2K_2 son kernels, ¿cuál NO es necesariamente un kernel?
3. Una frontera circular en 2-D, vista en el espacio levantado, es…
4. ¿Por qué funciona el truco en el SVM?

En código: comprobar la identidad del kernel

Sección titulada «En código: comprobar la identidad del kernel»
import numpy as np
from sklearn.metrics.pairwise import polynomial_kernel
def phi(v): # mapa explícito de (1 + xᵀz)² en 2-D
x1, x2 = v
s = np.sqrt(2)
return np.array([1, s*x1, s*x2, x1**2, x2**2, s*x1*x2])
x, z = np.array([1., 2.]), np.array([3., -1.])
print(phi(x) @ phi(z), (1 + x @ z) ** 2) # 4.0 4.0 → mismo número
print(polynomial_kernel([x], [z], degree=2, gamma=1, coef0=1))
K = polynomial_kernel(X, degree=2, coef0=1) # matriz de Gram n × n
print(np.linalg.eigvalsh(K).min() >= -1e-9) # PSD → kernel válido

Fuente ·ML_Course_SVM.pdf (slides 62–69) · ML_Course_Kernels.pdf (Lecture 07, slides 1–9) · ML_Course/session-06b-dual-and-kernel-trick.ipynb · ML_Course/session-07-kernels-in-practice.ipynb