Tech Review of Pinterest #3
우리는 매년 열리는 Mad Science Fair에서 개선된 Graph-based Recommendatio system인 Pixie의 최신 정보를 공유하였다. 상세한 정보는 아래의 Video를 통해 확인할 수 있다.
https://www.youtube.com/watch?v=qTfeWt95EmQ
Pinterest가 2억 5천만 명 이상의 사용자를 지님에 따라, 우리는 지속적으로 Pin의 수를 확장하고, 그것들을 관심사가 겹치는 사용자들과 연결하며, 100억 개 이상의 추천을 매일 제공해주고 있다.
이러한 과정을 효율적으로 수행하기 위하여 Pixie를 만들었다. Pixie는 자유도가 높은 graph-based system으로 개인화된 추천을 실시간에 할 수 있도록 해준다. (Pixie 자체에 대한 자세한 내용은 원문에서 살펴볼 수 있다.) Pixie를 설계할 때 목표는 Pinner가 홈 피드를 스크롤하며 탐색할 때, 좁고 관련도 높은 추천을 제공하는 시스템을 만드는 것이었다.
이제 우리는 증가하는 사용자 수에 대해 Pixie를 확장하여 지원하는 방법을 공유하고자 한다. Pixie online이 배포된 이수, 우리는 확률적 측면에서 엄청난 개선이 있었다. Pixie가 있기 이전에는, 대중적으로 인기 있는 content를 Pinner이 좋아할 가능성이 있기 때문에, 그것을 재사용할 필요가 있었다. 하지만 Pixie가 개발되고 나서, 우리는 훨씬 더 효율적으로 관련도 높은 content를 추천해줄 수 있었고, 그 결과 37배가량 참여도가 증가하였다. Content를 추천하는데 덜 인기 있는 content가 포함되어 있었음에도 불구하고, 더 높은 참여도를 보이는 것을 확인할 수 있었다.
Pixie는 graph-based recommendation system으로 random walk를 기반으로 하고 있습니다. 최근에는 Pixie의 random walk와 Graph-based Convolutional Network를 결합하여, PinSAGE라는 새로운 추천 알고리즘을 Pinterest에서 제안하였습니다. 이번 Pixie는 graph를 효율적으로 탐색할 수 있는 방법을 제공함으로써, 더 나은 추천 알고리즘을 만드는데 기반 기술을 제공하고 있다고 할 수 있습니다.
Pinterest의 주요한 추천 시스템으로, Pixie는 우리 제품 전반에 적용되어 있다. Pixie가 얼마나 좋은 아이디어를 당신에게 제공하는지 확인하기 위해, 맛있는 "Healthy Chocolate Strawberry Shake"를 당신이 보드에 저장하였다고 상상해보자.
Visual signal을 바탕으로, Pixie는 "Healthy Chocolate Strawberry Shake"를 바탕으로 다른 스무디나 쉐이크 Pin 10개를 제안하지만, 아직은 당신이 정확하게 어떤 종류의 쉐이크를 원하는지 알 수 없을 것이다. 질의가 점점 복잡해지면서, 당신이 "Healthi Chocolate Muffins"와 "Ultimate Healthy Chocolate Chip Cookies"를 특징으로 하는 Pin도 저장한다는 것을 Pixie는 알게 될 것이다. 그러고 나서 Pixie는 healthy ingredients에 초첨을 맞춘 chocolate, cookie, dessert shake와 관련도가 높은 Pin으로 그 대상을 좁힐 것이다.
사용자는 본인의 아이디어를 찾기 위해서, 제공되는 다양한 Pin들을 통해 자신도 몰랐던 자신의 니즈를 구체화할 것입니다. 그렇기 때문에 대중적으로 인기 있는 Pin을 제공하는 것보다, 각 탐색 과정에 맞는 실시간으로 Personalization 한 Pin을 제공하는 것이 중요하다고 할 수 있습니다.
이제 다시 Home feed로 돌아가면, 당신은 정확히 당신이 보고자 했던 것과 유사한 것을 볼 수 있으며, "Healthy Shakes and Smmothies" 보드에 저장할 수 있다.
오늘날 Pixie는 Pinterest 참여도의 60% 이상을 차지하고 있다. 이 말은 사용자들이 우리의 추천 시스템에 많이 의존하고 있다는 것을 의미한다. 이번에는 이것을 어떻게 하는지 살펴보겠다.
우리는 Pinterest object graph부터 시작하였다. 이 그래프는 Pin들과 Board들 사이의 graph이다. Dataset은 사용자들이 Pin과 보드들을 설명하고 구성하는 방식을 통해 만들어졌기 때문에 매우 특별하다. 이 dataset으로부터, 우리는 두 가지를 알 수 있다. 어떻게 Pin들이 사용자들이 저장하며 추가한 맥랑을 바탕으로 구성되는가, 그리고 사용자들의 관심사는 어떻게 구성되는가. 이것은 수억 명의 사용자들에게, millisecond안에, 수십억 개의 Pin을 개인화하여 추천하는 과제로 연결된다.
이 과제를 해결하기 위해, "Healthy Chocolate Strawberry Shake"로 돌아가 다시 생각해보자. 그리고 "Smoothie", "Strawberries, "Yummm" 세 가지 보드가 있다고 상상해보자.
1750억 개 이상의 Pin에 대하여 우리는 Bipartite graph로 작업하고 있다.
추천 문제의 가장 큰 과제 중 하나는 최고의 Pin을 가장 적절한 사용자에게 최적의 타이밍에 추천해야 하는지 이다. 이 고민에서 Graph-based recommender system이 시작되었다. 우리는 이미 사용자에게 흥미로운 node를 알고 있기 때문에, 그곳에서부터 graph traversal을 시작한다.
그다음 Pixie는 10만 step을 random walk algorithm으로 수행한 이후, 가장 적합한 Pin을 찾는다. 각각의 step에서, Pixie는 random neighbor를 선정하고, 그 노드를 방문하며, node visit count를 증가시킨다. 우리는 또한 확률 alpha를 0.5로 설정하여, node Q에서 너무 멀어지면 다시 시작하게 하였다. 우리는 10만 개의 step을 위해 이웃한 보드와 pin을 무작위로 sampling 하는 작업을 계속 진행한다.
위에 그림에서는 14번, 16번 방문한 노드들이 질의 노드와 가장 밀접한 관련이 있는 노드들이다.
일단 random walk가 완료되면, 우리는 자주 방문한 노드가 query 노드와 가장 관련이 있다는 것을 알 수 있다. Pixie는 데이터가 증가함에 따라, 지속적으로 실시간으로 이 작업을 반복하기 때문에, 우리는 사용자들의 검색 범위를 좁히고 그들이 목적에 맞는 아이디어를 정확히 찾아줄 수 있다.
"Healthy Chocolate Strawberry Shake" 예시는 Pin-to-Pin 추천이다. 하지만 Pixie는 Pin-to-Board, Pin-to-Ads 두 개의 주요 클러스터를 지원한다. 게다가 하나의 시작점 대신에 Pixie는 여러 개의 시작점으로도 동작하며, 서로 다른 시작점에 대해 사용자 action(zooming, 저장 등)을 기반으로 weight를 줄 수 있다.
Pixie가 생겨난 이후로, 우리는 Early Stopping과 같은 우리의 니즈에 맞는 많은 optimization 방법을 개발하였다. 이상적인 상황에서, 우리는 1000개의 최다 방문 노드들을 추출하고 싶었고, 그렇기에 10만 번의 step이 매번 필요하지 않았다. 이것을 수행하기 위해, 최소한 20번 방문하는 1000개의 후보 노드를 추출할 때까지만 walking을 수행하였다. 이러한 최적화 과정을 통해, 우리는 2배의 속도 향상을 이루었다.
또 다른 optimization 방법은 graph pruning이다. 전체 Pinterest graph는 100억 개의 edge를 지니고 있다. 이 edge들은 우리가 실제로 모두 사용하지는 않기 때문에 우리의 니즈에 맞추어 적당히 일부를 제거할 수 있다. Graph를 Pruning 하기 위해, 우리는 Pin이 가질 수 있는 이웃의 수를 제한하는 기능을 구현함으로써 인기 있는 Pin이 가지는 효과를 축소하였다. 우리는 또한 실수로 잘못된 보드에 저장된 것을 사용자에 앞서 pruning 할 수 있다. 마지막으로, 서로 다른 다양한 idea를 지닌 board들을 제거함으로써 optimization 할 수 있다.
Pinterest에는 너무나 많은 Pin들이 있습니다. 그 Pin들 중 본인에게 가장 적합한 개인화된 Pin을 찾게 해주는 것이 Pinterest의 진정한 가치라고 할 수 있습니다. 그렇게 때문에 실시간 Serving이 되지 않는다면, 그 가치를 잃게 될 것입니다. Pinterest에서는 다양한 Optimization Technique를 적용함으로써 Pinterest의 가치를 더 잘 제공할 수 있습니다. Modeling 뿐 아니라, 성능을 너무 많이 감소시키지 않는 범위에서 Optimization Technique를 연구하는 것은 실제 서비스에 있어 중요하다는 생각이 듭니다.
이제는 어떻게 실제로 만드는지 살펴보자.
궁극적인 목표는 전체 Pinterest graph를 메모리에 맞추는 것이다. 분명 전체 1000억 개의 edge를 RAM에 맞출 수 없고, 우리는 일단 pruining 한 200억 개의 edge를 맞추기로 하였으며, 그 크기는 150GB이다.
Hive Job을 사용함으로써 graph compilation process로 데이터를 끌어낼 수 있고, graph compilation machine을 통해 원형의 데이터를 콤팩트한 서빙 형태로 변경할 수 있다. 일단 데이터가 machine에 들어오면, 우리는 random walk 요청을 할 수 있다.
Pixie는 사용하기 쉽고, 실시간으로 개인화가 가능하게 때문에 좋은 방법론이다. Pinterest를 사용하는 사용자들은 더 좋은 아이디어를 찾기 위해, 개인화되는 것을 기대하고 있다. Pixie는 다양한 종류의 task에 대하여 쉽게 일반화할 수 있기 때문에, 많은 종류의 graph를 만들거나, 다른 object를 추천하거나, 절대적으로 올바른 content를 탐색하는 방향으로 튜닝하는 것이 가능하다.
이 글은 아래의 원문을 번역/의역 및 요약하였습니다. 중간중간 파란색으로 표시된 글씨는 번역자의 견해입니다.
지난 리뷰 보기
https://brunch.co.kr/@andrewhwan/59