Recommendation System #04 유사도와 거리

김서영·2일 전

추천시스템

목록 보기
4/5

[추천시스템] W4. 유사도와 거리

지난 W3에서는 User-Item Matrix를 행(Row)과 열(Column)로 나누어 User Vector와 Item Vector로 표현했다.

이번 Chapter에서는 이러한 벡터들이 얼마나 비슷한지(Similarity) 측정하는 방법을 알아본다.

추천시스템에서 유사도가 중요한 이유는 간단하다.

  • 나와 취향이 비슷한 User를 찾거나
  • 내가 좋아한 Item과 비슷한 Item을 찾기 위해서이다.

하지만 추천 데이터는 대부분 Sparse하기 때문에, 단순히 유사도 값이 높다는 이유만으로 두 User가 비슷하다고 판단할 수 없다.

이 Chapter의 핵심 : 유사도는 단순히 '얼마나 비슷한가'뿐 아니라, '그 유사도를 얼마나 믿을 수 있는가'까지 고려해야 한다.


1. Vector로 보는 취향

추천시스템에서는 User의 취향을 하나의 Vector로 표현할 수 있다.

ru∈Rnr_u\in\mathbb{R}^n
  • rur_u : User uu의 취향 벡터
  • nn : 전체 Item 수
  • 각 차원 : 특정 Item에 대한 User의 반응

예를 들어 영화 3편에 대한 반응이 다음과 같다고 하자.

A=(5,4,1),B=(4,5,1)A=(5,4,1),\quad B=(4,5,1)

User A와 B는 서로 비슷한 평점 패턴을 가진다.

이러한 벡터를 공간상의 점 또는 화살표로 해석하면, 취향의 유사성을 기하학적으로 측정할 수 있다.

1) Inner Product (내적)

두 Vector에서 대응하는 좌표끼리 곱하고 합산하는 연산이다.

⟨a,b⟩=∑kakbk\langle a,b\rangle=\sum_k a_kb_k

기하학적으로는 다음과 같다.

⟨a,b⟩=∥a∥∥b∥cos⁡θ\langle a,b\rangle=\|a\|\|b\|\cos\theta
  • ∥a∥,∥b∥\|a\|,\|b\| : 각 벡터의 크기
  • θ\theta : 두 벡터 사이의 각도

내적이 크다는 것은 두 Vector에서 동시에 큰 값이 나타나는 경우가 많다는 의미이다.

Inner Product의 한계

내적에는 벡터의 크기가 반영된다.

따라서 취향의 방향이 같더라도 활동량이 많은 Heavy User의 벡터가 더 큰 내적을 가질 수 있다.

즉, 활동량의 차이를 취향의 차이로 오해할 수 있다.


2) Norm과 Normalization

Norm은 Vector의 크기를 측정하는 값이다.

∥a∥=∑kak2\|a\|=\sqrt{\sum_k a_k^2}

Normalization은 벡터를 자신의 Norm으로 나누어 길이를 1로 만드는 과정이다.

a^=a∥a∥\hat a=\frac{a}{\|a\|}

정규화를 수행하면 벡터의 크기 차이를 제거하고 방향만 비교할 수 있다.

  • 정규화 이전 : 취향의 방향 + 활동량
  • 정규화 이후 : 취향의 방향

이때 정규화된 두 벡터의 내적이 바로 Cosine Similarity이다.


3) Euclidean Distance vs Cosine Similarity

두 Vector의 유사성을 측정하는 방법은 크게 거리와 각도로 구분할 수 있다.

Euclidean Distance (유클리드 거리)

d(a,b)=∥a−b∥d(a,b)=\|a-b\|

두 Vector 사이의 실제 거리를 측정한다.

하지만 평가 강도만 다른 User도 멀리 떨어진 것으로 판단할 수 있다.

Cosine Similarity (코사인 유사도)

cos⁡θ=⟨a,b⟩∥a∥∥b∥\cos\theta=\frac{\langle a,b\rangle}{\|a\|\|b\|}

두 Vector 사이의 각도를 기준으로 유사성을 측정한다.

예를 들어

a=(2,4),b=(4,8)a=(2,4),\quad b=(4,8)

두 Vector의 크기는 다르지만 방향은 같다.

  • Euclidean Distance : 0이 아님
  • Cosine Similarity : 1

