In Making For You pay more attention to your older likes I tried to address a common complaint about For You - that it was too reactive to recent likes. You like one cat post and your For You is now all cats. The solution was to give less weight to your most recent likes. Specifically, 10x less weight compared to the oldest likes.
Problem solved? Not completely. I still get feedback that the feed is too reactive and not diverse enough.
How do we improve it? If you recall, For You is not an ML powered algorithm - there is no model behind it that makes predictions. Instead, For You uses a graph based heuristic where users and items are nodes and the likes are the edges connecting them:
For You finds people who liked the same posts as you, and shows you what else they’ve liked recently.
As a consequence of this "follow the likes" approach, For You does not "understand" content. It cannot really tell if the posts it comes up with are too similar.
Can we solve this purely from the graph of likes approach? I think so.
What we are looking for is a balance. If you have liked posts on topics A, B and C with the distribution of your likes 20%, 30% and 50%, then what we want is For You to show you a similarly balanced set of posts.
What I don't want is get into the business of topic detection.The Discover feed tries to do that with the embedding model and it constantly conflates wrong topics together. What to do? Imagine that each post you liked is its one topic. And so what we are looking for is that each of your past likes gets ~equal effect on your top N posts in For You. Then if 20% of your likes are about cats and we make them equally represented in For You then you should get ~20% of cats.
The contribution of each item to a recommendation is based on the probability of taking this walk on the graph of likes:
- 1.
from you to one of your 500 most recent likes
- 2.
from that like to one of the other people who liked that post before you
- 3.
from that co-liker to one of the posts they liked afterwards
That final liked post is the post we recommend.
How do we make each seed post like have the same weight? We could get the recommendations, calculate how much weight each source like has and then up-weight the ones that are under-represented and down-weight the over-represented ones.
That would likely be quite inefficient - we would need to keep track of all your seed like contributions (~500) to all recommendations (~100K). And remember, the calculations are done at the time you refresh your feed. The latency is important.
Instead of keeping track of things exactly, we keep a single randomly sampled seed post for every recommendation. This is our "representative seed post". We use the contribution of the seed item to the recommendation's score as the sampling weight. Then we diversify the top N posts based on the representative post: we pick posts with a fresh seed post until we no longer have recommendations with unique seeds and then we restart this process. If your top 30 recommendations (the feed page size used by the standard Bluesky client) all have different representative seed posts then we can probably claim that each of your likes is equally represented.
I implemented that logic in the Playground:
Old logic: https://foryou.club/playground
Enter your username into each and compare the results to see the impact. For my account I see at the top of the recommendations list "33 unique rep seeds" out of top 60 posts with the old logic vs 60/60 with the new logic.
To test whether this is a good idea I'll start an A/B test that will run for a couple of weeks and will share the results. Unless, of course, it shows really bad metrics on day 1. Then I would need to shut down the test and rethink the diversification logic.