They say first impressions are everything. When you meet somebody, after name and occupation -- if you're American, anyway -- you get to talking, learning about that person, asking and answering questions. If you're paying attention, the conversation starts to naturally flow from one topic to the next.
Inevitably, you ask, or are asked, "So, what kind of music do you like?"; this is the first thing we ask when you sign up with one of Vevo's apps. This conversation is the fundamental mechanic driving the new Vevo first time user experience. We want to get to know you, and we want you to get to know us.
"So, what kind of music do you like?"
The world of music is huge, of course, and the world of music videos is commensurate: Vevo's catalog offers over 175,000 music videos across more than 60,000 artists. To get the conversation started, the first thing we ask you are broad questions about genres you're interested in. Genres aren't perfect -- music tastes are naturally complex and cross numerous genres and sub-genres -- but they are good enough to get the ball rolling. After asking "what do you like?" we enter the next phase of the conversation: "who do you like?" Based on your genre choices, we set the stage with a first round of artist recommendations that are timely, hand-picked artists chosen by our editorial team.
After the first round of editorially-driven artists, the recommendation phase begins -- that is, the conversation continues -- and we continue the Q&A about who you like, with every ♥ you express driving our process choosing which artists you're presented as you progress.
This reboot of the first time user experience is one of a number of user-facing steps we've taken toward ubiquitous personalization across all our apps. Starting with a good conversation about what you like says "we're listening" and is part of a greater strategy that sets the stage to generate strong signals that drive a brand-new personalized Vevo experience.
"That's great. How are you doing this?"
Opening Act: Data
Recommendations require at least some form of the following: a catalog of things you want to recommend, meaningful relationships between those things, and some guiding preferences that fit with the relationships between the things.
In our case, the "catalog of things" and guiding preferences are straightforward: the catalog is our artists, and your preferences are the ♥ signals you send us as you progress through each round of recommendations.
One piece of functionality Vevo's apps have had for a long time is the ability to create music video playlists, and it's been popular: over 10 million have been created to date. This data is tractable and of enough volume to begin to capture relationships between artists. Looked at as a whole, these artist-to-artist relationships form by way of the aggregate activity of millions of people creating and using millions of playlists: people making video mixtapes for rainy days, friday nights, being sad, in love, crazy, and crazy in love. You know, human stuff. The stuff music is about. These are the last piece of the puzzle: meaningful relationships between the things in our catalog that fit with your guiding preferences.
To turn these playlists into meaningful relationships in the form of usable data, we built a process to go through each list and, for each coincident artist on a given playlist, build and strengthen ties between them, eventually creating a weighted network of related artists driven by the people who enjoy them. As the process progresses, the aggregate of these individual artist-to-artist relationships form, metaphorically speaking, little neighborhoods, then small towns, cities, and so on. Another way to think of it might be as a "fan-defined artist social graph". The final step in creating this relationship graph is to prune edges that do not meet a certain relationship strength, and finally remove any completely disconnected artists as a result of that pruning. This lets us ask better questions about what and who you like, and to a lesser extent, though still important, ensures we keep computation requirements for the algorithm we apply to this artist graph in bounds.
One of my favorite aspects of graphs is their intuitive visual nature, so let's take a short tour:
View from space:
Great, but a 0 point font is not inviting. Let's take a look at some neighborhoods, towns & cities:
The glorious 80s:
The differently glorious 90s:
From Lil' Wayne to 2 Chainz
I don't know anything about country music except what you see here:
Rihanna, Beyoncé & Lady Gaga:
Headliner: ♥ Heart Algorithmia
Now that we've got ourselves a catalog of artists, meaningful relationships between them, and guiding preferences in the form of an evolving set of artist "like" signals (we ♥ your ♥'s) generated by interacting with each round of recommendations, let's talk about how we turn this trio into the actual artist recommendations, refining the choices and direction based on past inputs. Put another way, with each round of recommendations, how can we take an evolving set of ♥ signals into consideration?
For some time now, when working with conceptually similar problems and data sets, I've been struck with the idea of modeling systems of this nature (evolving relationships, evolving criteria) based roughly on a circuit (i.e., flow) simulation. Earlier I mentioned we keep track of how many times artists appear on playlists together when building the graph, implying that appearing together constitutes an edge between two vertices (artists). Consider that edge a resistance wire connecting two artists. Instead of that edge having "weight", let's say the wire embodies "conductivity"; i.e. the more two artists appear together, the lower the "resistance" (and therefore the higher the conductivity) between them. Next, as you progress through each round of recommendations, artists you ♥ are assigned as "sources", tying them to a positive voltage. After that, vertices are selected to act as "sinks", tying them to "0 volts", based on a selection process that uses, in large part, genre preferences; e.g., if you chose "Alternative" and "Rap" the algorithm might choose Nine Inch Nails and Too $hort for "sink" vertices.
Modeling the problem in this way supports a graph scoring algorithm based on an approximate solution to Kirchhoff's current law combined with Ohm's law: for each simulation step, update the voltage of each vertex (artist) according to the weighted average (via edge, or wire, conductivity) of the voltages of its neighbors. Without regard to specific graph configurations (e.g., directed vs. undirected, allowing self-loops or not, etc.), here is an outline of the scoring process which is based on the Jung graph library's VoltageScorer):
for each simulation step: for each vertex v in graph G: if v is a source vertex: set output voltage to source voltage else if v is a sink vertex: set output voltage to 0 else: voltage_sum = 0 weight_sum = 0 for each inbound edge (u, v): weight = edge (u, v) weight voltage_sum += current voltage of u * weight weight_sum += weight if voltage_sum == 0 or weight_sum == 0: set output voltage to 0 else: set output voltage to voltage_sum / weight_sum
At the end of some number of simulation steps, collect vertices with significant voltages (in practice, because of precision and the number of simulation steps chosen, "significant" means either non-zero or some very small value relative to your "source" voltages) , sort them in descending order by voltage, filter for artists that have already been seen, not available, active, etc. Finally, slice however many results off the top, and you've got one round of recommendations.
This approach has some nice characteristics: it responds well to an evolving set of inputs, it can deal with a changing graph without obscene preprocessing (playlists are created, and updated, constantly, so we emit events from the playlist storage layer and consume them elsewhere, updating the underlying graph data), the simulation is computationally efficient enough with a reasonably pruned graph, and results are good with a low number of simulation steps (we A/B test!), and by virtue of it being a stepped simulation, we can choose to scale back the number of steps (resulting in lower latencies) at the expense of slightly rougher results, if there is a tactical need to do so (e.g., a trivial example would be to accommodate acute load while new machines come online).
Just for fun: the video below is what the graph looks like during a single user's session. Time is sped up several times over, stepped in constant intervals, and voltage of a given vertex is indicated by label size:
A/B testing with our previous onboarding artist selection process (which was driven almost solely by the week's "Top 40" artists) shows significant positive changes across the typical KPIs (number of artists liked, etc.), with the added benefits of getting more data to contribute to a user's "taste profile", as well as exposing people to a much more diverse set of artists that not only align with their preferences but also showcase the breadth and depth of our catalog.
Engineer? Love music? We've got the best singular catalog of music videos on the planet, great people, and we're hiring!
This article was written by John Muellerleile, Staff Engineer - Data & Analytics