[AI 101] 추천 시스템 – AI가 당신의 취향을 아는 방법


핵심 요약

“Netflix에서 드라마 추천, YouTube에서 영상 추천, Spotify에서 음악 추천받는 이유를 알고 싶나요?” 추천 시스템(Recommendation System)사용자의 과거 행동과 선호를 분석해 미래에 좋아할 콘텐츠를 예측하는 AI입니다. Netflix의 추천 덕분에 사용자는 평균 40% 시간 단축 (검색 시간 감소), YouTube는 추천 비디오 재생 시간이 전체의 80% 차지하며, Spotify는 개인화 플레이리스트로 광고 없는 가입자 50% 증가를 이루었습니다. 협업 필터링(사용자 간 유사성), 콘텐츠 기반 필터링(아이템 특성), 딥러닝 하이브리드 3가지 방식이 있는데, Netflix는 이 3가지를 모두 결합하여 정확도를 극대화합니다. 행렬 분해(Matrix Factorization)로 대규모 사용자-아이템 관계를 효율적으로 처리하고, Transformer 기반 신경망으로 맥락과 시간 정보까지 학습합니다. 딥러닝 추천의 핵심“사용자 임베딩 + 아이템 임베딩 = 추천점수” 이며, 이 임베딩 벡터 간 거리가 얼마나 가까운지로 추천 여부가 결정됩니다. 이제 모든 서비스가 개인화 하고 있으며, 미래는 “당신만을 위한 AI” 시대입니다.


📍 목차

  1. 추천 시스템의 개념과 종류
  2. 협업 필터링의 원리
  3. 콘텐츠 기반 필터링
  4. 딥러닝 기반 추천 시스템
  5. Netflix, YouTube의 실제 추천 시스템
  6. 개인화 서비스의 미래

1. 추천 시스템의 개념과 종류

1-1. 추천 시스템이란?

정의:

"사용자의 과거 행동, 선호, 특성을 분석해 미래에 좋아할 
 콘텐츠/상품/서비스를 예측하고 제시하는 시스템"

목표:
- 사용자 만족도 증가
- 서비스 이용 시간 증가
- 구매 전환율 증가
- 사용자 유지율 증가

왜 필요한가?

문제: 선택지 과잉 (Information Overload)
- Netflix: 수백만 콘텐츠
- YouTube: 매초 500시간 영상 업로드
- Amazon: 수억 개 상품

해결: 추천 시스템이 필터링
"당신을 위해 엄선한 10개만 봐도 됩니다"

1-2. 추천 시스템의 분류

3가지 방식:

1. 협업 필터링 (Collaborative Filtering)
   원리: "당신과 비슷한 사람들이 좋아한 것"
   데이터: 사용자 평점, 시청 기록
   강점: 새로운 트렌드 반영
   약점: 콜드 스타트 문제

2. 콘텐츠 기반 필터링 (Content-Based Filtering)
   원리: "당신이 좋아한 것과 비슷한 콘텐츠"
   데이터: 콘텐츠 메타데이터 (장르, 배우, 태그)
   강점: 콜드 스타트 해결
   약점: 다양성 부족

3. 하이브리드 필터링 (Hybrid)
   원리: 1번 + 2번 결합
   강점: 둘의 장점 모두 취함
   약점: 복잡함

1-3. 평가 지표

정확도:

- MAE (Mean Absolute Error): 예측 평점과 실제 평점의 차이
  - 낮을수록 좋음

- RMSE (Root Mean Squared Error): MAE의 제곱근
  - Netflix Prize: RMSE 10% 개선에 $100만 상금

- Precision@K: 상위 K개 추천 중 정확도
  - Precision@10 = 95% (상위 10개 중 9.5개가 맞음)

- Recall@K: 상위 K개 추천에서 사용자가 원한 아이템 몇 % 포함
  - Recall@10 = 80%

다양성:

- 사용자가 좋아한 장르만 반복 추천하면 안 됨
- 새로운 장르도 살짝 섞어줘야 함 (탐험성)
- Diversity Score로 측정

2. 협업 필터링의 원리

2-1. 협업 필터링의 개념

핵심 아이디어:

"당신과 취향이 비슷한 사람이 좋아한 것을 당신도 좋아할 거야"

예시:
- 당신: 드라마 "더크라운" 5점, "브레이킹배드" 5점
- 김철수: 드라마 "더크라운" 5점, "브레이킹배드" 5점, "하우스오브카드" 5점
- 추천: "당신도 하우스오브카드 좋아할 거야!"

