스포티파이 알고리즘, 추천 시스템이 사용자를 학습하는 방식
Engineering
스포티파이 알고리즘은 사용자가 인지하지 못하는 사이에 매일 매시간 작동합니다. 디스커버 위클리, 데일리 믹스, 라디오 기능 모두 이 알고리즘의 산출물입니다. 음악 추천은 단순한 비슷한 곡 매칭이 아니라 머신러닝, 자연어 처리, 강화학습이 복합적으로 결합된 시스템입니다. 스포티파이 공식 연구 블로그가 공개한 자료를 바탕으로, 이 알고리즘이 어떻게 작동하는지 단계별로 정리합니다.
1. 협업 필터링과 콘텐츠 기반 필터링의 결합
스포티파이 알고리즘의 두 축은 협업 필터링과 콘텐츠 기반 필터링입니다. 협업 필터링은 비슷한 청취 이력을 가진 사용자들의 데이터를 비교해 추천을 만듭니다. 사용자 A와 B가 X, Y, Z 곡을 모두 좋아했고 C가 X, Y만 좋아했다면, C에게 Z를 추천하는 방식입니다. 이 방법은 직관적이지만 새로 발매된 곡이나 청취 데이터가 부족한 곡을 추천하기 어려운 콜드 스타트 문제가 있습니다.
콘텐츠 기반 필터링은 이 문제를 보완합니다. 곡 자체의 특성을 분석해 추천에 활용하는 방식입니다. 스포티파이 알고리즘은 새로 업로드된 곡의 메타데이터, 오디오 신호, 가사, 관련 웹 콘텐츠를 모두 분석합니다. 협업 데이터가 전혀 없는 신곡도 비슷한 음향 특성을 가진 인기곡과 연결되어 추천 후보에 오를 수 있습니다. 두 방식의 결합이 추천 정확도와 신곡 발굴을 동시에 가능하게 합니다.
최근 연구는 대형 언어 모델을 도입해 추천을 개인화된 내러티브로 확장하고 있습니다. 스포티파이 연구 블로그가 공개한 LLM 기반 추천 사례는 사용자에게 곡을 단순 제안하는 대신, 왜 그 곡을 추천하는지를 자연어로 설명하는 방향을 보여줍니다. 사용자는 자기 취향을 더 잘 이해하게 되고, 알고리즘은 사용자의 반응에서 새로운 학습 신호를 얻습니다.
두 필터링 방식의 결합은 가중치 문제로 이어집니다. 새 사용자에게는 콘텐츠 기반 필터링의 비중을 높이고, 데이터가 충분히 쌓인 기존 사용자에게는 협업 필터링의 비중을 높이는 식의 조정이 필요합니다. 이 가중치는 고정값이 아니라 사용자의 청취 이력 길이, 선호 다양성, 활동 빈도에 따라 동적으로 변합니다. 스포티파이 알고리즘이 같은 사용자에게도 시기에 따라 다른 추천 패턴을 보이는 이유 중 하나입니다.
2. 오디오 특성 추출과 곡 표현
스포티파이 알고리즘이 곡을 이해하는 방식은 단순한 장르 태그 그 이상입니다. 모든 곡은 BPM, 키, 음량, 댄서빌리티, 에너지, 발렌스 같은 수십 개의 수치 특성으로 분해됩니다. 발렌스는 곡이 전달하는 감정의 긍정성을 측정하는 지표입니다. 같은 BPM 130의 곡이라도 발렌스가 0.8인 밝은 곡과 0.2인 어두운 곡은 추천 대상이 다릅니다.
자연어 처리도 곡 분석에 활용됩니다. 스포티파이 알고리즘은 음악 블로그, 가사, 사용자 플레이리스트 제목을 크롤링해 곡과 관련된 의미 정보를 추출합니다. 어떤 곡이 슬픔이라는 단어와 자주 함께 등장하면 슬픈 곡으로 분류되고, 운동이라는 단어와 함께 등장하면 운동용 곡으로 분류됩니다. 이 의미 정보가 사용자의 컨텍스트와 매칭되어 추천에 반영됩니다.
우리가 이전 글에서 다룬 사운드 디자인의 인터페이스 원리가 알고리즘의 곡 표현 방식에도 그대로 적용됩니다. 좋은 인터페이스가 사용자에게 정보를 압축해 보여주듯, 좋은 곡 표현은 음악의 다차원적 특성을 알고리즘이 처리 가능한 벡터로 압축해야 합니다. 스포티파이 알고리즘이 처리하는 곡 벡터는 보통 수백 차원의 임베딩으로 표현됩니다.
이 임베딩은 두 곡 사이의 유사도를 단순한 코사인 거리로 계산할 수 있게 해줍니다. 거리가 가까운 곡은 비슷한 곡이고, 거리가 먼 곡은 다른 곡입니다. 사용자가 좋아한 곡과 거리가 가까운 곡을 후보로 추리고, 거기에 컨텍스트와 다양성 가중치를 곱해 최종 추천 목록을 만듭니다. 곡과 곡 사이의 미묘한 분위기 차이가 수치 거리로 환산되는 셈입니다. 같은 인디 록이라도 어떤 곡은 멜랑콜리에, 어떤 곡은 에너제틱에 가까운데, 이 차이가 임베딩 공간에서 좌표로 표현됩니다.
알고리즘이 사용자를 안다고 말할 때, 그것은 신비가 아니라 수치의 누적이다. 매번의 스킵, 매번의 반복 재생이 자기 자신을 알고리즘에 그려 보여주는 행위다.
3. 사용자 프로파일링과 컨텍스트 인식
스포티파이 알고리즘은 사용자를 단일한 취향 프로필로 보지 않습니다. 한 사용자가 출근길에 듣는 음악, 운동 중에 듣는 음악, 잠들기 전에 듣는 음악이 모두 다르다는 것을 인식합니다. 컨텍스트라고 부르는 이 변수가 추천의 정확도를 크게 끌어올립니다. 시간대, 요일, 위치, 디바이스, 직전에 들은 곡 같은 정보가 모두 컨텍스트의 구성 요소입니다.
청취 세션 단위로 데이터가 분리됩니다. 한 세션은 보통 한 번에 연속 재생되는 시간 구간을 의미합니다. 같은 사용자라도 출근 세션과 저녁 세션의 추천이 다른 이유가 여기에 있습니다. 우리가 이전 글에서 분석한 세트리스트의 큐레이션 원리처럼, 스포티파이 알고리즘도 곡과 곡 사이의 흐름을 중요하게 봅니다.
사용자 행동 신호는 명시적 신호와 암묵적 신호로 구분됩니다. 명시적 신호는 좋아요, 저장, 플레이리스트 추가 같은 의도적 행동입니다. 암묵적 신호는 끝까지 들었는지, 30초 안에 스킵했는지, 반복 재생했는지 같은 자연스러운 청취 행동입니다. 사용자 대부분이 명시적 신호를 잘 남기지 않기 때문에 암묵적 신호가 알고리즘 학습의 주된 데이터원이 됩니다. 30초 스킵은 강한 부정 신호로 해석됩니다.
청취량이 적은 신규 사용자에게 알고리즘은 종종 어려움을 겪습니다. 데이터가 부족한 상태에서는 추천을 만들 단서가 적기 때문입니다. 이 콜드 스타트 문제를 해결하기 위해 스포티파이 알고리즘은 신규 가입 시 사용자가 좋아하는 아티스트를 직접 선택하게 하거나, 인기곡 풀에서 다양한 장르의 곡을 골고루 보여주면서 초기 반응 데이터를 빠르게 수집합니다. 첫 한 달의 청취 패턴이 이후 추천의 기본 토대가 됩니다.
4. 강화학습과 추천의 다양성 문제
추천 시스템의 고질적 문제는 필터 버블입니다. 알고리즘이 사용자가 좋아할 만한 곡만 추천하다 보면, 새로운 장르나 아티스트를 발견할 기회가 사라집니다. 스포티파이 알고리즘은 이를 해결하기 위해 강화학습 기법을 도입했습니다. 추천을 일종의 행동으로 보고, 사용자의 반응을 보상으로 정의해 장기적으로 만족도를 극대화하는 방향을 학습시키는 방식입니다.
탐색과 활용의 균형이 핵심입니다. 알고리즘은 익숙한 곡을 추천해 단기 만족도를 높이는 동시에, 가끔씩 사용자가 평소 듣지 않던 곡을 의도적으로 끼워 넣어 새로운 취향을 탐색합니다. 이 탐색 곡에 사용자가 긍정적으로 반응하면 비슷한 새로운 곡을 추가로 탐색하고, 부정적으로 반응하면 그 방향의 탐색을 줄입니다. 사용자도 자기 취향이 어디까지 확장될 수 있는지 알게 됩니다.
스포티파이 알고리즘이 매월 16억 건 이상의 아티스트 발견을 만들어낸다는 통계는 이 메커니즘의 결과물입니다. 매거진의 팬 컬처 시리즈에서 살펴본 것처럼, 새로운 음악을 발견하는 경험은 청취자의 정체성과 직접 연결됩니다. 알고리즘이 만들어주는 발견은 단순한 곡 한 개가 아니라 새로운 자기 자신의 모습이기도 합니다. 스포티파이 알고리즘이 진짜 잘 작동하는 순간은 사용자가 추천 곡을 듣고 이런 음악을 좋아하는 줄 몰랐다고 느끼는 순간입니다. 그 순간이 발견이고, 알고리즘의 가장 큰 가치입니다. 정량적 학습이 정성적 경험으로 변환되는 그 지점이 추천 시스템의 핵심 목표이기도 합니다. 한 사용자의 청취 데이터는 단순한 로그가 아니라 그 사람의 감정 지도이고, 알고리즘은 그 지도를 읽어 다음 길을 제안하는 안내자 역할을 합니다. 결국 좋은 추천은 좋은 친구가 음반을 추천해주는 것과 다르지 않습니다. 차이가 있다면 그 친구가 매일 매시간 작동하고, 수억 곡의 카탈로그를 기억하고 있다는 점뿐입니다.