Cómo las redes neuronales convolucionales aprenden la similitud musical

¿Incrustaciones de audio para recomendación musical?

Las plataformas de streaming (Spotify, Apple Music, etc.) deben tener la posibilidad de recomendar nuevas canciones a sus usuarios. Cuanto mejores sean las recomendaciones, mejor será la experiencia auditiva.

Hay muchas formas en que estas plataformas pueden crear sus sistemas de recomendación. Los sistemas modernos combinarán diferentes métodos de recomendación en una estructura híbrida.

Piensa en cuando te uniste a Spotify por primera vez y te preguntaron qué géneros te gustan. Según los géneros que selecciones, Spotify te recomendará algunas canciones. Las recomendaciones basadas en metadatos de canciones como esta se denominan filtrado basado en contenido. También se utiliza el filtrado colaborativo, que agrupa a los clientes que se comportan de manera similar y luego se transfieren las sugerencias entre ellos.

Proceso de incrustación completo: desde MP3 hasta la incrustación aprendida de archivos
(Diagrama generado por el autor utilizando las herramientas de generación de imágenes de OpenAI)

Los dos métodos anteriores se basan en gran medida en el comportamiento del usuario. Otro método, cada vez más utilizado por los grandes servicios de streaming, es utilizar el aprendizaje profundo para representar canciones en espacios de integración aprendidos. Esto permite que las canciones se representen en un espacio integrado de alta dimensión que captura el ritmo, el timbre, la textura y el estilo de producción. Luego, la similitud entre canciones se puede calcular fácilmente, lo que se escala mejor que el uso de enfoques clásicos de filtrado colaborativo cuando se consideran cientos de millones de usuarios y decenas de millones de pistas.

Gracias al auge de los LLM, la incorporación de palabras y frases se ha vuelto común y se comprenden relativamente bien. Pero, ¿cómo funciona la incrustación de canciones y qué problema resuelven? El resto de esta publicación se centra en cómo el audio se convierte en una entrada de modelo, qué opciones arquitectónicas codifican las características musicales, cómo el aprendizaje contrastivo da forma a la geometría del espacio de incrustación y cómo un sistema de recomendación de canciones que utiliza una incrustación podría funcionar en la práctica.

¿Cómo se convierte el audio en una entrada a una red neuronal?

Los archivos de audio sin formato, como MP3, son fundamentalmente una forma de onda: una serie de tiempo que varía rápidamente. Es posible aprender de estos archivos, pero normalmente consume muchos datos y es costoso desde el punto de vista computacional. Podemos convertir archivos .mp3 en espectrogramas mel, que son mucho más adecuados como entradas para una red neuronal.

Los espectrogramas Mel son una forma de representar el contenido de frecuencia de un archivo de audio a lo largo del tiempo, adaptado a cómo los humanos perciben el sonido. Es una representación 2D donde el eje x corresponde al tiempo, el eje y corresponde a bandas de frecuencia en escala mel y cada valor representa la energía en escala logarítmica en esa banda en ese momento.

Conversión de archivos wave sin formato a espectrogramas mel
(Diagrama generado por el autor utilizando las herramientas de generación de imágenes de OpenAI)

Los colores y formas que vemos en un espectrograma de mel pueden brindarnos información musical significativa. Los colores más brillantes indican mayor energía en esa frecuencia y tiempo y los colores más oscuros indican menor energía. Las bandas horizontales delgadas indican tonos sostenidos y a menudo corresponden a notas sostenidas (voz, cuerdas, pads de sintetizador). Las rayas verticales altas indican energía en muchas frecuencias a la vez, concentradas en el tiempo. Estos pueden representar tambores y palmas.

Ahora podemos empezar a pensar en cómo las redes neuronales convolucionales pueden aprender a reconocer características de estas representaciones de audio. En este punto, el desafío clave es: ¿cómo entrenamos a un modelo para que reconozca que dos extractos de audio breves pertenecen a la misma canción sin etiquetas?

Aprendizaje fragmentado y contrastivo

Antes de pasar a la arquitectura de CNN que hemos utilizado, nos tomaremos un tiempo para hablar sobre cómo cargamos los datos del espectrograma en la red y cómo configuramos la función de pérdida de la red sin etiquetas.

En un nivel muy alto, introducimos los espectrogramas en la CNN, en su interior se produce mucha multiplicación de matrices y luego nos queda un vector de 128 dimensiones que es una representación latente de las características físicas de ese archivo de audio. Pero, ¿cómo configuramos el procesamiento por lotes y la pérdida para que la red pueda evaluar canciones similares?

