Ir al contenido

Cross-entropy y entrenamiento

En simple: lee esto primero

Para entrenar la regresión logística castigamos mucho cuando el modelo está muy seguro y se equivoca; eso es la cross-entropy.

Imagínalo así

Un alumno que dice «estoy 100 % seguro» y falla merece más castigo que uno que dijo «no estoy seguro». La cross-entropy cobra según qué tan confiado estabas en la respuesta equivocada.

Lo que tienes que llevarte
  • No se usa error al cuadrado porque con la sigmoide el problema se vuelve difícil (con muchos valles).
  • La cross-entropy (log-loss) da una superficie en forma de tazón: el descenso de gradiente siempre encuentra el fondo.
  • El gradiente final es muy simple: (predicción − real) × dato.
Palabras raras de esta página
cross-entropy / log-loss
medida de error que castiga la confianza equivocada.
verosimilitud
qué tan probable hace el modelo los datos que realmente vimos. Queremos que sea alta.
separable
cuando una línea puede separar perfecto las clases; ahí los pesos crecen sin fin si no regularizas.

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.

El error cuadrático sobre la salida de la sigmoide da una superficie no convexa: una cuenca y luego una meseta/bulto que atrapa al descenso de gradiente. Además el gradiente lleva el factor σ′(z)=p(1−p)\sigma'(z)=p(1-p), que casi vale 0 justo cuando el modelo está seguro y equivocado: aprende lentísimo cuando más debería corregir. La cross-entropy da un solo valle convexo.

¿Por qué no error cuadrático? Mira la superficie

Modelo p = σ(w·x) con un solo peso, sobre 7 puntos (uno de ellos está «del lado equivocado»). Las dos curvas están normalizadas para compararlas. Desde un mal inicio, se hacen 60 pasos de descenso de gradiente con la misma tasa.

-10-50510peso wpérdida (normalizada)
cross-entropy (convexa: un valle)error² sobre σ (no convexa: mesetas)
w final · cross-entropy0.46
w final · error²-4.12
Empieza en w₀ = −6 o −10: el error² está en una meseta (σ saturada ⇒ σ′ ≈ 0 ⇒ gradiente ≈ 0) y el descenso casi no se mueve, aunque el modelo está seguro y equivocado. La cross-entropy castiga fuerte ese error (−log de algo ≈ 0) y su gradiente (p − y)x no se apaga: llega al mínimo desde cualquier inicio.

La verosimilitud responde: ¿qué tan probables son los datos que vimos si este modelo fuera cierto? Es el mismo número que una probabilidad, pero leído como función de (w,b)(\mathbf{w},b) con los datos fijos.

Para un ejemplo, es la «barra»: la probabilidad que el modelo le da a su etiqueta verdadera. Con pi=σ(w⊤xi+b)p_i = \sigma(\mathbf{w}^\top\mathbf{x}_i+b):

