Apuntes / Procesamiento de Lenguaje Natural / Apunte 6 de 8
Read in EnglishLo que capturan los vectores de palabras
Lo que terminan capturando los vectores que word2vec aprende del Quijote, por qué las palabras relacionadas apuntan igual aunque nunca aparezcan juntas, cómo sumas y diferencias de vectores encuentran la palabra que sobra en una lista y completan analogías, qué no sabe un solo libro y sí saben los vectores entrenados con mucho más texto, y cómo el pooling le da a un texto entero un solo vector.
El apunte de word2vec dejó a cada palabra con una fila corta de números, aprendida solo adivinando las palabras que la rodean. Entrenado de la misma manera con todo el Quijote, el modelo le da a cada una de las 5259 palabras que el libro usa al menos cinco veces una fila de 100 números. En el entrenamiento no entró ninguna definición de yelmo ni de cura, y aun así los números ponen el yelmo junto a la bacía de barbero que don Quijote toma por uno, y al cura junto al barbero, el amigo con el que va a todas partes. Este apunte pregunta qué capturan esos números, por qué lo capturan y qué se puede hacer con ellos.
-
Las palabras que se usan igual apuntan igual
-
¿Qué palabra sobra?
-
Las diferencias guardan relaciones
La sección 1 mide cuán cerca están dos palabras por el ángulo entre sus vectores, y pone los vectores junto a una bolsa de palabras; la sección 2 muestra por qué dos palabras que nunca aparecen juntas terminan cerca; la sección 3 encuentra la palabra que sobra en una lista, y la sección 4 completa analogías; la sección 5 compara los vectores del libro con vectores entrenados con la web, y la sección 6 le da a un texto entero un solo vector, para que lo lea un clasificador. Las palabras para las que ninguna tabla tiene vector son el tema del próximo apunte.
1El vector de una palabra y las palabras más cercanas
Los vectores de este apunte vienen del skip-gram con muestreo negativo del apunte de word2vec, entrenado con el libro: d = 100 números por palabra, un radio sorteado entre 1 y m = 5 para cada objetivo, y k = 5 palabras sorteadas por par, con β = ¾. Como hace el programa original, no les da vector a las palabras vistas menos de cinco veces, y se salta al azar las palabras frecuentes como que, tanto más a menudo cuanto más frecuentes son, porque aparecen junto a todas las palabras y enseñan poco. Un libro es pequeño al lado de los corpus para los que se hizo word2vec, así que el entrenamiento lo leyó 20 veces, cuando el programa lee un texto 5 veces si no se le indica otra cosa. El entrenamiento parte de números al azar, así que se hizo cinco veces, desde cinco comienzos al azar: las figuras y los números citados muestran el primero, y el texto afirma solo lo que se cumplió en al menos cuatro de los cinco.
Una bolsa de palabras describe un texto, como en los apuntes de los modelos lineales y de word2vec: x ∈ ℝV, una coordenada por palabra del vocabulario, que lleva el nombre de su palabra y cuenta cuántas veces la usa el texto, así que casi todas valen 0; una sola palabra es un vector one-hot. Aquí V = 5259, las palabras que tienen vector. El libro tiene 22 605 palabras distintas, y las otras 17 346, tres de cada cuatro pero solo el 7.3% del texto, no reciben ninguno.
Un embedding describe una palabra: vw ∈ ℝd, su fila de Win, unas cincuenta veces más corta. Es denso: el vector de cura tiene 58 números negativos, 42 positivos y ningún cero. Y es aprendido, así que ninguno de sus números tiene nombre. Girar cada fila de Win y cada columna de Wout con la misma rotación cambiaría todos los números y dejaría cada puntuación ucTvo como estaba, así que el entrenamiento no tiene por qué preferir unos ejes sobre otros. Lo que guardan los números está en cómo quedan los vectores unos respecto de otros, y el coseno del apunte del modelo de espacio vectorial lo mide, por el ángulo θ entre dos vectores:
(θ es aquí el ángulo; la función logística es σ desde el apunte de word2vec). Dos vectores que apuntan igual tienen cos θ cerca de 1, y dos en ángulo recto, 0. A diferencia de los pesos tf-idf del apunte del modelo de espacio vectorial, que nunca son negativos, los números de un embedding pueden ser negativos, así que el coseno va de −1 a 1, aunque pocas palabras apuntan en contra: solo 10 de las otras 5258 quedan a más de 90° de cura. El coseno deja el largo de lado, y aquí el largo orienta mal, porque depende sobre todo de cuán a menudo aparece una palabra: las palabras vistas de 5 a 9 veces tienen un largo mediano de 1.57, y las vistas de 50 a 199 veces, de 2.61.
La figura dibuja el vector de la palabra elegida y el de su palabra más cercana en el plano que generan los dos, donde su ángulo es exacto, y alrededor cuenta cada una de las demás palabras del vocabulario por su ángulo desde la palabra elegida, grado por grado. Elige una palabra, y pasa de su embedding a su bolsa de palabras.
Palabra
Haz clic en una palabra, o recorre las palabras con las flechas del teclado, y elige el tipo de vector.
Dos palabras tomadas al azar suelen estar lejos: la mitad de los pares del vocabulario están a más de 64°, y las palabras más cercanas a una palabra son un borde delgado de la multitud, por delante del resto. Como bolsas de palabras, cada palabra está a 90° de todas las demás, porque dos vectores one-hot distintos no comparten ninguna coordenada. El yelmo queda junto a la bacía que don Quijote toma por el yelmo de Mambrino, y los gigantes cerca de los molinos que él toma por gigantes.
Cerca quiere decir relacionado, no parecido. Entre las palabras más cercanas a pan están queso y cebolla, y la más cercana a verano es invierno en los cinco entrenamientos: los opuestos se usan en los mismos lugares, en verano y en invierno. Y cada grafía tiene un solo vector, tenga los sentidos que tenga, como los sentidos de real en el apunte de WordNet; la sección 5 muestra lo que eso cuesta.
2Palabras que llenan los mismos huecos
El entrenamiento nunca acerca dos objetivos entre sí. Cada par (o, c) mueve vo hacia uc, una fila de Win hacia una columna de Wout, como en la figura del muestreo negativo del apunte de word2vec. Incluso cura y barbero, que aparecen a cinco palabras o menos una de otra 45 veces, son atraídas cada una hacia el vector de contexto u de la otra, nunca hacia la fila de la otra. Dos filas terminan cerca cuando son atraídas hacia los mismos vectores de contexto: cuando las dos palabras llenan los mismos huecos.
El libro usa asno 86 veces y jumento 73 veces, y las dos en los mismos marcos, como sobre su asno y sobre su jumento. Las dos nunca aparecen a diez palabras o menos una de otra, y aun así cada una es la palabra más cercana a la otra en al menos cuatro de los cinco entrenamientos, a unos 34°. A través de Wout, el modelo espera rocinante cerca de las dos: σ(urocinanteTvasno) vale 0.82 y σ(urocinanteTvjumento), 0.90.
¿Por qué es la dirección la que guarda esto, y no el largo? Una puntuación se separa en dos largos y un ángulo,
así que sube tanto al girar los dos vectores uno hacia el otro como al alargarlos. La pérdida del apunte de word2vec hace pequeño −log σ(ucTvo) para un par observado, y eso pide una puntuación grande. Alargar vo escala todas sus puntuaciones a la vez, también las de las palabras sorteadas, así que solo conviene cuando vo ya apunta hacia las palabras con que se vio y lejos de las sorteadas. Sin palabras sorteadas, nada impediría que todos los vectores crecieran en una misma dirección compartida, como señalan Goldberg y Levy (2014): las palabras sorteadas hacen que la dirección importe, y la dirección es lo que mide el coseno de la sección 1. Los largos también crecen, hasta quedar entre 1.19 y 3.73 en los vectores del libro.
La figura sigue un ejemplo diseñado con vectores de dos números, como en el apunte de word2vec: dos objetivos, asno y jumento, ambos en carmín; una palabra de contexto con la que aparecen los dos, rocinante, en verde; y una palabra sorteada del libro para cada objetivo, lágrimas y dejando. Da pasos de descenso de gradiente con η = 1.2, y luego pasa a una versión en que jumento aparece en cambio con una palabra propia, costal.
Siguiente da un paso de descenso de gradiente, Atrás vuelve. Teclas: → y ←.
Las palabras con vecinas parecidas terminan con vectores parecidos, como prometía el apunte de word2vec. Los sinónimos rara vez van uno al lado del otro, porque quien escribe usa uno u otro, así que este camino indirecto, por las palabras que los rodean, es como se encuentran. Lo que pide el entrenamiento es que cada vo se alinee con su uc; nada en él pide que dos objetivos estén cerca, y eso ocurre porque comparten vectores de contexto.
3El cuarto excluido
Si las palabras relacionadas apuntan igual, una lista debería mostrar cuál de sus palabras sobra. Deja fuera cada palabra por turno y suma los vectores de las demás: la suma es larga cuando las palabras que quedan apuntan igual, así que la suma más larga es la que no tiene a la intrusa. Escrito con argmax, «la w que hace esto máximo»:
donde L es la lista y cada vector se escala antes a largo 1. Para tres palabras w, w′ y w″ con vectores de largo 1, el largo de su suma depende solo de sus cosenos,
así que la suma es larga solo cuando los cosenos de sus palabras son todos grandes, y una palabra muy apartada de las demás aporta un coseno pequeño a cada par que forma. Los vectores se escalan antes porque, tal como salieron, un vector corto le resta poco a la suma cuando queda fuera, y las palabras menos frecuentes tienen los vectores más cortos: la regla tendería a elegir la palabra menos frecuente. Con vectores de largo 1 es la regla del primer artículo de word2vec (Mikolov, Chen, Corrado y Dean 2013), que elige la palabra más alejada del promedio de la lista. Arma una lista de tres a seis de las dieciséis palabras de abajo, y compara los vectores escalados a largo 1 con los vectores como salieron del entrenamiento.
Haz clic en las palabras para agregarlas a la lista o sacarlas; las flechas del teclado recorren las palabras.
Toda lista de tres palabras de uno de los cuatro grupos de la figura (las cabalgaduras, la comida, las personas y el gobierno de la ínsula) y una de otro encuentra a la intrusa cuando los vectores se escalan, en los cinco entrenamientos, pero solo el 79% de ellas lo logra con los vectores como salieron. La regla solo lee ángulos: el queso y la cebolla quedan juntos porque el libro los usa en los mismos lugares, no porque un recurso como WordNet ponga a los dos bajo los alimentos. Falla donde el libro usa igual palabras que un lector separaría: en la lista sancho, quijote, dulcinea, teresa, rocinante, cuatro personas y un caballo, las tres sumas más largas quedan a unas pocas centésimas unas de otras, y cuál gana cambia de un entrenamiento a otro.
4Analogías
¿Significan algo las direcciones? Una analogía a : a* :: b : b*, que se lee «a es a a* como b es a b*», pide la palabra que es a b lo que a* es a a: caballero es a caballeros como escudero es a escuderos. Si el paso de a a a* es una dirección del espacio, sumarlo a b debería caer cerca de b*:
de nuevo con vectores de largo 1. Si se escribe t para vb − va + va*, el coseno se separa en los cosenos de w con las tres palabras dadas,
así que la respuesta tiene que estar cerca de b y de a*, y lejos de a. Las tres palabras dadas quedan fuera de la búsqueda, como las deja fuera el primer artículo de word2vec: la propia b tiene cos θbb = 1 en esa suma, y en 25 analogías probadas en este libro, una búsqueda entre todas las palabras pone primera a una de las palabras dadas en 24. Mikolov, Yih y Zweig (2013) encontraron estas regularidades en los vectores de una red recurrente, una red que lee un texto palabra por palabra (la explica un apunte posterior), y word2vec las hizo conocidas.
Los dos pasos son solo en parte el mismo vector: el coseno entre el paso de caballero a caballeros y el paso de escudero a escuderos es 0.69. Parte de cada respuesta viene de quedarse cerca de b, y el segundo modo de la figura muestra cuánto: las palabras más cercanas a b sola. Elige una analogía, y compara.
Analogía
Haz clic en una analogía, o recórrelas con las flechas del teclado, y elige a qué se acercan las palabras.
El plural llega primero en los cinco entrenamientos, y escuderos, apenas la 1610.ª palabra más cercana a escudero, le debe su lugar al paso. Sancho también llega primero en los cinco entrenamientos, pero ya estaba entre las tres palabras más cercanas a quijote: ahí el paso agrega poco. Lo que un solo libro acierta es su propio mundo y su gramática. Las relaciones que muestra poco, como la de hijo a hija y la de hermano a hermana, necesitan mucho más texto, y a eso va la sección 5.
5Vectores preentrenados
Entrenar con miles de millones de palabras es caro, así que un grupo entrena una vez y publica el resultado, y cualquiera puede descargarlo: un archivo con una línea por palabra, la palabra y sus números. Los vectores de fastText para el inglés y el español (Grave et al. 2018) tienen dos millones de palabras cada uno, con 300 números por palabra, entrenados con las páginas web de Common Crawl y con Wikipedia. Su modelo es CBOW, el modelo de word2vec que adivina una palabra a partir de sus vecinas, con pedazos de palabras agregados, que explica el próximo apunte. El archivo guarda una fila por palabra, sacada del lado de entrada del modelo: en word2vec sería la fila de la palabra en Win, mientras que fastText promedia esa fila con las filas de los pedazos de la palabra. Aquí V = 2 000 000 y d = 300. Entrenar los propios vectores sigue siendo una opción, como hizo este apunte con el libro.
La tabla tiene 5157 de las 5259 palabras del libro en minúsculas; las 102 que le faltan son sobre todo nombres, como cardenio y lotario, y formas antiguas, como mochachos y juridición. En la figura, las palabras más cercanas de los vectores de la web se buscan entre las 100 000 palabras en minúsculas más frecuentes de la tabla. Elige una palabra, y compara sus palabras más cercanas en el libro con las de la web.
Palabra
Haz clic en una palabra, o recorre las palabras con las flechas del teclado, y elige los vectores.
En la web, cura es sobre todo el verbo curar, y lanza, el verbo lanzar. Una grafía guarda un solo vector, y el corpus decide qué sentido lo llena. Las relaciones también siguen al corpus. Los vectores de la web completan hijo : hija :: hermano : hermana, donde los cinco entrenamientos del libro ponen hermana entre el lugar 25 y el 148, y hijo : hija :: sobrino : sobrina, donde el libro la pone más allá del lugar 3500. Para rey : reino :: gobernador : ?, el libro pone ínsula, el gobierno de Sancho, primera o segunda en los cinco entrenamientos, y los vectores de la web, en el lugar 211.
6Pooling: un vector para un texto
Un clasificador, como los del apunte de los modelos lineales, lee un vector por texto. Con embeddings, un texto de N palabras tiene N vectores, y el pooling los combina en uno:
donde e(w) = vw es el embedding de la palabra w, su fila de Win, como salió del entrenamiento. Las formas de pooling más usadas son la media y el máximo de cada uno de los d números:
La suma sirve igual: es N veces la media, así que da los mismos cosenos; qué pooling conviene depende de la tarea. x vuelve a ser el vector del texto, como lo era la bolsa de palabras de la sección 1, pero con d números en vez de V, y Win une a los dos: la suma de los embeddings de un texto es WinTx para su bolsa de palabras x, el paso de selección del apunte de word2vec alimentado con una bolsa de palabras entera en vez de un vector one-hot. Con los pesos del modelo de espacio vectorial, una consulta y un texto sin palabras en común puntúan 0; sus embeddings con pooling pueden quedar cerca de todos modos. En la figura, elige un par de textos cortos, y compara su media con su máximo.
Textos
Haz clic en un par de textos, o recórrelos con las flechas del teclado, y elige el pooling.
Después, un clasificador lee x. Uno con una capa oculta, que definió el apunte de word2vec, lo pasa por una capa de pesos W y por la función logística, aplicada a cada número, antes de una softmax como la del apunte de los modelos lineales, aquí con pesos U, una fila por clase:
con un 1 al comienzo de x, para que la primera columna de W guarde los sesgos, como en el apunte de los modelos lineales, que no tenía capa oculta. El pooling vuelve a perder el orden, como lo perdía la bolsa de palabras: la línea de Sancho y la lectura de don Quijote dan el mismo vector. Las palabras frecuentes como el pesan en la media salvo que se quiten, como se quitaban las stopwords en el apunte del modelo de espacio vectorial, o se les dé menos peso. Apuntes posteriores conservan el orden, con redes recurrentes y atención, y aplican pooling a vectores que dependen de la oración.
7Resumen
Las ideas del apunte en NumPy. w_in guarda los embeddings, una fila por palabra del vocabulario, y unit las mismas filas escaladas a largo 1, unit = w_in / np.linalg.norm(w_in, axis=1, keepdims=True); w_out guarda los vectores de contexto, una columna por palabra; w, w2, o, c, a, a_star y b son posiciones de palabras en el vocabulario, L las de las palabras de una lista e ids las de las palabras de un texto; W y U son los pesos de un clasificador.
v_w, v_w2 = w_in[w], w_in[w2]
cos = v_w @ v_w2 / (
np.linalg.norm(v_w)
* np.linalg.norm(v_w2))sims = unit @ unit[w]
sims[w] = -np.inf
closest = np.argsort(-sims)[:5]v_o, u_c = w_in[o], w_out[:, c]
lengths = (np.linalg.norm(u_c)
* np.linalg.norm(v_o))
cos_uv = u_c @ v_o / lengths
score = lengths * cos_uv # = u_c @ v_ou = unit[L]
sums = u.sum(axis=0) - u
lengths = np.linalg.norm(sums, axis=1)
w_star = L[lengths.argmax()]t = unit[b] - unit[a] + unit[a_star]
sims = unit @ t / np.linalg.norm(t)
sims[[a, a_star, b]] = -np.inf
b_star = sims.argmax()import itertools
f = open(path, encoding="utf-8")
next(f) # V y d
rows = [line.rstrip().split(" ")
for line in itertools.islice(f, 100_000)]
words = [r[0] for r in rows]
w_in = np.array([r[1:] for r in rows],
dtype=float)x = w_in[ids].mean(axis=0)x = w_in[ids].max(axis=0)x1 = np.r_[1, x]
hidden = 1 / (1 + np.exp(-(W @ x1)))
z = U @ hidden
e = np.exp(z - z.max())
y_hat = e / e.sum()Los datos del apunte: los vectores de la web son las tablas de fastText para el inglés y el español, cc.en.300 y cc.es.300 (Grave et al. 2018), bajo la licencia Creative Commons Atribución-CompartirIgual 3.0, de fasttext.cc; la página muestra solo lo que se calculó a partir de ellas, como palabras más cercanas, cosenos, productos punto y largos, nunca los vectores mismos. Los vectores del libro se entrenaron para este apunte.