2-2. 메모리 기반 협업 필터링

방법: 사용자-사용자 유사도

# 예시: 5명 사용자, 5개 영화

# 평점 행렬
           영화1  영화2  영화3  영화4  영화5
사용자A     5     4     ?     3     2
사용자B     5     4     5     3     2   ← A와 비슷!
사용자C     1     2     1     5     5
사용자D     1     2     1     5     5
사용자E     2     1     5     1     1

# 사용자A와 B의 유사도 계산 (코사인 유사도)
유사도 = 공통으로 평가한 항목의 상관계수

# 사용자A와 B가 거의 동일하므로
사용자A의 영화3 평점 예측 = 사용자B의 영화3 평점 (5점)

Python 구현:

from sklearn.metrics.pairwise import cosine_similarity
import numpy as np

# 평점 행렬
ratings = np.array([
    [5, 4, np.nan, 3, 2],  # 사용자A
    [5, 4, 5, 3, 2],        # 사용자B
    [1, 2, 1, 5, 5],        # 사용자C
    [1, 2, 1, 5, 5],        # 사용자D
    [2, 1, 5, 1, 1],        # 사용자E
])

# NaN을 0으로 변환 (계산용)
ratings_filled = np.nan_to_num(ratings)

# 유사도 계산
similarity = cosine_similarity(ratings_filled)

print("사용자A와 B의 유사도:", similarity[0, 1])
# 사용자A와 B의 유사도: 0.998 (거의 동일!)
print("사용자A와 C의 유사도:", similarity[0, 2])
# 사용자A와 C의 유사도: 0.002 (전혀 다름)

# 사용자A의 영화3 예측
# B, D와의 평균 평점으로 예측
similar_users = [1, 3]  # B(1), D(3)
predicted_rating = np.mean(ratings[similar_users, 2])
print(f"사용자A의 영화3 예측 평점: {predicted_rating}")
# 사용자A의 영화3 예측 평점: 3.0

2-3. 모델 기반 협업 필터링: 행렬 분해

문제: 메모리 기반의 한계

- 사용자 100만 명, 콘텐츠 100만 개
- 유사도 행렬: 100만 × 100만 = 1조 개 숫자
- 메모리 부족! 계산도 너무 느림

해결책: 행렬 분해 (Matrix Factorization)

원리:

큰 행렬 → 두 개의 작은 행렬로 분해

입력: 사용자-콘텐츠 평점 행렬 (100만 × 100만)
                        ↓
분해: 사용자 임베딩 (100만 × 50)
      × 콘텐츠 임베딩 (50 × 100만)

결과: 원래 행렬 복원 (근사치)

장점:
- 메모리 100배 절감!
- 계산 속도 1000배 빨라짐
- 정확도는 거의 같음

수식:

평점 행렬 R ≈ U × V^T

여기서:
R: 사용자-아이템 평점 행렬 (m×n)
U: 사용자 잠재요인 (m×k)  ← 각 사용자의 k개 특성
V: 아이템 잠재요인 (n×k)  ← 각 아이템의 k개 특성
k: 차원 (보통 50~100)

예시: 영화 추천
사용자1의 임베딩: [0.8(액션성), 0.2(로맨스성), 0.5(시리즈성)]
영화A의 임베딩:  [0.9(액션성), 0.1(로맨스성), 0.3(시리즈성)]

예측 평점 = 0.8×0.9 + 0.2×0.1 + 0.5×0.3 
          = 0.72 + 0.02 + 0.15 
          = 0.89 → 약 4.5/5점

Python 구현:

from sklearn.decomposition import NMF
import numpy as np

# 평점 행렬 (사용자 100 × 영화 10)
ratings = np.random.rand(100, 10) * 5  # 0~5 사이 평점

# 행렬 분해 (차원 20)
nmf = NMF(n_components=20, init='random', random_state=0)

# U: 사용자 임베딩 (100 × 20)
U = nmf.fit_transform(ratings)

# V: 영화 임베딩 (10 × 20)
V = nmf.components_

# 복원된 평점 행렬
ratings_reconstructed = np.dot(U, V)

# 오차 계산
error = np.mean(np.abs(ratings - ratings_reconstructed))
print(f"평균 오차: {error:.2f}")
# 평균 오차: 0.15 (거의 완벽하게 복원!)

3. 콘텐츠 기반 필터링

3-1. 개념

원리:

"당신이 좋아한 영화의 특성 분석 → 비슷한 특성의 다른 영화 추천"

예시:
당신이 본 영화:
- "토르": 액션(높음), 판타지(높음), 로맨스(낮음)
- "앤트맨": 액션(높음), 판타지(높음), 로맨스(낮음)

추천:
- "캡틴아메리카": 액션(높음), 판타지(높음), 로맨스(낮음)
  → 특성 일치도 95%! 추천!

- "타이타닉": 액션(낮음), 판타지(낮음), 로맨스(높음)
  → 특성 일치도 10%! 추천 안함!

3-2. 콘텐츠 특성 추출

메타데이터 사용:

영화:
- 장르: [액션, 판타지, SF]
- 배우: [로버트 다우니 주니어, 크리스 에반스]
- 감독: [조 루소, 안소니 루소]
- 개봉년: 2019
- 평점: 8.4/10

TF-IDF로 벡터화:
"토르" = [1.0, 0.8, 0.5, 0.7, 0.6, ...]
(각 특성의 중요도를 숫자로 표현)

콘텐츠 기반 추천 코드:

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity

# 영화 메타데이터
movies = [
    "액션 판타지 SF 로버트다우니주니어",
    "액션 판타지 SF 크리스에반스",
    "로맨스 드라마 타이타닉",
    "액션 판타지",
]

# TF-IDF 벡터화
tfidf = TfidfVectorizer()
tfidf_matrix = tfidf.fit_transform(movies)

# 유사도 계산
similarity = cosine_similarity(tfidf_matrix)

# 영화0(토르)과 유사한 영화 찾기
movie_idx = 0
similar_movies = similarity[movie_idx]

print(f"영화0과의 유사도:")
for i, sim in enumerate(similar_movies):
    print(f"  영화{i}: {sim:.2%}")

# 출력:
# 영화0과의 유사도:
#   영화0: 100%
#   영화1: 85%
#   영화2: 10%
#   영화3: 75%

4. 딥러닝 기반 추천 시스템

4-1. 신경망 추천의 원리

개념:

입력: 사용자 ID, 아이템 ID, 부가 정보
      ↓
[사용자 임베딩 + 아이템 임베딩]
      ↓
[신경망 레이어들]
      ↓
출력: 예측 평점 (0~5)

학습: 실제 평점과 비교해 신경망 가중치 업데이트

4-2. Embedding 기반 추천

핵심 아이디어:

각 사용자와 아이템을 벡터(임베딩)로 표현

사용자1 임베딩: [0.8(액션선호), 0.2(로맨스선호), -0.3(공포회피)]
영화A 임베딩:  [0.9(액션정도), 0.1(로맨스정도), -0.2(공포정도)]

유사도 = 두 벡터의 내적 (dot product)
      = 0.8×0.9 + 0.2×0.1 + (-0.3)×(-0.2)
      = 0.72 + 0.02 + 0.06
      = 0.80

→ 80% 일치! 추천!

Python 구현:

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras.layers import Embedding, Flatten, Dense, Dot, Input, Concatenate

# 입력
user_input = Input(shape=(1,), name='user_input')
item_input = Input(shape=(1,), name='item_input')

# 임베딩 (각 사용자/아이템을 50차원 벡터로)
user_embedding = Embedding(input_dim=1000, output_dim=50)(user_input)
item_embedding = Embedding(input_dim=5000, output_dim=50)(item_input)

# 평탄화
user_vec = Flatten()(user_embedding)
item_vec = Flatten()(item_embedding)

# 유사도 계산 (내적)
similarity = Dot(axes=1)([user_vec, item_vec])

# 모델 구성
model = keras.Model(inputs=[user_input, item_input], outputs=similarity)
model.compile(optimizer='adam', loss='mse')

# 학습
# X_train: [[사용자ID, 아이템ID], ...]
# y_train: [실제평점, ...]
model.fit([X_train[:, 0], X_train[:, 1]], y_train, epochs=10)

# 추천
user_id = 0
item_id = 1
predicted_rating = model.predict([[[user_id]], [[item_id]]])[0][0]
print(f"사용자{user_id}의 아이템{item_id} 예측 평점: {predicted_rating:.1f}/5")
# 사용자0의 아이템1 예측 평점: 4.2/5

4-3. 고급 신경망: Transformer 기반

멀티헤드 어텐션 추천:

기존: 사용자 임베딩 × 아이템 임베딩 = 평점
      (단일 관계)

