Aprenda TensorFlow, el modelo Word2Vec y el algoritmo TSNE usando bandas de rock

Aprender el "método TensorFlow" para construir una red neuronal puede parecer un gran obstáculo para comenzar con el aprendizaje automático. En este tutorial, lo llevaremos paso a paso y explicaremos todos los componentes críticos involucrados mientras construimos un modelo Bands2Vec usando datos de Pitchfork de Kaggle.

Para obtener el código completo, consulte la página de GitHub.

El modelo Word2Vec

Las redes neuronales consumen números y producen números. Son muy buenos en eso. Pero dales un mensaje de texto y harán una rabieta y no harán nada remotamente interesante.

Si el trabajo de la red neuronal es procesar los números y producir resultados significativos, entonces es nuestro trabajo asegurarnos de que lo que sea que estemos alimentando también sea significativo. Esta búsqueda de una representación significativa de la información dio origen al modelo Word2Vec.

Un enfoque para trabajar con palabras es formar vectores codificados en caliente. Cree una lista larga (el número de palabras distintas en nuestro vocabulario) de ceros y haga que cada palabra apunte a un índice único de esta lista. Si vemos esta palabra, haga que ese índice en la lista sea el número uno.

Si bien este enfoque funciona, requiere mucho espacio y carece por completo de significado. "Bueno" y "Excelente" son tan similares como "Pato" y "Agujero negro". Si tan solo hubiera una forma de vectorizar palabras para que conserváramos esta similitud contextual ...

¡Afortunadamente, hay una manera!

Usando una red neuronal, podemos producir "incrustaciones" de nuestras palabras. Estos son vectores que representan cada palabra única extraída de los pesos de las conexiones dentro de nuestra red.

Pero la pregunta sigue siendo: ¿cómo nos aseguramos de que sean significativos? La respuesta: alimentar en pares de palabras como palabra objetivo y palabra de contexto. Haga esto suficientes veces, agregando algunos malos ejemplos también, y la red neuronal comenzará a aprender qué palabras aparecen juntas y cómo esto forma casi un gráfico. Como una red social de palabras interconectadas por contextos. "Bueno" va a "útil" que va a "cariñoso" y así sucesivamente. Nuestra tarea es introducir estos datos en la red neuronal.

Uno de los enfoques más comunes es el modelo Skipgram, que genera estos emparejamientos objetivo-contexto basados ​​en mover una ventana a través de un conjunto de datos de texto. Pero, ¿qué pasa si nuestros datos no son oraciones, pero todavía tenemos un significado contextual?

En este tutorial, nuestras palabras son nombres de artistas y nuestros contextos son géneros y puntuaciones de revisión media. Queremos que el artista A esté cerca del artista B si comparten un género y tienen una puntuación media similar. Entonces empecemos.

Construyendo nuestro conjunto de datos

Pitchfork es una revista de música estadounidense en línea que cubre principalmente rock, música independiente y nueva. Los datos enviados a Kaggle fueron extraídos de su sitio web y contienen información como reseñas, géneros y fechas vinculadas a cada artista.

Creemos una clase de artista y un diccionario para almacenar toda la información útil que queremos.

¡Excelente! Ahora queremos fabricar nuestros emparejamientos de contexto de destino en función del género y la puntuación media de la revisión. Para hacer esto, crearemos dos diccionarios: uno para los diferentes géneros únicos y otro para las partituras (discretizado en números enteros).

Agregaremos a todos nuestros artistas al género correspondiente y la puntuación media en estos diccionarios para usarlos más adelante al generar pares de artistas.

Un último paso antes de sumergirnos en el código de TensorFlow: ¡generar un lote! Un lote es como una muestra de datos que nuestra red neuronal usará para cada época. Una época es un barrido a través de la red neuronal en una fase de entrenamiento. Queremos generar dos matrices numpy. Uno contendrá el siguiente código:

TensorFlow

Existe una gran cantidad de tutoriales y fuentes de conocimiento de TensorFlow. Cualquiera de estos excelentes artículos te ayudará tanto como la documentación. El siguiente código se basa en gran medida en el tutorial de word2vec de las propias personas de TensorFlow. Con suerte, puedo desmitificar algo y reducirlo a lo esencial.

