class: center, middle, inverse # Build Your Own Music Recommender by Modeling Internet Radio Streams ### Vicente Dragicevic --- class: center, middle, inverse # Contextualización --- # Contextualización Sistemas recomendadores usualmente utilizan: * Feedback de usuarios * Contenido * Tags asignados por usuarios ("wisdom of the crowd") --- # Contextualización Recomendación de música suele hacerse con filtrado colaborativo. Limitaciones: * Es necesario tener muchos datos * Incluso si tenemos los datos es difícil modelar ítems nuevos (*cold-start*) --- # Objetivo Crear un modelo que utilice datos de estaciones de radio online. * Sistema recomendador probabilístico * No se necesitan ratings explícitos * Modelo captura dinámicas temporales: * Distintas canciones según la hora * Relación entre canciones que se tocan juntas * Relaciona canciones de un mismo artista --- class: center, middle, inverse # Estaciones de radio como fuente de datos --- # Estaciones de radio como fuente de datos * En vez de usar *"wisdom of the crowd"*, tenemos acceso a playlists creadas por "expertos". * Cantidad de estaciones crece continuamente * Cantidad de datos sobre canciones crece continuamente * Miles de estaciones -> diversidad * Fácil de obtener y parsear --- class: center, middle, inverse # Datos utilizados --- # Datos utilizados * 15 días * canción, artista, timestamp * 3,541 estaciones * 563,417 canciones diferentes * 96,681 artistas diferentes * 6,727,692 tocadas --- class: center, middle, inverse # Modelación --- # Modelación Dada una estación $s$ y un *timestamp* $t$ queremos poder rankear cada canción $i$ según cierta *afinidad*. -- .center[**¡Pero no tenemos ratings!**] --- # Modelación ## Lo que tenemos $P_s$: lista de canciones tocadas por la estación $s$ con sus respectivos *timestamps*. -- ## Lo que queremos Modelo de vectores de factores latentes ($\Theta$): -- * estaciones: $v\_{s}$ -- * canciones y artistas: $p\_{i}$ -- * canciones + info de artistas: $q\_{i} = p\_{i} + p_{a(i)}$ -- * biases: $b\_{i} = c\_{i} + c_{a(i)}$ --- # Modelación .center[**¿Y los usuarios?**] -- .center[Usuarios == Estaciones] --- # Modelación ### Afinidad: .center[$r_{si;t}$: afinidad de item $i$ para estación $s$ en tiempo $t$] --- # Modelando la afinidad Primera aproximación: $$r_{si;t} = b_i + q_i^Tv_s$$ * En factorización matricial se minimiza un error. * Aquí maximizamos la probabilidad de observar $i$ dados $s$ y $t$. -- Pero podemos mejorar: * Tipo de canciones cambian según la hora del día * Canciones tocadas juntas suelen estar relacionadas --- # Modelación Dividimos el día en *slots* (12am-3am, 3am-6am, ...): -- $slot(t)$: entero que corresponde al *slot* en el que cae el tiempo $t$. -- $v_s^{slot(t)}$: vector de factores latentes de la estación $s$ en el tiempo $t$. -- $P_s^{(t,w)}$: lista de canciones tocadas en $s$ en el intervalo $[t - w, t)$. -- Estos items son representados por el vector ${1 \over \sqrt{|P\_s^{(t,w)}|}}\sum\_{j \in P_s^{(t,w)}}q_j$ -- La afinidad queda: $$r\_{si;t} = b\_i + q\_i^T\left(v\_s+v\_s^{slot(t)}+{1 \over \sqrt{|P\_s^{(t,w)}|}}\sum\_{j \in P_s^{(t,w)}}q_j\right)$$ --- # Modelación Queremos modelar usuarios/estaciones nuevos sin tener que re-entrenar el modelo. -- ### Problema: $v_s$ es un parámetro obtenido al entrenar el modelo. -- Podemos representar $s$ a través de su playlist $P\_s$, reemplazando $v\_s$ por ${1 \over \sqrt{|P\_s|}}\sum\_{j \in P\_s}q\_j$ -- ### 2 opciones: -- * Modelo **station-based** -- * Modelo **station-less** --- # Modelación #### Modelo station-based -- * Entrenamos el modelo en base a la afinidad original -- * Para nuevos usuarios/estaciones usamos una fórmula de afinidad distinta: -- $$r\_{si;t} = b\_i + q\_i^T\left({1 \over \sqrt{|P\_s|}}\sum\_{j \in P\_s}q\_j+{1 \over \sqrt{|P\_s^{(t,w)}|}}\sum\_{j \in P\_s^{(t,w)}}q\_j\right)$$ --- # Modelación #### Modelo station-less: -- En vez de representar cada item $i$ con el vector $p_i$, lo representamos con 3 vectores según los roles que asume en la función de afinidad: -- * $p_i^{(1)}$: siendo recomendado -- * $p_i^{(2)}$: en la representación de una estación -- * $p_i^{(3)}$: en la representación de un intervalo de tiempo -- $$r\_{si;t} = b\_i + {(q\_i^{(1)})}^T\left({1 \over \sqrt{|P\_s|}}\sum\_{j \in P\_s}q\_j^{(2)}+{1 \over \sqrt{|P\_s^{(t,w)}|}}\sum\_{j \in P\_s^{(t,w)}}q\_j^{(3)}\right)$$ --- # Modelación #### Modelo station-less: * Estaciones representadas indirectamente * Se puede calcular afinidad para nuevos usuarios/estaciones trivialmente * Más parámetros -> entrenamiento más lento --- class: center, middle, inverse # Entrenamiento --- # Entrenamiento Se modela el *likelihood* de observar $i$ en la estación $s$ en el tiempo $t$ como una *multinomial logistic regression* (predice probabilidades de observar cada outcome de una variable con una distribución categórica): -- $$P(i|s;t,\Theta)={\exp(r\_{si;t}) \over \sum\_j{\exp(r_{sj;t})}}$$ -- Los parámetros ($\Theta$) que se aprenden en el modelo intentan maximizar el *log-likelihood* de observar los items del set de entrenamiento: -- $$L(S;\Theta) = \sum\_{P\_s \in S} \sum\_{(i,t) \in P\_s} \log P(i|s;t,\Theta)$$ --- # Entrenamiento ## Ascenso de Gradiente Estocástico (SGA) Dado un dato de entrenamiento $(s,i,t)$ actualizamos cada parámetro $\theta \in \Theta$: $$\Delta\theta=\eta {\partial P(i|s;t) \over \partial\theta}=\eta\left({\partial r\_{si;t} \over \partial\theta} - \sum\_j P(j|s;t) {\partial r\_{si;t} \over \partial\theta}\right)$$ --- class: center, middle, inverse # Experimentos --- # Experimentos Casos de evaluación: 1. Weak Generalization (estaciones existentes): * Cada estación se divide 75:25 (según timestamp) -- 2. Strong Generalization (nuevos usuarios/estaciones): * Conjuntos disjuntos de estaciones completas 75:25 -- * El 25% se divide 75:25 (subsets de training/testing) -- 3. Cross-source learning: * Modelo entrenado con IRDB * Se intenta predecir YMDB (KDD-Cup'11) * 6+ años entre los datasets --- # Experimentos Se comparan resultados con: * Popularity -- * Género: para cada estación se computa la distribución del género. El score para un item se basa en la probabilidad media que sus géneros reciben en la estación respectiva. -- * k-Means: en vez de usar géneros explicitamente, se calculan clusters y estos se tratan como los géneros de cada canción. (1000 clusters) --- # Experimentos ### Métrica (KDD-Cup'11) * Para cada item del set de testing se elige un item que no haya sido tocado, aleatoriamente -- * Se usa el modelo para rankear ambos items, y se espera que el item que si fue tocado obtenga un rating mayor al otro -- * La fracción de pares rankeados satisfactoriamente es el valor de la métrica -- ### 3 variantes 1. NonRepeat-vs-Uni 2. NonRepeat-vs-Pop 3. Played-vs-Pop --- class: center, middle, inverse # Resultados --- # Resultados: Weak Generalization | Método | 1 | 2 | 3 | |:---------------:|--------|--------|--------| | Popularity | 65.12% | 39.91% | 50.26% | | Genre | 78.41% | 73.89% | 79.33% | | K-Means | 74.61% | 72.83% | 82.80% | | station-based | 90.91% | 87.38% | 95.72% | | station-less | **91.41%** | **88.66%** | **95.95%** | --- # Resultados: Strong Generalization | Método | 1 | 2 | 3 | |:---------------:|--------|--------|--------| | Popularity | 65.24% | 34.59% | 49.94% | | Genre | 78.70% | 74.86% | 80.21% | | K-Means | 74.37% | 72.83% | 83.99% | | station-based | **90.38%** | 86.96% | 91.90% | | station-less | 90.23% | **87.98%** | **92.56%** | --- # Resultados: Cross-Source learning * En YMDB no hay items repetidos para un mismo usuario, por lo que no se evalúa Played-vs-Pop. -- * Para comparar, se agrega el modelo station-based pero entrenado en YMDB -- | Método | 1 | 2 | |:---------------:|--------|--------| | Trained-on-YMDB | 96.33% | 82.85% | | Popularity-on-YMDB | 93.18% | 46.95% | | Genre | 78.22% | 75.19% | | K-Means | 63.94% | 59.99% | | station-based | 91.25% | 77.14% | | station-less | 90.79% | 75.13% | --- # Resultados: extra ### Similaridad entre artistas Usando *cosine similarity* entre vectores de factores latentes de items, el modelo puede identificar artistas pertenecientes a una banda. ##### Ejemplo: artistas más similares a "The Beatles" -- | Rank | Artista | Puntaje de similaridad| |:------:|:---------:|:-----------------------:| | 1 | Paul McCartney | 0.927 | | 2 | John Lennon | 0.925 | | 3 | George Harrison | 0.920 | | 4 | Ringo Starr | 0.916 | --- class: center, middle, inverse # That's all folks!