P(yi∣xi)={piyi=11−piyi=0  =  pi yi(1−pi)1−yi(pmf de Bernoulli)P(y_i\mid\mathbf{x}_i) = \begin{cases}p_i & y_i = 1\\ 1-p_i & y_i=0\end{cases}\;=\;p_i^{\,y_i}(1-p_i)^{1-y_i}\qquad\text{(pmf de Bernoulli)}

Chequeo: yi=1⇒pi1(1−pi)0=piy_i=1 \Rightarrow p_i^1(1-p_i)^0 = p_i; yi=0⇒1−piy_i=0\Rightarrow 1-p_i.

Con ejemplos independientes, la probabilidad del dataset es el producto: L(w,b)=∏ipiyi(1−pi)1−yiL(\mathbf{w},b)=\prod_i p_i^{y_i}(1-p_i)^{1-y_i}. En vez de maximizarla, minimizamos −log⁡L-\log L. Tres ganancias: el log es creciente (mismo maximizador), convierte el producto (que se desborda a 0) en suma, y el signo menos vuelve «maximizar» en «minimizar una pérdida».

−log⁡L=−log⁡∏ipiyi(1−pi)1−yi=−∑ilog⁡[piyi(1−pi)1−yi]=−∑i[log⁡piyi+log⁡(1−pi)1−yi]=−∑i[yilog⁡pi+(1−yi)log⁡(1−pi)]\begin{aligned} -\log L &= -\log\prod_i p_i^{y_i}(1-p_i)^{1-y_i} = -\sum_i \log\big[p_i^{y_i}(1-p_i)^{1-y_i}\big]\\ &= -\sum_i\big[\log p_i^{y_i} + \log(1-p_i)^{1-y_i}\big] = -\sum_i\big[y_i\log p_i + (1-y_i)\log(1-p_i)\big] \end{aligned}

Promediando:

J(w,b)=−1n∑i=1n[yilog⁡pi+(1−yi)log⁡(1−pi)]\boxed{J(\mathbf{w},b) = -\frac1n\sum_{i=1}^n\big[y_i\log p_i + (1-y_i)\log(1-p_i)\big]}

Cada sumando es un interruptor: yi=1y_i=1 paga −log⁡pi-\log p_i; yi=0y_i=0 paga −log⁡(1−pi)-\log(1-p_i). Minimizar la cross-entropy = máxima verosimilitud del modelo Bernoulli.

  • Seguro y correcto: pérdida ≈ 0.
  • Seguro y equivocado: pérdida → ∞ (castigo durísimo).
  • No basta con estar del lado correcto de la frontera: quiere confianza calibrada.

Un ejemplo: ℓ=−[ylog⁡p+(1−y)log⁡(1−p)]\ell = -[y\log p + (1-y)\log(1-p)], con p=σ(z)p=\sigma(z), z=w⊤x+bz=\mathbf{w}^\top\mathbf{x}+b. Regla de la cadena x→z→p→ℓ\mathbf{x}\to z\to p\to\ell:

∂ℓ∂p=−[yp−1−y1−p]=p−yp(1−p),∂p∂z=p(1−p)    ⟹    ∂ℓ∂z=p−y\frac{\partial\ell}{\partial p} = -\Big[\frac{y}{p}-\frac{1-y}{1-p}\Big] = \frac{p-y}{p(1-p)},\qquad \frac{\partial p}{\partial z}=p(1-p) \;\;\Longrightarrow\;\;\frac{\partial\ell}{\partial z} = p-y

¡Los p(1−p)p(1-p) se cancelan! Con ∂z/∂w=x\partial z/\partial\mathbf{w}=\mathbf{x} y ∂z/∂b=1\partial z/\partial b = 1, promediando:

∇wJ=1n∑i(pi−yi)xi=1nX⊤(p−y),∂J∂b=1n∑i(pi−yi)\nabla_\mathbf{w}J = \frac1n\sum_i (p_i-y_i)\mathbf{x}_i = \frac1n\mathbf{X}^\top(\mathbf{p}-\mathbf{y}),\qquad \frac{\partial J}{\partial b} = \frac1n\sum_i(p_i-y_i)

Exactamente la forma de la regresión lineal: «error × feature», con p−y\mathbf{p}-\mathbf{y} en lugar del residual. Pero ahora no hay forma cerrada (la sigmoide es no lineal), así que se itera w←w−η∇J\mathbf{w}\leftarrow\mathbf{w}-\eta\nabla J.

Una iteración de entrenamiento con números (3 puntos)
  1. Datos: x=(−1, 0.5, 2)x = (-1,\ 0.5,\ 2), y=(0, 1, 1)y = (0,\ 1,\ 1). Modelo p=σ(wx+b)p = \sigma(wx + b), inicio w=0w = 0, b=0b = 0 ⇒ p=(0.5, 0.5, 0.5)p = (0.5,\ 0.5,\ 0.5).
  2. Pérdida: cada punto paga −log⁡0.5=0.693-\log 0.5 = 0.693; J=0.693J = 0.693 (el valor de «no saber nada» con dos clases).
  3. Errores p−y=(0.5, −0.5, −0.5)p - y = (0.5,\ -0.5,\ -0.5). Gradientes: ∂J/∂w=13[(0.5)(−1)+(−0.5)(0.5)+(−0.5)(2)]=13(−1.75)=−0.583\partial J/\partial w = \frac13[(0.5)(-1) + (-0.5)(0.5) + (-0.5)(2)] = \frac13(-1.75) = -0.583 y ∂J/∂b=13(0.5−0.5−0.5)=−0.167\partial J/\partial b = \frac13(0.5-0.5-0.5) = -0.167.
  4. Paso con η=1\eta = 1: w=0.583w = 0.583, b=0.167b = 0.167.
  5. Nuevas probabilidades: z=(−0.417, 0.458, 1.333)z = (-0.417,\ 0.458,\ 1.333) ⇒ p=(0.397, 0.613, 0.791)p = (0.397,\ 0.613,\ 0.791). Ahora todas del lado correcto del 0.5.
  6. Nueva pérdida: −13[log⁡(1−0.397)+log⁡0.613+log⁡0.791]=13(0.506+0.489+0.234)=0.410-\frac13[\log(1-0.397) + \log 0.613 + \log 0.791] = \frac13(0.506 + 0.489 + 0.234) = 0.410. Bajó de 0.693 a 0.410 en un paso.

Convexa… y finita gracias a la regularización

Sección titulada «Convexa… y finita gracias a la regularización»

La Hessiana es ∇2J=1n∑ipi(1−pi) xixi⊤⪰0\nabla^2 J = \frac1n\sum_i p_i(1-p_i)\,\mathbf{x}_i\mathbf{x}_i^\top\succeq 0: una suma con pesos no negativos de productos externos, semidefinida positiva en todas partes ⇒ un bowl, el descenso no se atasca.

Mira a la frontera acomodarse

Descenso de gradiente por lotes desde un inicio deliberadamente malo. El color es P(y = 1 | x); la línea blanca es la frontera wᵀx + b = 0. El gradiente es Xᵀ(p − y)/n: «error × feature», igual que en regresión lineal.

-4-2024-4-2024x₁x₂0510152000.020.040.060.080.1iteracióncross-entropy
clase 0clase 1frontera (P = 0.5)
iteraciones0
pérdida2.4131
accuracy42%
‖w‖2.56
La cross-entropy es convexa: baja monótonamente. Separa mucho las clases con λ = 0 y deja entrenar: ‖w‖ crece sin límite (sigmoides cada vez más afiladas). Con λ > 0 se estabiliza.

Un punto con y=1y=1 y p=0.2p=0.2. Calcula su pérdida y el gradiente respecto a zz. Repite con p=0.99p=0.99.

Ver solución
  • p=0.2p=0.2: ℓ=−log⁡0.2=1.609\ell=-\log 0.2 = 1.609; ∂ℓ/∂z=p−y=−0.8\partial\ell/\partial z = p-y = -0.8 (empuja fuerte a subir zz).
  • p=0.99p=0.99: ℓ=−log⁡0.99=0.010\ell = -\log0.99 = 0.010; ∂ℓ/∂z=−0.01\partial\ell/\partial z = -0.01 (casi no empuja: ya está bien).

Con error cuadrático (p−y)2(p-y)^2, el gradiente sería 2(p−y)p(1−p)2(p-y)p(1-p): para p=0.2p=0.2 da 2(−0.8)(0.16)=−0.2562(-0.8)(0.16) = -0.256, y para un punto con p=0.01p=0.01 (seguro y equivocado) solo −0.0196-0.0196: casi no aprende.

Autoevaluación

0/5 correctas · 0 respondidas
1. Minimizar la cross-entropy equivale a…
2. El gradiente de la cross-entropy respecto a w\mathbf{w} es…
3. ¿Por qué no se usa error cuadrático sobre la sigmoide?
4. Con clases linealmente separables y λ=0\lambda = 0…
5. ¿La regresión logística tiene forma cerrada como OLS?
import numpy as np
def sigmoid(z):
return np.where(z >= 0, 1 / (1 + np.exp(-z)), np.exp(z) / (1 + np.exp(z))) # estable
def fit_logistic(X, y, eta=0.5, iters=2000, lam=0.0):
w, b = np.zeros(X.shape[1]), 0.0
n = len(y)
for _ in range(iters):
p = sigmoid(X @ w + b)
w -= eta * (X.T @ (p - y) / n + 2 * lam * w) # «error × feature» + ridge
b -= eta * np.mean(p - y) # el sesgo no se penaliza
return w, b
def cross_entropy(X, y, w, b, eps=1e-12):
p = np.clip(sigmoid(X @ w + b), eps, 1 - eps)
return -np.mean(y * np.log(p) + (1 - y) * np.log(1 - p))

Fuente ·ML_Course_Logistic_Regression_and_Classification.pdf (slides 18–28) · ML_Course/session-04b-training-from-scratch.ipynb