Related Pins at Pinterest: The Evolution of a Real-World Recommender System.
В далеком 2013-м году два инженера из Пинтереста за три недели склепали первую версию рексистемы для рекомендаций похожих пинов: взяли Pin-Board граф, посчитали мапредьюсом совстречаемости пинов, положили результаты в kv-хранилище. Через два года под развитие этого модуля выделили отдельную команду, и к моменту, когда в 2017-м году была опубликована обсуждаемая статья, уже 40% всех показанных и сохраненных пинов атрибуцировалось рекомендациям похожих пинов.
Что было сделано:
1. Перешли на случайные блуждания (Pixie) вместо мапредьюсного подсчета совстречаемостей. Вдохновлялись наработкой Твиттера аж 2013-го года, WTF: The Who to Follow Service at Twitter. Как минимум забустили качество для более редких, "тяжелохвостовых" пинов, у которых не набиралось достаточное количество соседей в своих бордах.
2. Добавили ранжирование:
* вырастили клики и сохранения пинов на 30% с помощью линейной модели над девятью фичами, использующей только характеристики query/candidate пинов (эмбеды текстов, картинки, категории, etc)
* добавили персонализацию: историю пользователя, соцдем, etc
* перешли на градиентный бустинг: это позволило упростить препроцессинг фичей (нормализацию, бакетизацию, etc), а также дало возможность добавлять query-level фичи
* пересели на pointwise (!) лосс вместо pairwise
* spoiler: позже они перейдут на ранжирующую нейросеть, о чем я рассказывал в посте про эволюцию ранжирования в Pinterest
3. Увеличили полноту/разнообразие кандидатогенерации, добавив больше источников кандидатов:
* Pin2Vec: word2vec над сессиями пользователей, эмбеды пинов из которого используются в ANNS
* поисковые кандидаты: ходят с текстовыми аннотациями query-пина в свой текстовый поиск, и с картинкой в визуальный; помогло с холодным стартом
* "срезовые" кандидатогенераторы: выделили отдельные кандидатогенераторы для более специфичных срезов пинов (e.g. свежие, региональные пины)
4. Про проблемы:
* фидбек луп: не получалось побить продовую ранжирующую модель, обучаясь на её же фидбеке; выделили для обучения 1% трафика, в котором отобранные кандидаты ранжировались случайно. Получили более хорошие модели, чем на исходном большом трафике
* меморизующие счетчики: была еще такая штука как MemBoost, которая изначально использовалась как прибавка к скору Pin-Board совстречаемости; по сути, это взвешенная сумма счетчиков вида "сколько раз при показе данного кандидата по этому запросу пользователи его сохраняли/кликали/etc". После введения ранжирующей модели стали использовать их в качестве фичей. Заметили, что из-за них сложно проводить АБ — эффекты от оцениваемых изменений прорастают через них в другие сплиты, и обратный эксп тоже нормально не поставишь; но ничего с этим не сделали
* столкнулись с тем, что любое изменение в рексистеме инвалидирует оптимальность всех ее компонентов, и всякие захардкоженные гиперпараметры/константы нужно переподбирать; полечили это автоматизацией — при каждом изменении стараются как можно больше всего автоматически перетюнить
5. Еще чуть про инфру:
* было сложно итерироваться, когда весь стек, включая ранжирование, был оффлайновый; каждое изменение ранжирования/кандгена требовало полный переобход всей базы; покрытие запросов тоже было не очень; в итоге перевели ранжирование и большую часть кандидатогенераторов в онлайн
* передавать по сети туда-сюда сырые данные пинов, чтобы посчитать фичи — затратно, система будет упираться в сеть; поэтому делают шардирование исходной базы кандидатов; на каждом шарде хранятся все сырые данные про пины и сразу считаются все нужные скоры / фичи
Это была краткая историческая сводка из 2017-го года. Что произошло за следующие семь лет? To be continued :)
Post #97
3.68K
- 🔥 48
- ❤ 2
- 👍 2