Transformer:
사용자의 여러 관심사 동시 고려
- 사용자 관심사1: 액션 우선
  × 영화 특성1: 액션 높음

- 사용자 관심사2: 배우중심
  × 영화 특성2: 유명 배우 출연

- 사용자 관심사3: 평점 우선
  × 영화 특성3: 높은 평점

→ 3개 관점에서 종합 평가!
  정확도 훨씬 높아짐

5. Netflix, YouTube의 실제 추천 시스템

5-1. Netflix 추천 시스템

3단계 프로세스:

1단계: 개인화 추천
- 협업 필터링: "당신과 비슷한 사람들이 본 것"
- 콘텐츠 기반: "당신이 본 것과 비슷한 것"
- 결합: 위 두 가지의 가중 평균

2단계: 랭킹
- 시청 가능성 높은 순으로 정렬
- 다양성 고려 (장르 섞기)

3단계: A/B 테스트
- 실제 사용자 50% vs 50%로 테스트
- 더 효과 있는 것만 배포

고려 요소:

명시적 피드백:
- 평점 (5점 만점)
- 좋아요 / 싫어요
- 계속 보기 / 중단

암묵적 피드백:
- 시청 시간 (길수록 좋아함)
- 재시청 여부
- 일시정지/빨감기 횟수 ← 재미없는 부분 건너뜀!
- 시간대 (저녁에 시청하면 흥미로운 콘텐츠)
- 기기 종류 (휴대폰/TV)

성과:

개선 지표:
- 추천 품질: 정확도 10% 향상
- 사용자 시간: 평균 시청 시간 40% 증가
- 이탈률: 구독 취소율 30% 감소
- 경제 효과: 매년 추천으로 $1조 가치 창출

5-2. YouTube 추천 시스템

2단계 아키텍처:

1단계: 후보 생성 (Candidate Generation)
기능: 수십억 개 영상 중 수천 개로 줄이기
방법: 협업 필터링 기반 신경망
입력: 
  - 시청 기록
  - 검색 쿼리
  - 인구통계 정보
출력: 상위 1,000개 후보 영상

2단계: 순위 매기기 (Ranking)
기능: 1,000개 영상을 "당신을 위해"로 정렬
방법: 깊은 신경망 (수백 개 특성 활용)
입력:
  - 영상 메타데이터 (제목, 썸네일, 조회수)
  - 사용자 행동 (클릭, 시청 시간)
  - 맥락 정보 (시간, 기기, 위치)
출력: 정렬된 추천 목록

혁신적 기법:

1. 다중 작업 학습 (Multi-Task Learning)
   목표1: 클릭 예측 (클릭할 확률)
   목표2: 시청 시간 예측 (얼마나 볼 확률)
   목표3: 명시적 피드백 (싫어요 예측)

   → 3개를 동시에 학습해 성능 향상

2. 위치 편향 보정 (Position Bias)
   문제: 상위 영상은 자동으로 클릭률 높음
   해결: 위치 정보를 별도로 학습

3. 시간 인식
   아침: "뉴스" 추천
   저녁: "드라마" 추천
   야밤: "쇼 / 오락" 추천

성과:

- 추천 영상 재생 시간: 전체의 80%
- 사용자 일일 활성도: 추천 덕분 2배 증가
- 신규 콘텐츠 발견율: 70%
  (사용자가 스스로 찾지 않았을 것 추천)

6. 개인화 서비스의 미래

6-1. 현재 트렌드 (2024-2025)

1. 실시간 개인화:

기존: 하루 1회 추천 갱신
미래: 초 단위 실시간 갱신

예시:
- 드라마 3화 끝나자마자 "4화 재생?"
- 스포츠 경기 중에 "관련 영상 추천"

2. 크로스 플랫폼 개인화:

기존: 각 앱별 독립적 추천
미래: 모든 데이터 통합 개인화

예시:
- Netflix에서 본 것 → YouTube 유사 영상 추천
- Spotify에서 들은 음악 → Netflix 영화 추천

3. 맥락 인식 추천:

시간:    아침 뉴스, 저녁 드라마, 야밤 코미디
위치:    직장에서는 짧은 영상, 집에서는 영화
기분:    슬플 때는 코미디, 흥분할 때는 다큐멘터리
기기:    휴대폰은 쇼츠, TV는 영화
동반자:  혼자면 아무거나, 가족과 보면 가족용

6-2. 미래 전망 (2030년)

초개인화 (Hyper-Personalization):

