Apuntes / Procesamiento de Lenguaje Natural / Apunte 4 de 8
Read in EnglishClasificar documentos con modelos lineales
Cómo una suma ponderada de las palabras de un documento decide a cuál de dos clases pertenece, cómo la regresión logística convierte esa suma en una probabilidad y cómo el descenso de gradiente aprende los pesos.
Buena parte del Quijote es el caballero y su escudero conversando. Si se tapan los nombres, un lector todavía puede adivinar muchas veces quién habla: uno trata al otro de vuestra merced, el otro le responde con tú y amigo Sancho. Un modelo lineal puede aprender a hacer lo mismo solo con las palabras. Le da un peso a cada palabra, suma los pesos de las palabras de un parlamento y lee el signo de la suma. Entrenado con los parlamentos que el libro atribuye a uno de los dos, acierta quién habla en el 76% de los parlamentos de capítulos que nunca vio:
-
¿Cuál de los dos lo dijo?
-
Cada palabra empuja hacia uno de ellos
-
Los empujes suman una probabilidad
La sección 1 suma los pesos de las palabras de un parlamento, la sección 2 traza la recta que el signo de la suma marca entre los dos, la sección 3 convierte la suma en una probabilidad, la sección 4 mide cuán equivocada está una probabilidad, la sección 5 aprende los pesos a partir de los parlamentos y la sección 6 agrega al narrador como tercera voz.
1Un peso por palabra
Un parlamento es una bolsa de palabras: un vector x que cuenta cada palabra del vocabulario en él, como cada capítulo era un vector de conteos en el apunte del modelo de espacio vectorial. Un modelo lineal le da a cada palabra i un peso wi y suma los conteos por sus pesos en una puntuación:
La suma parte en i = 0, con x0 = 1 en todo parlamento, para que w0, el sesgo, sea la puntuación de un parlamento sin ninguna palabra del vocabulario. Aquí una puntuación positiva significa Sancho y una negativa don Quijote. Una palabra empuja hacia quien la dice, no hacia quien nombra: sancho empuja hacia don Quijote, que es quien llama a su escudero por su nombre. Los pesos de la figura se aprendieron con los parlamentos de cuatro de cada cinco capítulos (la sección 5 muestra cómo), y sus seis parlamentos vienen del quinto, que el modelo nunca vio. Se conservan las 2544 palabras de su vocabulario, stopwords incluidas: el tú y el os que un buscador descartaría son parte de la voz de don Quijote, y el vuestra, de la de Sancho.
Elige un parlamento y luego haz clic en una palabra para sacarla de la suma, o para devolverla.
Los pesos más grandes son los de las palabras con que cada uno se dirige al otro: merced y señor apuntan a Sancho; tú, amigo y sancho a don Quijote. Las palabras que el modelo no vio al entrenarse, como hideperro, pesan 0. El último parlamento es de Sancho, pero no se dirige a nadie, y los pesos chicos de sus palabras comunes se inclinan al otro lado: lo que este modelo lee, sobre todo, es a quién se habla.
2Una recta entre los dos
Un parlamento es un punto en un espacio con una dimensión por palabra, y el signo de su puntuación parte ese espacio en dos: el lado de Sancho, donde s > 0, y el de don Quijote, donde s < 0. La frontera entre ellos, donde s = 0, es un hiperplano perpendicular a w, y w apunta hacia el lado positivo. Con dos palabras el espacio es un plano y la frontera una recta, que se puede dibujar.
Toma dos de las palabras de más peso: merced, del vuestra merced con que Sancho trata a su amo, y tú, con que su amo lo trata a él. Cada parlamento queda en sus conteos de ambas, y muchos comparten un punto: 795 de los 1089 no tienen ninguna de las dos y se amontonan en (0, 0). Con solo estas dos palabras la puntuación es s = w0 + w1x1 + w2x2. En la figura, elige la dirección de w y el sesgo, y mira dónde cae la recta.
Dirección de w
Sesgo w0
Elige una dirección para w y un sesgo.
Un montón queda entero de un lado, así que el del origen, siete de cada diez parlamentos, lo decide solo el sesgo: haga lo que haga la recta en el resto del plano, acierta los 362 de Sancho que hay ahí o los 433 de don Quijote. Ninguna recta sobre estas dos palabras acierta más de 686 de los 1089 parlamentos, el 63%. El modelo de la sección 1 lo hace mejor porque lee todas las palabras: de los parlamentos de sus capítulos no vistos que no tienen ninguna de estas dos, acierta quién habla en 136 de 192, el 71%.
3De una puntuación a una probabilidad
Una puntuación dice de qué lado de la recta cae un parlamento, y a qué distancia, pero no cuánta seguridad tener. Tres modelos clásicos calculan la misma puntuación y solo difieren en la función θ que le aplican:
El perceptrón se queda solo con el signo, un escalón de 0 para don Quijote a 1 para Sancho: decide, pero no dice nada de su confianza, y un salto no tiene pendiente de la cual aprender. La regresión lineal conserva la puntuación misma, cualquier número real, lo que sirve para predecir una magnitud, no una clase. La regresión logística comprime la puntuación entre 0 y 1 con la función logística, lo bastante suave para aprender de su pendiente, y lee el resultado como una probabilidad:
la probabilidad de que Sancho, y = 1, haya dicho el parlamento x, y no don Quijote, y = 0. La de don Quijote no necesita un segundo modelo: θ(−s) = 1 − θ(s), la misma puntuación con el signo dado vuelta. En la figura, arrastra la puntuación y sigue las tres salidas.
Arrastra el punto rojo a lo largo de la puntuación, o muévelo con las flechas.
Lejos de 0 la logística se aplana: una puntuación de 4 o de 8 da casi la misma certeza, cercana a 1, como la daría el escalón. Cerca de 0 sube con fuerza, y ahí un cambio chico en la puntuación es el que más mueve la probabilidad.
4Cuán equivocada está una probabilidad
Para aprender sus pesos, el modelo necesita un número que diga cuán equivocadas están sus probabilidades en los parlamentos cuyo autor conoce. Para un parlamento, mira la probabilidad p que le dio a quien de verdad habló: h(x) si habló Sancho, 1 − h(x) si habló don Quijote. Un buen modelo hace grande p en todos los parlamentos a la vez, es decir, hace grande su producto; el logaritmo convierte ese producto en una suma, y un signo menos la convierte en una pérdida que hay que achicar. Promediada sobre los N parlamentos, con logaritmos naturales, es la entropía cruzada binaria:
Como cada yn vale 1 o 0, en cada parlamento uno de los dos términos se anula, y lo que queda es −log p. Una respuesta correcta dada con confianza, p cerca de 1, casi no cuesta; una equivocada dada con confianza, p cerca de 0, cuesta sin límite. En la figura, arrastra la probabilidad h que el modelo le da a Sancho, y elige quién habló de verdad.
Arrastra el punto rojo a lo largo de h, o muévelo con las flechas, y cambia quién habló.
Las dos curvas son reflejos una de la otra: la pérdida de Sancho es chica donde el modelo se inclina hacia él, la de don Quijote donde se inclina al revés. Esa es la asimetría para la que está hecha la pérdida: dudar cuesta un poco, y equivocarse con seguridad cuesta mucho.
5Aprender los pesos
Aprender es encontrar el w que hace más chica a ℒ. La pérdida depende de w a través de la probabilidad h, que depende de la puntuación s, que depende de w; por la regla de la cadena, su derivada para un parlamento es el producto de tres eslabones,
y el producto es simplemente (h − y)x: el error del parlamento por el parlamento. Promediado sobre los parlamentos da el gradiente, que apunta hacia donde la pérdida crece más rápido, y el descenso de gradiente da un paso en sentido contrario, de un largo que fija la tasa de aprendizaje η:
Un parlamento al que el modelo le da demasiado de Sancho empuja los pesos de sus palabras hacia don Quijote, y al revés: la regla del perceptrón, con un error graduado en vez de un sí o un no. La figura corre el descenso de gradiente en el plano de la sección 2, desde w = 0, donde cada parlamento recibe h = 0.5. Elige una tasa de aprendizaje y da pasos.
Elige una tasa de aprendizaje. Siguiente da un paso, Atrás retrocede. Teclas: → y ←.
Con η = 0.5 la recta encuentra pronto su lugar, pero los pesos, y con ellos las probabilidades, crecen despacio: tras treinta pasos la pérdida, 0.644, sigue muy por encima de su mínimo, 0.615. Con η = 5 la pérdida queda a 0.01 de su mínimo en trece pasos. Con η = 16 los pasos saltan más allá del mínimo, de un lado a otro: el gradiente cambia de signo casi en cada paso, los pesos oscilan y crecen, y la pérdida sube por encima de donde empezó. El modelo de la sección 1 aprendió sus 2545 pesos del mismo modo, cada palabra una dimensión del mismo descenso.
6Tres voces: softmax
El libro tiene una tercera voz, la del narrador, que cuenta lo que los dos hacen entre sus palabras. Con K clases, w se vuelve una matriz con una fila de pesos por clase, y cada línea recibe una puntuación de cada fila:
La softmax convierte las K puntuaciones en probabilidades, todas positivas y que suman 1, cada una más grande cuanto más se destaca su puntuación sobre las demás; con K = 2 es otra vez la función logística, aplicada a la diferencia de las dos puntuaciones. Entrenado con los mismos capítulos, con oraciones del narrador como tercera clase, el modelo acierta la voz del 76% de las líneas de capítulos que nunca vio. Elige una línea para ver sus tres puntuaciones y lo que la softmax hace con ellas.
Elige una línea de un capítulo que el modelo nunca vio.
La tabla cuenta cómo lee el modelo las 381 líneas de sus capítulos no vistos:
| El modelo dice | |||
|---|---|---|---|
| Dicho por | Narrador | Don Quijote | Sancho |
| Narrador | 83 | 6 | 3 |
| Don Quijote | 11 | 94 | 44 |
| Sancho | 11 | 17 | 112 |
De sus 92 errores, 61 confunden al caballero con el escudero y 22 toman un parlamento por el narrador. Esos parlamentos son cortos, la mitad de 7 palabras o menos frente a 38 en los parlamentos en general, con pocas palabras que delaten a quien habla, como la última línea de la figura. Las oraciones del narrador se leen mal solo 9 veces de 92.
7Resumen
Las ideas del apunte en NumPy. x guarda los conteos de los parlamentos, una fila por parlamento con una primera columna de unos, y sus etiquetas, 1 para Sancho y 0 para don Quijote, y w los pesos, el sesgo primero; para tres voces, w tiene una fila por clase.
s = x @ wh = 1 / (1 + np.exp(-s))loss = -np.mean(
y * np.log(h)
+ (1 - y) * np.log(1 - h))grad = x.T @ (h - y) / len(y)w -= eta * grads = x @ w.T
s -= s.max(1, keepdims=True)
e = np.exp(s)
p = e / e.sum(1, keepdims=True)