지난 W3에서는 User-Item Matrix를 행(Row)과 열(Column)로 나누어 User Vector와 Item Vector로 표현했다.
이번 Chapter에서는 이러한 벡터들이 얼마나 비슷한지(Similarity) 측정하는 방법을 알아본다.
추천시스템에서 유사도가 중요한 이유는 간단하다.
하지만 추천 데이터는 대부분 Sparse하기 때문에, 단순히 유사도 값이 높다는 이유만으로 두 User가 비슷하다고 판단할 수 없다.
이 Chapter의 핵심 : 유사도는 단순히 '얼마나 비슷한가'뿐 아니라, '그 유사도를 얼마나 믿을 수 있는가'까지 고려해야 한다.
1. Vector로 보는 취향
추천시스템에서는 User의 취향을 하나의 Vector로 표현할 수 있다.
예를 들어 영화 3편에 대한 반응이 다음과 같다고 하자.
User A와 B는 서로 비슷한 평점 패턴을 가진다.
이러한 벡터를 공간상의 점 또는 화살표로 해석하면, 취향의 유사성을 기하학적으로 측정할 수 있다.
두 Vector에서 대응하는 좌표끼리 곱하고 합산하는 연산이다.
기하학적으로는 다음과 같다.
내적이 크다는 것은 두 Vector에서 동시에 큰 값이 나타나는 경우가 많다는 의미이다.
내적에는 벡터의 크기가 반영된다.
따라서 취향의 방향이 같더라도 활동량이 많은 Heavy User의 벡터가 더 큰 내적을 가질 수 있다.
즉, 활동량의 차이를 취향의 차이로 오해할 수 있다.
Norm은 Vector의 크기를 측정하는 값이다.
Normalization은 벡터를 자신의 Norm으로 나누어 길이를 1로 만드는 과정이다.
정규화를 수행하면 벡터의 크기 차이를 제거하고 방향만 비교할 수 있다.
이때 정규화된 두 벡터의 내적이 바로 Cosine Similarity이다.
두 Vector의 유사성을 측정하는 방법은 크게 거리와 각도로 구분할 수 있다.
두 Vector 사이의 실제 거리를 측정한다.
하지만 평가 강도만 다른 User도 멀리 떨어진 것으로 판단할 수 있다.
두 Vector 사이의 각도를 기준으로 유사성을 측정한다.
예를 들어
두 Vector의 크기는 다르지만 방향은 같다.
따라서 원시 평점 벡터의 상대적인 취향 패턴을 비교할 때 Cosine Similarity가 유용하다.
단, 정규화된 벡터에서는 다음 관계가 성립한다.
즉, 정규화된 벡터에서는 Euclidean Distance와 Cosine Similarity가 같은 유사도 순서를 제공한다.
결론 : 유사도를 측정할 때 거리와 각도의 차이뿐 아니라, 정규화 여부도 중요하다.
2. Similarity Measurement : 유사도 3총사
추천시스템에서 대표적으로 사용하는 유사도는 다음과 같다.
세 방법의 차이는 어떤 Data를 비교하는지, 무엇을 보정하는지에 있다.
내적을 두 Vector의 Norm으로 나눈 값이다.
주로 실수형 벡터, TF-IDF, Embedding 등을 비교하는 데 사용한다.
평점이 1~5점이라면 모든 값이 양수이다.
따라서 서로 다른 취향을 가진 User들도 코사인 유사도가 높게 나올 수 있다.
강의의 Mini MovieLens 예시에서 민지와 서준의 Cosine Similarity는 약 0.975이다.
하지만 두 User가 평점을 전반적으로 높게 주는 성향이 있다면, 이 값만으로 실제 취향이 거의 동일하다고 판단하기 어렵다.
또한 User마다 평점을 후하게 주거나 엄격하게 주는 기준이 다르다는 문제도 남아 있다.
(해결책) User별 평균 평점을 제거하는 Mean Centering이 필요하다.
Pearson Correlation은 User의 평균 평점을 뺀 뒤 계산하는 상관계수이다.
여기서는 강의의 계산 예시처럼 공통 관측 Item을 기준으로 평균을 계산한다.
강의 예시에서 동일한 두 User의 유사도는 다음과 같다.
Mean Centering을 통해 양수 평점이 만드는 인플레이션을 완화한 것이다.
즉, Pearson Correlation = Mean Centering + Cosine Similarity로 이해할 수 있다.
특히 공통 관측이 2개뿐이라면 Pearson이 1이라고 하더라도 신뢰하기 어렵다.
Implicit Feedback에서는 User가 소비한 Item의 집합으로 유사도를 측정할 수 있다.
예를 들어
합집합은 6개이므로
Item을 얼마나 많이 소비했는지는 고려하지 않는다.
두 행동 모두 단순히 '시청했다'는 동일한 신호로 처리된다.
(해결책) Weighted Jaccard 또는 Weighted Cosine을 사용하여 행동 강도를 반영할 수 있다.
| 구분 | Cosine | Pearson | Jaccard |
|---|---|---|---|
| 기준 | 벡터의 방향 | 중심 정렬 후 상관 | 집합의 겹침 |
| 데이터 | 실수 벡터 | Explicit 평점 | Implicit 이진 |
| 값 범위 | -1 ~ 1 | -1 ~ 1 | 0 ~ 1 |
| 장점 | 활동량 정규화 | 평가 척도 보정 | 계산이 직관적 |
| 한계 | 양수 인플레이션 | 작은 공통분, 분산 0 | 행동 강도 무시 |
유사도 선택의 핵심은 어떤 방법이 가장 우수한지가 아니라, 어떤 형태의 Data를 사용하는가이다.
3. Sparsity : 유사도를 얼마나 믿을 수 있는가?
앞에서 유사도를 계산하는 방법을 배웠지만, 추천 데이터에는 또 다른 문제가 있다.
바로 Sparsity(희소성)이다.
추천시스템의 User-Item Matrix는 대부분 비어 있기 때문에, 두 User가 공통으로 평가한 Item이 극히 적을 수 있다.
이때 유사도가 높게 나와도 실제 취향이 비슷하다고 보장할 수 없다.
공통으로 평가한 Item이 2개뿐인 두 User의 Pearson Correlation이 1이라고 가정하자.
두 User가 완벽하게 일치하는 취향을 가졌다고 판단할 수 있을까?
공통 Item 2개로 계산한 상관계수는 표본이 너무 적기 때문에 우연히 나타난 값일 가능성이 높다.
따라서 유사도에 공통 관측 수에 따른 가중치를 적용한다.
예를 들어 공통 Item이 2개이고 라면
유사도가 1이더라도 증거가 부족하므로 약 0.074까지 낮아진다.
즉, 유사도의 크기와 유사도를 뒷받침하는 증거의 양을 구분하는 것이다.
공통으로 소비한 Item이 많다고 반드시 취향이 비슷한 것은 아니다.
예를 들어
두 경우는 같은 1개의 공통 Item이지만, 취향을 판단하는 정보량에는 차이가 있을 수 있다.
모두가 본 Item의 겹침은 상대적으로 약한 증거이고, 드문 Item의 겹침은 더 강한 증거가 될 수 있다.
이를 반영하는 방법이 Inverse Frequency Weighting이다.
이는 W2에서 배운 TF-IDF의 IDF와 동일한 아이디어이다.
다만 너무 희귀한 Item 하나에 과도한 가중치가 부여되면 오히려 유사도가 왜곡될 수 있다.
따라서 Shrinkage와 Inverse Frequency Weighting을 함께 활용하여 공통 관측의 양과 질을 보정한다.
추천 데이터의 User Vector는 Item 수만큼의 차원을 가진다.
차원이 매우 높아지면 일반적인 밀집 데이터에서는 점들 사이의 거리가 비슷해져 가까운 이웃을 구분하기 어려워질 수 있다.
하지만 추천 데이터는 대부분 Sparse하다.
따라서 원시 추천 데이터에서는 차원의 저주뿐 아니라 공통 관측 부족이 특히 중요한 문제이다.
반면 학습된 Dense Embedding에서는 차원 수를 적절히 제한하는 방법이 사용된다.
User가 명일 때 모든 User 쌍의 유사도를 계산하면 필요한 쌍의 수는 대략 다음과 같다.
User가 16만 명이면 약 128억 개의 쌍이 존재한다.
이러한 모든 쌍을 계산하는 것은 비용이 크다.
특히 Item-to-Item Similarity는 미리 계산해 두고 서비스 시점에는 조회만 수행할 수 있다.
이는 W1에서 배운 Candidate Generation 단계의 주요 방식 중 하나이다.
4. Similarity에서 Collaborative Filtering으로
유사도를 계산하는 최종 목적은 비슷한 User 또는 Item을 찾아 추천에 활용하는 것이다.
이를 대표적으로 구현한 것이 Neighborhood-based Collaborative Filtering이다.
추천시스템에서 k-NN은 취향이 가장 비슷한 k명의 User를 찾는 방식이다.
즉, 나와 취향이 비슷한 User의 평가를 빌려와 내가 평가하지 않은 Item의 점수를 예측하는 것이다.
따라서 적절한 k를 선택해야 한다.
단순 평균이 아니라 User 간 유사도를 가중치로 사용하는 방법이다.
이때 음의 유사도를 가진 User도 활용할 수 있다.
나와 취향이 반대인 User가 특정 Item을 매우 좋아한다면, 해당 Item에 대한 내 선호는 낮을 수 있다는 증거로 활용하는 것이다.
강의의 Mini MovieLens 예시에서는 이러한 방식으로 민지의 미평가 영화에 대해 약 2.13점이라는 예측값을 계산한다.
유사도는 User뿐 아니라 Item에도 적용할 수 있다.
Item-based CF가 실무에서 자주 사용되는 이유는 다음과 같다.
(ex. '이 영화를 좋아하셨으니 비슷한 영화를 추천합니다.')
Item 간 유사도를 계산할 때는 User별 평가 척도를 보정하기 위해 Adjusted Cosine Similarity(조정 코사인 유사도)를 사용할 수 있다.
유사도를 계산한 결과는 행렬 형태로 표현할 수 있다.
이 유사도 행렬을 Graph로 해석하면
으로 나타낼 수 있다.
각 Node에서 가장 유사한 k개의 이웃만 연결하면 k-NN Graph가 된다.
즉, Similarity Matrix는 Graph로도 표현할 수 있는 데이터 구조이다.
이러한 관점은 이후 Graph-based Recommendation이나 GNN을 이해하는 기반이 된다.
이번 Chapter에서는 User와 Item의 유사도를 측정하고, 그 값을 실제 추천에 사용하는 방법을 알아보았다.
1. 취향은 Vector로 표현할 수 있다.
2. Similarity Measure는 Data 형태에 따라 선택한다.
3. 높은 유사도가 반드시 높은 신뢰도를 의미하지는 않는다.
4. 유사도는 Collaborative Filtering의 기반이다.
5. Similarity Matrix는 Graph로 확장할 수 있다.
결국 추천시스템에서 중요한 것은 단순히 유사도가 높은 대상을 찾는 것이 아니라, 어떤 기준으로 비슷하다고 판단할 것이며 그 판단을 얼마나 신뢰할 수 있는가이다.