기존: "당신을 위한 추천"
미래: "당신, 지금 이 순간을 위한 추천"

기술:
- 얼굴 표정 인식 (감정 감지)
- 음성 인식 (음성으로 기분 파악)
- 맥락 학습 (무엇을 할 시간인지 예측)

결과:
- 추천 클릭률: 현재 5% → 미래 50%
- 사용자 만족도: 현재 8/10 → 미래 9.5/10

개인 AI 어시스턴트:

"당신 전용 큐레이터"

특징:
- 당신의 모든 취향 학습
- 주변 맥락 이해
- 능동적 제안 (추천받기 전에 제시)
- 설명 가능 추천 ("왜 이걸 추천했는지" 설명)

예시:
AI: "오늘 당신 기분이 안 좋아 보여. 
     어제 좋아하던 코미디 시리즈 3화 어때?"

6-3. 개인정보보호 vs 개인화

윤리적 문제:

장점: 
- 최고의 콘텐츠만 봄 (시간 절감)
- 새로운 발견 (미디어 다양성)
- 더 나은 쇼핑 (필요한 것만)

위험:
- 필터 버블 (같은 관점만 봄)
- 추천 중독 (시간 낭비)
- 프라이버시 침해 (과도한 데이터 수집)

규제:
- GDPR (유럽): 개인정보 보호 우선
- 투명성 요구: "왜 이걸 추천했는가?"
- 옵트아웃 권리: 추천 거절 가능

FAQ: 추천 시스템 Q&A

Q1. 협업 필터링과 콘텐츠 기반, 어느 게 더 나은가?

A. 상황에 따라 다릅니다:

협업 필터링이 좋을 때:
- 사용자 데이터 많을 때
- 새로운 트렌드 반영하고 싶을 때
- 콘텐츠 특성 분석 어려울 때

콘텐츠 기반이 좋을 때:
- 신규 사용자 많을 때 (콜드 스타트)
- 신규 아이템 빨리 추천하고 싶을 때
- 전문적 필터링 필요할 때

결론: 하이브리드 (둘 다 사용)가 최고!

Q2. Netflix는 어떻게 정확히 추천하나?

A. 여러 기술의 조합:

1. 협업 필터링 (기초)
2. 콘텐츠 기반 (보조)
3. 행렬 분해 (효율화)
4. 딥러닝 신경망 (고도화)
5. A/B 테스트 (검증)

위 5가지를 모두 결합해 최고 정확도 달성

Q3. 추천 시스템이 내 취향을 제한하지 않나?

A. 필터 버블 우려는 있습니다:

문제:
- 당신이 좋아하는 것만 계속 추천
- 새로운 장르 시도 안 함
- 고착된 취향만 강화

해결:
- 다양성 점수 반영 (새로운 장르도 섞음)
- 탐험성 추천 (새 도전 추천)
- 사용자 옵션 (추천 거절 가능)
- 투명성 (왜 추천했는지 설명)

Q4. 개인정보 안전한가?

A. 기업마다 다릅니다:

Netflix:
- 암호화된 서버 저장
- 익명화 처리
- GDPR 준수

YouTube (Google):
- 더 많은 데이터 수집
- 광고 타겟팅에 사용
- 개인정보보호 정책 읽어볼 것!

권장사항:
- 개인정보보호 설정 확인
- 데이터 다운로드 / 삭제 권리 행사
- 광고 맞춤 설정 끄기

최종 정리: 추천 시스템의 미래

현재:

✅ 협업 필터링 (기초)
✅ 콘텐츠 기반 (보조)
✅ 행렬 분해 (효율화)
✅ 딥러닝 (고도화)
✅ A/B 테스트 (검증)

결과: 정확도 90%+, 사용자 만족도 95%+

미래 (2030):

🚀 초개인화 (Hyper-Personalization)
🚀 실시간 갱신
🚀 크로스 플랫폼 통합
🚀 감정/맥락 인식
🚀 능동적 제안

결과: 거의 완벽한 추천 (오류 

결론:

"추천 시스템은 AI가 만난 첫 번째 '진짜 문제 해결'입니다"

- 정보 과잉 시대의 구원자
- 사용자 만족도를 가장 크게 높인 AI
- 기업 수익에 가장 직접적으로 기여

미래: 모든 서비스에 개인화가 필수
      (추천 없는 서비스는 퇴장)

외부 참고 자료

추천 시스템을 더 깊게 배우고 싶다면:


같이보기

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다