Project/트렌드 매거진

[트렌드매거진] 25.03.25 개발일지/ 클러스터링 기반 태그 분류 고민, 태그 임베딩과 FAISS

한33 2025. 3. 26. 18:06

📚 개요

기존에 구현했던 방식인 아티클 생성 후에 태그들이 생성되어도 사용자 관심도를 계산하기 위해서 태그들간의 유사도를 계산하는 로직이 들어가지 않는 한 사용자가 그 전에 게시글과 상호작용을 하여도 관심도를 계산할 수가 없다.

그렇다고 유사도를 측정하는 로직을 넣자니, 시간이 오래 걸리기 때문에 한계가 있었다.

 

📚 고민

* 클러스터링 기반 접근

 

태그를 사전에 클러스터링해서 새 태그를 클러스터에 매핑. 사용자 관심도도 클러스터 단위로 관리 (?)

세부 과정:
  1. 초기 클러스터링:
    • 태그를 메인 카테고리(예: "스포츠")별로 나눠 클러스터 생성(예: "축구 클러스터", "농구 클러스터").
    • Tag_Clusters에 저장.
  2. 새 태그 처리:
    • 기존 클러스터와 비교 → 유사하면 배정, 아니면 Temp_Tags에 임시 저장.
    • 새벽에 클러스터 갱신.
  3. 관심도 관리:
    • 사용자 반응(좋아요, 저장)이 클러스터 점수로 합산(User_Cluster_Interests).
  4. 추천:
    • 클러스터 매칭도로 게시글 정렬(User_Post_Matchings).

 

사실상 클러스터가 상세카테고리 역할을 하게 된다.

상세 카테고리가 UI 적으로 보여지진 않지만 게시글 내부적으로 갖고 있게 되고 사용자는 상세 카테고리 기반으로 관심도 점수가 부여된다.

흠.. 더 고민해봐야할 듯

작성자가 직접 메인/상세 카테고리를 선택하는 번거로움을 덜고 사용자도 직접 들어가는 번거로움은 덜 수 있지만 대비해서 메리트가 있는 선택인지에 대한 의문이다.


💡 실제 사례 조사 ( Instagram, Youtube )

더보기

1. 데이터 수집: 사용자 행동 추적

인스타그램과 유튜브는 사용자가 플랫폼에서 하는 거의 모든 행동을 데이터로 수집해. 이 데이터는 알고리즘의 핵심 원료야. 예를 들어:

  • 인스타그램:
    • 좋아요, 댓글, 공유, 저장 여부.
    • 스토리 시청 시간, 릴스(Reels)에서 얼마나 머무는지.
    • 팔로우한 계정, 검색한 해시태그, 탐색 페이지(Explore)에서 클릭한 게시물.
    • 게시물에 머무른 시간(묵시적 피드백).
  • 유튜브:
    • 시청한 영상, 시청 시간(몇 초 봤는지).
    • 좋아요, 싫어요, 공유, 댓글.
    • 검색 기록, 구독 채널, 재생목록 추가 여부.
    • "관심 없음" 클릭 같은 부정적 신호.

이 데이터는 사용자가 명시적으로 입력하지 않아도(예: 설문 없이) 플랫폼이 "이 사람은 이런 걸 좋아하겠구나"를 추측할 수 있게 해줘.


2. 사용자 프로필 생성: 관심사 파악

수집한 데이터를 기반으로 각 사용자에게 "관심사 프로필"을 만들어. 이건 태그나 클러스터 같은 개념으로 생각할 수 있어:

  • 인스타그램:
    • 사용자가 "축구" 관련 게시물에 자주 좋아요를 누르면 "스포츠"나 "축구" 클러스터에 점수를 추가.
    • "맨유" 같은 특정 팀 태그에 반응하면 더 세부적인 관심사로 좁혀짐.
  • 유튜브:
    • "요리 튜토리얼" 영상을 10분간 끝까지 보면 "요리" 주제에 높은 가중치 부여.
    • 반대로 5초 만에 끄면 그 주제의 우선순위가 낮아짐.

이 과정에서 임베딩(Embedding) 기술이 자주 쓰여. 예를 들어, "축구"와 "맨유"를 숫자 벡터로 변환해서 서로 가까운지 계산하고, 사용자 행동을 벡터 공간에 매핑해 관심사를 수학적으로 표현해.


3. 콘텐츠 분석: 태그와 클러스터링

플랫폼은 콘텐츠 자체도 분석해서 사용자와 매칭해:

  • 인스타그램:
    • 게시물의 캡션, 해시태그, 이미지 속 객체(예: AI로 "축구공" 인식), 사용된 필터나 오디오를 분석.
    • 비슷한 콘텐츠를 클러스터로 묶음(예: "스포츠" 클러스터에 "축구", "농구" 포함).
  • 유튜브:
    • 영상 제목, 설명, 자막, 업로더 정보, 썸네일 분석.
    • 비슷한 주제의 영상을 그룹화(예: "게임 스트리밍" 클러스터).

우리가 앞에서 논의한 "AI가 클러스터 태그를 참고해서 태그 정하기" 아이디어가 여기서 실제로 적용돼. 새 콘텐츠가 올라오면 기존 클러스터와 비교해서 바로 매핑하거나, 새 태그로 추가할지 결정해.