따라서 원시 평점 벡터의 상대적인 취향 패턴을 비교할 때 Cosine Similarity가 유용하다.

단, 정규화된 벡터에서는 다음 관계가 성립한다.

∥a^−b^∥2=2−2cos⁡θ\|\hat a-\hat b\|^2=2-2\cos\theta

즉, 정규화된 벡터에서는 Euclidean Distance와 Cosine Similarity가 같은 유사도 순서를 제공한다.

결론 : 유사도를 측정할 때 거리와 각도의 차이뿐 아니라, 정규화 여부도 중요하다.


2. Similarity Measurement : 유사도 3총사

추천시스템에서 대표적으로 사용하는 유사도는 다음과 같다.

  1. Cosine Similarity
  2. Pearson Correlation
  3. Jaccard Similarity

세 방법의 차이는 어떤 Data를 비교하는지, 무엇을 보정하는지에 있다.

1) Cosine Similarity : 방향의 일치

sim(u,v)=⟨ru,rv⟩∥ru∥∥rv∥sim(u,v)=\frac{\langle r_u,r_v\rangle}{\|r_u\|\|r_v\|}

내적을 두 Vector의 Norm으로 나눈 값이다.

Cosine Similarity의 특징

  • 값의 범위 : [−1,1][-1,1]
  • 1 : 같은 방향
  • 0 : 직교
  • -1 : 반대 방향
  • 활동량 차이를 정규화하여 비교 가능

주로 실수형 벡터, TF-IDF, Embedding 등을 비교하는 데 사용한다.

Cosine Similarity의 한계 : Positive Inflation

평점이 1~5점이라면 모든 값이 양수이다.

따라서 서로 다른 취향을 가진 User들도 코사인 유사도가 높게 나올 수 있다.

강의의 Mini MovieLens 예시에서 민지와 서준의 Cosine Similarity는 약 0.975이다.

하지만 두 User가 평점을 전반적으로 높게 주는 성향이 있다면, 이 값만으로 실제 취향이 거의 동일하다고 판단하기 어렵다.

또한 User마다 평점을 후하게 주거나 엄격하게 주는 기준이 다르다는 문제도 남아 있다.

(해결책) User별 평균 평점을 제거하는 Mean Centering이 필요하다.


2) Pearson Correlation : 중심 정렬된 Cosine

Pearson Correlation은 User의 평균 평점을 뺀 뒤 계산하는 상관계수이다.

sim(u,v)=∑i∈Iuv(rui−μu)(rvi−μv)∑i∈Iuv(rui−μu)2∑i∈Iuv(rvi−μv)2sim(u,v)= \frac{ \sum_{i\in I_{uv}}(r_{ui}-\mu_u)(r_{vi}-\mu_v) }{ \sqrt{\sum_{i\in I_{uv}}(r_{ui}-\mu_u)^2} \sqrt{\sum_{i\in I_{uv}}(r_{vi}-\mu_v)^2} }
  • IuvI_{uv} : 두 User가 공통으로 평가한 Item 집합
  • μu,μv\mu_u,\mu_v : 각 User의 평균 평점
  • rui,rvir_{ui},r_{vi} : 각 User가 Item에 부여한 평점

여기서는 강의의 계산 예시처럼 공통 관측 Item을 기준으로 평균을 계산한다.

Pearson의 특징

  • User별 평가 척도 차이를 보정
  • 상대적인 선호 패턴을 비교
  • 양의 상관과 음의 상관을 구분
  • 함께 싫어하는 Item도 중요한 유사성 신호로 사용

강의 예시에서 동일한 두 User의 유사도는 다음과 같다.

  • Cosine : 0.975
  • Pearson : 약 0.808

Mean Centering을 통해 양수 평점이 만드는 인플레이션을 완화한 것이다.

즉, Pearson Correlation = Mean Centering + Cosine Similarity로 이해할 수 있다.

Pearson의 한계

  • 모든 Item에 같은 점수를 부여한 User는 분산이 0이므로 계산 불가
  • 공통 평가 Item이 2~3개뿐인 경우 ±1과 같은 극단적인 값이 쉽게 발생
  • 이진 Implicit Data에서는 적절하지 않을 수 있음