Comencemos con el procesamiento por lotes. Tenemos un conjunto de datos de canciones (del pequeño conjunto de datos de FMA) que hemos convertido en espectrogramas. Usamos la clase tensorflow.keras.utils.Sequence para seleccionar aleatoriamente 8 canciones del conjunto de datos. Luego, "fragmentamos" aleatoriamente cada espectrograma para seleccionar un rectángulo de 128 x 129 que representa una pequeña porción de cada canción, como se muestra a continuación.

Fragmentación de muestras aleatorias de 8 espectrogramas de mel
(Diagrama generado por el autor utilizando las herramientas de generación de imágenes de OpenAI)

Esto significa que cada lote que alimentamos a la red tiene la forma (8, 128, 129, 1) (tamaño de lote, dimensión de frecuencia mel, fragmento de tiempo, dimensión del canal). Al alimentar fragmentos de canciones en lugar de canciones completas, el modelo verá diferentes partes de las mismas canciones a lo largo de las épocas de entrenamiento. Esto evita que el modelo se sobreajuste a un momento específico en cada pista. El uso de muestras breves de cada canción anima a la red a aprender la textura musical local (timbre, densidad rítmica) en lugar de una estructura de largo alcance.

A continuación, utilizamos un objetivo de aprendizaje contrastivo. La pérdida de contraste fue introducida en 2005 por Chopra et al. aprender un espacio de incrustación donde los pares similares (pares positivos) tienen una distancia euclidiana baja y los pares diferentes (pares negativos) están separados por al menos un cierto margen. Estamos utilizando un concepto similar al hacer uso de la pérdida de InfoNCE.

Creamos dos "vistas" estocásticas de cada lote. Lo que esto realmente significa es que creamos dos aumentos del lote, cada uno con ruido aleatorio y normalmente distribuido. Esto se hace de forma sencilla, con la siguiente función:

@tf.function def augment(x): """Pequeño ruido de tiempo-frecuencia.""" ruido = tf.random.normal(shape=tf.shape(x), media=0.0, stddev=0.05) return tf.clip_by_value(x + ruido, -80.0, 0.0) # rango de mel dB generalmente -80–0

Las incrustaciones de la misma muestra de audio deben ser más similares entre sí que las incrustaciones de cualquier otra muestra del lote.

Entonces, para un lote de tamaño 8, calculamos la similitud de cada incrustación de la primera vista y cada incrustación de la segunda vista, lo que da como resultado una matriz de similitud de 8 × 8.

Definimos los dos lotes aumentados normalizados L2 como [z_i, z_j in mathbb{R}^{N times d} ]

Cada fila (una incrustación de 128-D, en nuestro caso) de los dos lotes está normalizada en L2, es decir,

[ Vert z_i^{(k)} Vert_2 = 1 ]

Luego podemos calcular la similitud de cada incorporación de la primera vista y cada incorporación de la segunda vista, lo que da como resultado una matriz de similitud NxN. Esta matriz se define como:

[ S = frac{1}{tau} z_i z_j^T ]

Donde cada elemento de S es la similitud entre la incorporación de la canción k y la incorporación de la canción l en ambos aumentos. Esto se puede definir por elementos como:

[
S_{kl} = frac{1}{tau} langle z_i^{(k)}, z_j^{(l)} rangle
= frac{1}{tau} cos(z_i^{(k)}, z_j^{(l)})
]

Donde tau es un parámetro de temperatura. Esto significa que las entradas diagonales (la similitud entre fragmentos de la misma canción) serán los pares positivos y las entradas fuera de la diagonal serán los pares negativos.

Luego, para cada fila k de la matriz de similitud, calculamos:

[
ell_k =log
frac{exp(S_{kk})}{sum_{l=1}^{N} exp(S_{kl})}
]

Esta es una pérdida de entropía cruzada softmax donde el numerador es la similitud entre los fragmentos positivos y el denominador es la suma de todas las similitudes en la fila.

Finalmente promediamos la pérdida sobre el lote, dándonos el objetivo de pérdida total:

[
l =
frac{1}{N}
sum_{k=1}^{N}
izquierda(registro
frac{
expizquierda(
frac{1}{tau}
langle z_i^{(k)}, z_j^{(k)} rangle
bien)
{}
sum_{l=1}^{N}
expizquierda(
frac{1}{tau}
langle z_i^{(k)}, z_j^{(l)} rangle
bien)
}
bien)
]

Minimizar la pérdida de contraste alienta al modelo a asignar la mayor similitud a las vistas aumentadas coincidentes y, al mismo tiempo, suprime la similitud con todas las demás muestras del lote. Esto simultáneamente acerca las representaciones del mismo audio y aleja las representaciones de diferentes audios, dando forma a un espacio de incrustación estructurado sin requerir etiquetas explícitas.

Esta función de pérdida se describe claramente mediante la siguiente función de Python:

def contrastive_loss(z_i, z_j, Temperature=0.1): """ Calcula la pérdida de InfoNCE entre dos lotes de incrustaciones. z_i, z_j: (batch_size, embedding_dim) """ z_i = tf.math.l2_normalize(z_i, axis=1) z_j = tf.math.l2_normalize(z_j, axis=1) logits = tf.matmul(z_i, z_j, transpose_b=True) / etiquetas de temperatura = tf.range(tf.shape(logits)[0]) pérdida = tf.keras.losses.sparse_categorical_crossentropy(labels, logits, from_logits=True) return tf.reduce_mean(pérdida)

Ahora que hemos desarrollado una cierta intuición sobre cómo cargamos lotes en el modelo y cómo minimizar nuestra función de pérdida agrupa sonidos similares, podemos sumergirnos en la estructura de la CNN.

Una arquitectura CNN simple

Hemos elegido una arquitectura de red neuronal convolucional bastante simple para esta tarea. Las CNN se originaron por primera vez con Yann LeCun y su equipo cuando crearon LeNet para el reconocimiento de dígitos escritos a mano. Las CNN son excelentes para aprender a comprender imágenes y hemos convertido cada canción a un formato similar a una imagen que funciona con las CNN.

La primera capa de convolución aplica 32 pequeños filtros en todo el espectrograma. En este punto, la red está aprendiendo principalmente patrones muy locales: cosas como breves estallidos de energía, líneas armónicas o cambios repentinos que a menudo corresponden a inicios de notas o percusión. La normalización por lotes mantiene las activaciones con buen comportamiento durante el entrenamiento, y la agrupación máxima reduce ligeramente la resolución para que el modelo no reaccione exageradamente a pequeños cambios en el tiempo o la frecuencia.

El segundo bloque aumenta la cantidad de filtros a 64 y comienza a combinar esos patrones de bajo nivel en estructuras más significativas. Aquí, la red comienza a captar texturas más amplias, patrones rítmicos repetidos y características tímbricas consistentes. La agrupación vuelve a comprimir la representación manteniendo las activaciones más importantes.

En la tercera capa de convolución, el modelo trabaja con 128 canales. Estos mapas de características tienden a reflejar aspectos de nivel superior del sonido, como el equilibrio espectral general o texturas similares a las de un instrumento. En esta etapa, la posición exacta de una característica importa menos que si aparece o no.

Descripción general de alto nivel de la red neuronal convolucional utilizada
(Diagrama generado por el autor utilizando las herramientas de generación de imágenes de OpenAI)

La agrupación promedio global elimina la estructura de tiempo-frecuencia restante al promediar cada mapa de características hasta un solo valor. Esto obliga a la red a resumir qué patrones están presentes en el fragmento, en lugar de dónde ocurren, y produce un vector de tamaño fijo independientemente de la longitud de entrada.

Luego, una capa densa asigna este resumen a una incrustación de 128 dimensiones. Este es el espacio donde se aprende la similitud: los fragmentos que suenan parecidos deben terminar muy juntos, mientras que los sonidos diferentes se separan.

Finalmente, la incrustación se normaliza en L2 para que todos los vectores se encuentren en la esfera unitaria. Esto hace que la similitud del coseno sea fácil de calcular y mantiene constantes las distancias en el espacio de incrustación durante el entrenamiento contrastivo.

En un nivel alto, este modelo aprende sobre música de la misma manera que una red neuronal convolucional aprende sobre imágenes. En lugar de píxeles ordenados por altura y ancho, la entrada aquí es un espectrograma mel ordenado por frecuencia y tiempo.

¿Cómo sabemos que el modelo es bueno?

Todo lo que hemos hablado hasta ahora ha sido bastante abstracto. ¿Cómo sabemos realmente que las representaciones del espectrograma mel, la arquitectura del modelo y el aprendizaje contrastivo han hecho un trabajo decente en la creación de incorporaciones significativas?

Una forma común de entender el espacio de incrustación que hemos creado es visualizar el espacio en una dimensión inferior, uno que los humanos realmente puedan visualizar. Esta técnica se llama reducción de dimensionalidad y es útil cuando se intenta comprender datos de alta dimensionalidad.

Representación PCA de incorporaciones aprendidas.
(Imagen del autor)

Dos técnicas que podemos utilizar son PCA (análisis de componentes principales) y t-SNE (incrustación de vecinos estocásticos distribuidos en t). PCA es un método lineal que preserva la estructura global, lo que lo hace útil para comprender la forma general y las principales direcciones de variación en un espacio de incrustación. t-SNE es un método no lineal que prioriza las relaciones de vecindad local, lo que lo hace mejor para revelar pequeños grupos de puntos similares pero menos confiable para interpretar distancias globales. Como resultado, PCA es mejor para evaluar si un espacio de incrustación es coherente en general, mientras que t-SNE es mejor para verificar si elementos similares tienden a agruparse localmente.