El primer paso es comprender la representación "gráfica". Esto es increíblemente útil para las visualizaciones de TensorBoard y para crear una imagen mental de los flujos de datos dentro de la red neuronal.

Tómese su tiempo para leer el código y los comentarios a continuación. Antes de enviar datos a una red neuronal, tenemos que inicializar todas las partes que vamos a usar. Los marcadores de posición son las entradas que toman lo que le damos al 'feed_dict'. Las variables son partes mutables del gráfico que eventualmente modificaremos. La parte más importante de nuestro modelo es la función de pérdida. Es la puntuación de lo bien que lo hicimos y el mapa del tesoro de cómo podemos mejorar.

La estimación por contraste de ruido (NCE) es una función de pérdida. Por lo general, usaríamos entropía cruzada y softmax, pero en el mundo del procesamiento del lenguaje natural, todas nuestras clases equivalen a cada palabra única.

Computacionalmente, esto es malo. NCE cambia el encuadre del problema de probabilidades de clases a si un emparejamiento objetivo-contexto es correcto o no (una clasificación binaria). Se necesita un verdadero emparejamiento y luego muestras para obtener malos emparejamientos, la constante num_sampledcontrola esto. Nuestra red neuronal aprende a distinguir entre estas parejas buenas y malas. ¡En última instancia, aprende los contextos! Puede leer más sobre NCE y cómo funciona aquí.

Ejecute la red neuronal

Ahora que todo está bien configurado, solo tenemos que presionar el gran botón verde de 'ir' y girar nuestros pulgares un poco.

Visualización usando TSNE

De acuerdo, no hemos terminado del todo. Ahora tenemos vectores de 64 dimensiones ricos en contexto para nuestros artistas, pero quizás sean demasiadas dimensiones para visualizar realmente su utilidad.

¡Afortunadamente para nosotros, podemos reducir esta información en dos dimensiones mientras conservamos tantas propiedades como las 64 dimensiones tenían! Esta es la incrustación de vecinos estocástica distribuida en T, o TSNE para abreviar. Este video hace un gran trabajo al explicar la idea principal detrás de TSNE, pero intentaré brindar una descripción general amplia.

TSNE es un enfoque de reducción de dimensionalidad que conserva las similitudes (como la distancia euclidiana) de dimensiones superiores. Para hacer esto, primero construye una matriz de similitudes punto a punto calculadas usando una distribución normal. El centro de la distribución es el primer punto y la similitud del segundo punto es el valor de la distribución a la distancia entre los puntos alejados del centro de la distribución.

Luego proyectamos aleatoriamente en la dimensión de abajo y hacemos exactamente el mismo proceso usando una distribución t. Ahora tenemos dos matrices de similitudes punto a punto. Luego, el algoritmo mueve lentamente los puntos en la dimensión inferior para intentar que se vea como la matriz de la dimensión superior donde se conservaron las similitudes. Y repetir. Afortunadamente, Sci-kit Learn tiene una función que puede hacer el cálculo numérico por nosotros.

Los resultados

El aspecto sorprendente de estas incorporaciones es que, al igual que los vectores, admiten operaciones matemáticas. El ejemplo clásico es:, King — Man + Woman = Queeno al menos muy cercano a él. Probemos con un ejemplo.

Take the low dimensional embeddings of Coil, a band with the following genres, [‘electronic’, ‘experimental', ‘rock’] , and mean score 7.9. Now subtract the low dimensional embeddings of Elder Ones, a band with genres,['electronic'] , and mean score 7.8. With this embedding difference, find the closest bands to it and print their names and genres.

Artist: black lips, Mean Score: 7.48, Genres: ['rock', 'rock', 'rock', 'rock', 'rock']
Artist: crookers, Mean Score: 5.5, Genres: ['electronic']
Artist: guided by voices, Mean Score: 7.23043478261, Genres: ['rock', 'rock', 'rock', 'rock', 'rock', 'rock', 'rock', 'rock', 'rock', 'rock', 'rock', 'rock', 'rock', 'rock', 'rock', 'rock', 'rock', 'rock', 'rock', 'rock', 'rock', 'rock', 'rock']

It worked! We’re getting rock and electronic bands with vaguely similar review scores. Below are the first three hundred bands plotted with labels. Hopefully you’ve found this project educational and inspiring. Go forth and build, explore, and play!