특히 공통 관측이 2개뿐이라면 Pearson이 1이라고 하더라도 신뢰하기 어렵다.


3) Jaccard Similarity : 집합의 겹침

Implicit Feedback에서는 User가 소비한 Item의 집합으로 유사도를 측정할 수 있다.

J(u,v)=∣Iu∩Iv∣∣Iu∪Iv∣J(u,v)=\frac{|I_u\cap I_v|}{|I_u\cup I_v|}
  • IuI_u : User uu가 소비한 Item 집합
  • IvI_v : User vv가 소비한 Item 집합
  • 교집합 : 함께 소비한 Item
  • 합집합 : 둘 중 한 명이라도 소비한 Item

Jaccard의 특징

  • 값의 범위 : [0,1][0,1]
  • 클릭 / 시청 / 구매 여부 등 이진 데이터에 적합
  • 공통 Item의 수를 합집합 크기로 정규화

예를 들어

  • A가 소비한 Item : 5개
  • B가 소비한 Item : 4개
  • 공통으로 소비한 Item : 3개

합집합은 6개이므로

J(A,B)=36=0.5J(A,B)=\frac{3}{6}=0.5

Jaccard의 한계

Item을 얼마나 많이 소비했는지는 고려하지 않는다.

  • 1초 시청
  • 3번 반복 시청

두 행동 모두 단순히 '시청했다'는 동일한 신호로 처리된다.

(해결책) Weighted Jaccard 또는 Weighted Cosine을 사용하여 행동 강도를 반영할 수 있다.


유사도 3총사 비교

구분CosinePearsonJaccard
기준벡터의 방향중심 정렬 후 상관집합의 겹침
데이터실수 벡터Explicit 평점Implicit 이진
값 범위-1 ~ 1-1 ~ 10 ~ 1
장점활동량 정규화평가 척도 보정계산이 직관적
한계양수 인플레이션작은 공통분, 분산 0행동 강도 무시

유사도 선택의 핵심은 어떤 방법이 가장 우수한지가 아니라, 어떤 형태의 Data를 사용하는가이다.


3. Sparsity : 유사도를 얼마나 믿을 수 있는가?

앞에서 유사도를 계산하는 방법을 배웠지만, 추천 데이터에는 또 다른 문제가 있다.

바로 Sparsity(희소성)이다.

추천시스템의 User-Item Matrix는 대부분 비어 있기 때문에, 두 User가 공통으로 평가한 Item이 극히 적을 수 있다.

이때 유사도가 높게 나와도 실제 취향이 비슷하다고 보장할 수 없다.

1) Shrinkage : 유사도의 신뢰도 보정

공통으로 평가한 Item이 2개뿐인 두 User의 Pearson Correlation이 1이라고 가정하자.

두 User가 완벽하게 일치하는 취향을 가졌다고 판단할 수 있을까?

공통 Item 2개로 계산한 상관계수는 표본이 너무 적기 때문에 우연히 나타난 값일 가능성이 높다.

따라서 유사도에 공통 관측 수에 따른 가중치를 적용한다.

s′(u,v)=∣Iuv∣∣Iuv∣+βs(u,v)s'(u,v)=\frac{|I_{uv}|}{|I_{uv}|+\beta}s(u,v)
  • s(u,v)s(u,v) : 원래 유사도
  • ∣Iuv∣|I_{uv}| : 공통으로 관측된 Item 수
  • β\beta : 축소 강도를 결정하는 파라미터

Shrinkage의 특징

  • 공통 Item 수가 적으면 유사도를 크게 감소
  • 공통 Item 수가 충분하면 원래 유사도 유지
  • 작은 표본에서 발생하는 극단적인 유사도 완화

예를 들어 공통 Item이 2개이고 β=25\beta=25라면

s′=22+25×1≈0.074s'= \frac{2}{2+25}\times1\approx0.074

유사도가 1이더라도 증거가 부족하므로 약 0.074까지 낮아진다.

즉, 유사도의 크기와 유사도를 뒷받침하는 증거의 양을 구분하는 것이다.


2) Inverse Frequency Weighting : 공통 Item의 질

공통으로 소비한 Item이 많다고 반드시 취향이 비슷한 것은 아니다.