Como se mencionó anteriormente, entrené esta CNN utilizando el pequeño conjunto de datos de FMA, que contiene etiquetas de género para cada canción. Cuando visualizamos el espacio de incrustación, podemos agrupar géneros, lo que nos ayuda a hacer algunas afirmaciones sobre la calidad del espacio de incrustación.

Las proyecciones bidimensionales ofrecen vistas diferentes pero complementarias del espacio de incrustación aprendido. Ninguna de las tramas muestra grupos de géneros perfectamente separados, lo cual es esperado y realmente deseable para un modelo de similitud musical.

En la proyección PCA, los géneros están muy mezclados y forman una forma suave y continua en lugar de grupos distintos. Esto sugiere que las incrustaciones capturan diferencias graduales en características musicales como el timbre y el ritmo, en lugar de memorizar etiquetas de género. Debido a que PCA preserva la estructura global, esto indica que el espacio de incorporación es coherente y está organizado de manera significativa.

La proyección t-SNE se centra en las relaciones locales. Aquí, es más probable que las pistas del mismo género aparezcan cerca unas de otras, formando grupos pequeños y sueltos. Al mismo tiempo, todavía existe una importante superposición entre géneros, lo que refleja el hecho de que muchas canciones comparten características que trascienden las fronteras de los géneros.

Representación t-SNE de incorporaciones aprendidas.
(Imagen del autor)

En general, estas visualizaciones sugieren que las incorporaciones funcionan bien para tareas basadas en similitudes. PCA muestra que el espacio está globalmente bien estructurado, mientras que t-SNE muestra que canciones localmente similares tienden a agruparse, las cuales son propiedades importantes para un sistema de recomendación musical. Para evaluar más a fondo la calidad de las incrustaciones, también podríamos observar métricas de evaluación relacionadas con las recomendaciones, como NDCG y Remember@k.

Convertir el proyecto en una aplicación de recomendación musical utilizable

Por último, dedicaremos un tiempo a hablar sobre cómo podemos convertir este modelo entrenado en algo utilizable. Para ilustrar cómo se podría utilizar una CNN como esta en la práctica, he creado una aplicación web de recomendación de canciones muy sencilla. Esta aplicación toma un archivo MP3 cargado, calcula su incrustación y devuelve una lista de las pistas más similares según la similitud del coseno. En lugar de tratar el modelo de forma aislada, diseñé el proceso de principio a fin: preprocesamiento de audio, generación de espectrograma, inferencia de incorporación, búsqueda de similitudes y presentación de resultados. Esto refleja cómo se usaría un sistema de este tipo en la práctica, donde los modelos deben operar de manera confiable con entradas invisibles en lugar de conjuntos de datos seleccionados.

Las incorporaciones del pequeño conjunto de datos de FMA se calculan previamente y se almacenan fuera de línea, lo que permite generar recomendaciones rápidamente utilizando la similitud de cosenos en lugar de ejecutar el modelo repetidamente. Las incrustaciones a nivel de fragmento se agregan en una única representación a nivel de canción, lo que garantiza un comportamiento consistente para pistas de diferentes duraciones.

El resultado final es una aplicación web liviana que demuestra cómo se puede integrar una representación aprendida en un flujo de trabajo de recomendación real.

Esta es una representación muy simple de cómo se podrían usar las incrustaciones en un sistema de recomendación real, pero no captura la imagen completa. Los sistemas de recomendación modernos combinarán incorporaciones de audio y filtrado colaborativo, como se mencionó al principio de este artículo.

Las incrustaciones de audio capturan cómo suenan las cosas y el filtrado colaborativo captura a quién le gusta qué. Una combinación de los dos, junto con modelos de clasificación adicionales, se puede combinar para crear un sistema híbrido que equilibra la similitud acústica y el gusto personal.

Fuentes de datos e imágenes

Este proyecto utiliza el conjunto de datos FMA Small, un subconjunto disponible públicamente del conjunto de datos Free Music Archive (FMA) presentado por Defferrard et al. El conjunto de datos consta de clips musicales cortos publicados bajo licencias Creative Commons y se utiliza ampliamente para investigaciones académicas en recuperación de información musical.

Todos los diagramas esquemáticos de este artículo fueron generados por el autor utilizando herramientas de generación de imágenes asistidas por IA y se utilizan de acuerdo con los términos de la herramienta, que permiten el uso comercial. Las imágenes fueron creadas a partir de indicaciones originales y no hacen referencia a obras protegidas por derechos de autor, personajes de ficción ni personas reales.