4. 추천 알고리즘: 개인화와 랭킹

이제 사용자 프로필과 콘텐츠 분석 결과를 합쳐서 추천을 만들어내:

  • 사용자-콘텐츠 매칭:
    • 인스타그램은 "Two Tower Neural Network" 같은 모델로 사용자 임베딩과 콘텐츠 임베딩 간 유사도를 계산.
    • 유튜브는 "Deep Neural Network"를 활용해 사용자가 영상을 끝까지 볼 확률을 예측.
  • 랭킹 신호(Signals):
    • 인스타그램 피드/탐색 페이지:
      • 관계성(팔로우 여부, 과거 상호작용).
      • 콘텐츠 인기도(좋아요/댓글 수).
      • 사용자 활동(최근 좋아한 게시물 유형).
    • 유튜브 홈/다음 동영상:
      • 시청 시간(Watch Time, 가장 중요).
      • 사용자 참여도(좋아요, 공유).
      • 신선도(최신 영상 우선).
  • 예시:
    • 사용자 001이 "축구 클러스터"=11점이라면, "맨유 경기 하이라이트" 영상(축구 클러스터 소속)이 상단에 뜰 확률 높음.
    • 반면 "농구 클러스터"=5점이니 "NBA 결승" 영상은 낮은 순위.

5. 실시간 피드백과 적응

알고리즘은 정적인 게 아니라 실시간으로 학습해:

  • 인스타그램:
    • 릴스에서 3초만 보고 넘기면 그 주제의 우선순위 낮아짐.
    • "관심 없음" 선택 시 해당 콘텐츠 유형 배제.
  • 유튜브:
    • 영상을 끝까지 보면 비슷한 영상 추천 증가.
    • "싫어요" 누르면 해당 채널/주제 노출 감소.

이건 우리가 얘기한 "클러스터 관심도 갱신"과 비슷해. 사용자 반응이 바로 클러스터 점수에 반영돼서 추천이 계속 조정되는 거야.


6. 실제 서비스에서의 예

인스타그램

  • 상황: 사용자 001이 "프리미어리그" 게시물에 좋아요를 누름.
  • 작동:
    • "축구 클러스터" 점수 +3 → 11.
    • 다음 피드에 "맨유", "리버풀" 관련 게시물 상단 노출.
    • 탐색 페이지(Explore)엔 "챔피언스리그" 같은 관련 콘텐츠 추천.

유튜브

  • 상황: 사용자 001이 "손흥민 골 모음" 영상을 5분 끝까지 시청.
  • 작동:
    • "축구 클러스터" 시청 시간 증가 → 우선순위 높아짐.
    • "Up Next"에 "토트넘 경기 분석" 영상 추천.
    • 홈 화면엔 "프리미어리그 하이라이트" 추가.

7. 기술적 구현

  • 도구:
    • TensorFlow, PyTorch 같은 머신러닝 프레임워크로 모델 학습.
    • FAISS 같은 ANN 검색으로 빠른 유사도 계산.
  • 최적화:
    • 캐싱(예: Redis)으로 자주 쓰는 데이터 빠르게 로드.
    • 오프라인 계산(새벽에 클러스터링 갱신)으로 부하 분산.

💡 태그 유사도 임베딩 (Tag Similarity Embedding)

  • 임베딩이란?:
    • 텍스트(태그, 문장 등)를 숫자 벡터로 변환한 것.
    • 비슷한 의미를 가진 태그는 벡터 공간에서 가까이 위치하고, 다른 의미면 멀리 떨어져 있어.
    • 예: "축구" → [0.12, -0.45, 0.78], "해외축구" → [0.15, -0.40, 0.75] (가까움), "농구" → [0.50, 0.20, -0.30] (멀음).
  • 태그 유사도와의 연계:
    • 태그를 임베딩으로 변환하면 유사도를 숫자로 계산 가능 → 추천 시스템에서 "이 태그가 사용자 관심사와 얼마나 맞는지" 판단.

 

💡 FAISS (Fast Approximate Nearest Neighbor 검색)

개념

  • FAISS란?:
    • Facebook에서 만든 오픈소스 라이브러리로, 대량의 벡터에서 가장 가까운 이웃(Nearest Neighbor)을 빠르게 찾음.
    • 정확한 계산(전체 비교) 대신 근사치(Approximate)를 써서 속도를 극대화.
  • 왜 필요하나?:
    • 태그가 수백 개면 괜찮지만, 수십만 개가 되면 모든 태그와 유사도를 계산하는 건 느려(시간 복잡도 O(n)).
    • FAISS는 O(log n) 또는 그 이하로 줄여줌.

작동 원리

  • 인덱스 생성:
    • 기존 태그 임베딩을 미리 인덱스에 저장.
    • 예: "축구", "맨유", "NBA"의 벡터를 FAISS 인덱스에 넣음.
  • 검색:
    • 새 태그(예: "프리미어리그")의 임베딩을 입력 → 가장 가까운 태그 k개 반환.
  • 방법:
    • Flat Index: 작은 데이터셋에 적합, 정확.
    • IVF (Inverted File): 대규모 데이터에 적합, 빠름.
    • HNSW (Hierarchical Navigable Small World): 빠르고 정확도 높음.