예를 들어

  • 모두가 본 인기 영화를 함께 시청
  • 극소수만 본 독립 영화를 함께 시청

두 경우는 같은 1개의 공통 Item이지만, 취향을 판단하는 정보량에는 차이가 있을 수 있다.

모두가 본 Item의 겹침은 상대적으로 약한 증거이고, 드문 Item의 겹침은 더 강한 증거가 될 수 있다.

이를 반영하는 방법이 Inverse Frequency Weighting이다.

wi=log⁡(mmi)w_i=\log\left(\frac{m}{m_i}\right)
  • mm : 전체 User 수
  • mim_i : Item ii를 소비한 User 수

특징

  • 인기 Item : 가중치 감소
  • 희귀 Item : 가중치 증가

이는 W2에서 배운 TF-IDF의 IDF와 동일한 아이디어이다.

다만 너무 희귀한 Item 하나에 과도한 가중치가 부여되면 오히려 유사도가 왜곡될 수 있다.

따라서 Shrinkage와 Inverse Frequency Weighting을 함께 활용하여 공통 관측의 양과 질을 보정한다.


3) Curse of Dimensionality (차원의 저주)

추천 데이터의 User Vector는 Item 수만큼의 차원을 가진다.

차원이 매우 높아지면 일반적인 밀집 데이터에서는 점들 사이의 거리가 비슷해져 가까운 이웃을 구분하기 어려워질 수 있다.

하지만 추천 데이터는 대부분 Sparse하다.

  • 전체 차원은 매우 높음
  • 실제 관측된 좌표는 극히 적음
  • 유사도 계산 시 공통 관측이 부족함

따라서 원시 추천 데이터에서는 차원의 저주뿐 아니라 공통 관측 부족이 특히 중요한 문제이다.

반면 학습된 Dense Embedding에서는 차원 수를 적절히 제한하는 방법이 사용된다.


4) Similarity Calculation Cost

User가 mm명일 때 모든 User 쌍의 유사도를 계산하면 필요한 쌍의 수는 대략 다음과 같다.

O(m2)O(m^2)

User가 16만 명이면 약 128억 개의 쌍이 존재한다.

이러한 모든 쌍을 계산하는 것은 비용이 크다.

해결 방법

  • Inverted Index : 같은 Item을 소비한 User 쌍만 탐색
  • LSH / MinHash : 비슷할 가능성이 높은 후보를 근사적으로 찾음
  • Offline Precomputation : Item 유사도를 미리 계산
  • Top-k Neighbor 저장 : 가까운 이웃만 보관

특히 Item-to-Item Similarity는 미리 계산해 두고 서비스 시점에는 조회만 수행할 수 있다.

이는 W1에서 배운 Candidate Generation 단계의 주요 방식 중 하나이다.


4. Similarity에서 Collaborative Filtering으로

유사도를 계산하는 최종 목적은 비슷한 User 또는 Item을 찾아 추천에 활용하는 것이다.

이를 대표적으로 구현한 것이 Neighborhood-based Collaborative Filtering이다.

1) k-Nearest Neighbors (k-NN)

추천시스템에서 k-NN은 취향이 가장 비슷한 k명의 User를 찾는 방식이다.

  1. User 간 유사도 계산
  2. 유사도가 높은 k명의 이웃 선택
  3. 이웃들이 평가한 Item의 평점을 이용하여 예측

즉, 나와 취향이 비슷한 User의 평가를 빌려와 내가 평가하지 않은 Item의 점수를 예측하는 것이다.

k 값의 문제

  • k가 작음 : 가까운 이웃만 반영하지만 예측이 불안정할 수 있음
  • k가 큼 : 예측은 안정적이지만 개인화 정도가 낮아질 수 있음

따라서 적절한 k를 선택해야 한다.


2) Weighted Average Prediction

단순 평균이 아니라 User 간 유사도를 가중치로 사용하는 방법이다.

r^ui=μu+∑v∈Nk(u)s(u,v)(rvi−μv)∑v∈Nk(u)∣s(u,v)∣\hat r_{ui} = \mu_u+ \frac{ \sum_{v\in N_k(u)}s(u,v)(r_{vi}-\mu_v) }{ \sum_{v\in N_k(u)}|s(u,v)| }
  • μu\mu_u : 예측 대상 User의 평균 평점
  • Nk(u)N_k(u) : 예측에 참여하는 이웃 User 집합
  • s(u,v)s(u,v) : 두 User의 유사도
  • rvi−μvr_{vi}-\mu_v : 이웃 User의 평균 대비 평점

공식의 의미

  1. 이웃 User의 평점에서 평균을 빼 평가 기준을 보정한다.
  2. 유사도가 높을수록 더 큰 가중치를 부여한다.
  3. 가중치를 정규화한다.
  4. 예측 대상 User의 평균 평점을 다시 더한다.

이때 음의 유사도를 가진 User도 활용할 수 있다.

나와 취향이 반대인 User가 특정 Item을 매우 좋아한다면, 해당 Item에 대한 내 선호는 낮을 수 있다는 증거로 활용하는 것이다.

강의의 Mini MovieLens 예시에서는 이러한 방식으로 민지의 미평가 영화에 대해 약 2.13점이라는 예측값을 계산한다.


3) User-based CF vs Item-based CF

유사도는 User뿐 아니라 Item에도 적용할 수 있다.

User-based Collaborative Filtering

  • User끼리 유사도 계산
  • 나와 비슷한 User가 소비한 Item 추천
  • User의 취향 관계를 활용

Item-based Collaborative Filtering

  • Item끼리 유사도 계산
  • 내가 소비한 Item과 비슷한 Item 추천
  • Item 간 관계를 활용

Item-based CF가 실무에서 자주 사용되는 이유는 다음과 같다.

  • Item 간 유사도가 User의 취향보다 상대적으로 안정적일 수 있음
  • 유사도 사전 계산 및 저장이 용이
  • 추천 근거를 설명하기 쉬움

(ex. '이 영화를 좋아하셨으니 비슷한 영화를 추천합니다.')

Item 간 유사도를 계산할 때는 User별 평가 척도를 보정하기 위해 Adjusted Cosine Similarity(조정 코사인 유사도)를 사용할 수 있다.


4) Similarity Matrix와 Graph

유사도를 계산한 결과는 행렬 형태로 표현할 수 있다.

Suv=sim(u,v)S_{uv}=sim(u,v)

이 유사도 행렬을 Graph로 해석하면

  • Node : User 또는 Item
  • Edge : 유사한 대상 사이의 연결
  • Edge Weight : 유사도 값

으로 나타낼 수 있다.

각 Node에서 가장 유사한 k개의 이웃만 연결하면 k-NN Graph가 된다.

즉, Similarity Matrix는 Graph로도 표현할 수 있는 데이터 구조이다.

이러한 관점은 이후 Graph-based Recommendation이나 GNN을 이해하는 기반이 된다.


마무리 : 유사도는 추천시스템의 기본 부품이다

이번 Chapter에서는 User와 Item의 유사도를 측정하고, 그 값을 실제 추천에 사용하는 방법을 알아보았다.

핵심 정리

1. 취향은 Vector로 표현할 수 있다.

  • 내적은 겹치는 값의 크기를 계산
  • Normalization은 활동량 차이를 제거
  • Cosine은 방향의 일치를 측정

2. Similarity Measure는 Data 형태에 따라 선택한다.

  • Cosine : 실수 벡터 및 Embedding
  • Pearson : Explicit Rating
  • Jaccard : Implicit Binary Data

3. 높은 유사도가 반드시 높은 신뢰도를 의미하지는 않는다.

  • Shrinkage : 공통 관측 수에 따른 보정
  • Inverse Frequency Weighting : 공통 Item의 정보량에 따른 보정

4. 유사도는 Collaborative Filtering의 기반이다.

  • 비슷한 User의 평가를 이용한 평점 예측
  • 비슷한 Item을 활용한 후보 생성

5. Similarity Matrix는 Graph로 확장할 수 있다.

  • User / Item을 Node로 표현
  • 유사도를 Edge Weight로 표현
  • 이후 Graph-based Recommendation과 연결

결국 추천시스템에서 중요한 것은 단순히 유사도가 높은 대상을 찾는 것이 아니라, 어떤 기준으로 비슷하다고 판단할 것이며 그 판단을 얼마나 신뢰할 수 있는가이다.

profile
안녕하세요 :)

0개의 댓글