추천시스템
본 포스팅은 Minnesota대학교의 Intro to Recommender Systems코세라 강좌를 정리한 내용입니다.
https://www.coursera.org/learn/recommender-systems-introduction?specialization=recommender-systems
TFIDF
TFIDF기법은 정보검색 분야에서 출발한 개녑이다. 정보검색과 관련된 개념을 자세히 설명하지는 않을것이지만, 정보검색에 TFIDF가 어떻게 쓰였는지 들여다 보도록 하자.
- 만약 기본적인 검색기능(태그 와 랭킹 기반)이 실패하면 어떻게할까?
- 특정 단어를 가진 문서를 모두 가져온다면, 너무 많을것이다.
- 어떠한 방식으로 랭킹을 정하는가?
- 두가지 요인을 고려해 볼 수 있다.
- 단어의 빈도는 중요한 요인이다.
- 하지만 모든 단어가 빈도에 대해서 같은 영향을 가지는 것은 아니다.
두번째를 더 설명하면, "The"와 같은 단어는 모든 문서들에서 엄청나게 많이 나온다. 하지만 "Civil War"와 같은 단어는 특정 문서들에만 많이 나올것이다. 이러한 경우 사용자가 "The Civil War"와 관련된 문서를 원할 때 "The"보다는 "Civil War"에 더 중심을 두고 문서들을 모아야 할 것이다.
TFIDF 가중치
TFIDF 가중치는 아래 두가지 요소를 곱한 결과이다.
Term Frequency X Inverse Document Frequency
Term Frequency
- 하나의 문서에 한 단어가 나오는 단순한 빈도수
- 이 단어가 이 문서와 어느정도 연관성이 있는가를 표현한다.
Inverse Document Frequency
- 특정 단어가 한 문서에서 나올 확률이 얼마나 드문가를 표현한다.
- 계산법은 아래와 같다:
log(모든 문서의 수 / 특정 단어를 가진 문서의 수)
- 문서의 수가 많아지면, 계산하기가 까다로워지기 때문에 log를 취한다.
이 가중치는 검색하는 쿼리의 각 단어들에 적용되어 문서들과 비교된다.
TFIDF 강점/약점
강점 |
약점 |
|
|
컨텐츠 기반 필터링과 TFIDF
컨텐츠 필터링은 기본적으로 사용자의 프로필에 기반해 컨텐츠를 추려내는 작업이다.
이 과정에서 TFIDF는 사용자의 프로필에 문서기반 프로필을 만든다.
문서에 나온 단어들이 이 사용자에게 얼마나 중요한 단어인가를 사용해, 사용자의 선호도를 반영하는 것이다.
사용자의 프로필에 있는 단어들을 벡터화하고, 문서들의 단어를 백터화 해서 비교해보면 특정 문서에 대한 사용자의 선호도를 알 수 있을 것이다.
TFIDF변형
특정 도메인에서는 TF를 도메인의 특성에 맞춰 변형해서 사용한다.
- TF(빈도수)를 0/1(단어가 나오는지 나오지 않는지, 횟수를 무시)로 사용
- 로그 빈도수 (tf가 너무 클 때, tf + 1에 log를 취한다)
- 정규화된 빈도수 (빈도수를 문서의 길이로 나눈다)
BM25랭킹함수
- 문서에서만 TF를 계산하는 것이 아니라, 쿼리에서도 계산한다.
- 문서의 길이도 고려한다.
고려점들
특정 구절 또는 N-grams
- N-gram이란 단어들을 N-페어로 묶는것을 말한다. (computer, science)는 bigram (computer, science, major)는 trigram이다.
- Computer Science가 붙어있을때의 의미는 Computer와 Science가 떨어져있을때의 의미와 다르기 때문에 사용한다.
단어의 중요도를 계산하는 다른 방법들
- 제목에 나오는 단어의 중요도가 문서의 문단에 나오는 단어의 중요도와 같은가?
문서들의 가치
- 어떤 문서들이 좋은 문서들인가? Pagerank 알고리즘
부수적인 문서들
- 특정 문서들은 많이 클릭되는 링크가 있지는 않은가?
- 이 링크의 문서들을 같은 문서로 고려해야 하는가?
키워드벡터
키워드벡터는 키워드를 사용해 벡터공간에 컨텐츠(아이템)를 표현하기 위함이다.
키워드는 아이템을을 정의하는 단어일 수도 있고, 영화의 경우는 장르, 배우와 같은 특성일 수도 있다.
- 각 키워드는 하나의 차원이다.
- 각 아이템은 키워드의 차원 내의 포지션(벡터)가 된다.
- 각 사용자는 선호도 프로필이 있고, 그 선호도 또한 차원 내의 벡터가 된다.
- 사용자와 아이템의 매치는, 두 벡터가 얼마나 가까이 정렬되어 있는가를 보고 결정한다.
- 차원(키워드)가 많아질 수록 벡터화하기가 어려워지기 때문에, 키워드를 줄이는 것을 고려해야 한다.
아이템을 키워드 벡터로 표현하는 방법
- 키워드가 있는지 없는지? (0/1의값)
- 카운트
- TFIDF (가장 보편적인 방법)
- 다른 변형/조합들
- 결과적으로 모든 방식은 키워드벡터가 되고 그것을 정규화하면 사용이 가능해진다.
영화 태깅 예제)
영화의 경우 키워드벡터는 어떻게 표현할 수 있을까?
키워드가 있는지 없는지로 표현
- 배우 - 톰 행크스가 영화에 얼마나 많이 나왔는지는 중요하지 않다.
- 태그가 기술적이라면? 단어의 카운트가 중요할지도 모른다.
IDF방법
- 특정 배우가 다른 배우보다 중요한가?
- 기술적 - "감옥장면"이 "키스씬", "로맨스" 보다 중요한가?
표기법
t |
각 태그/특성 |
$$t \in T$$ |
태그/특성 집합에 포함된 태그/특성 |
$$T_i$$ |
아이템 i에 적용된 태그/특성 집합 |
$$\vec{t}$$ |
0/1값의 태그/특성 벡터 |
$$\vec{t}_i$$ |
아이템 i에 적용된 0/1값의 태그/특성 벡터 |
$$t_{ui}$$ |
사용자가 태그를 아이템에 적용한 벡터 (application 벡터) |
아이템에서 사용자 프로필로
벡터모델은 각 특성값을 하나의 스칼라값으로 표현하게 된다.
이 말은 즉, 좋아요 하나가 다른 어떤 중요한 특성값과 같은 의미를 가진다는 것이 되는데,
특정 도메인에서는 좋지 않은 방법이 된다.
그렇다면 사용자의 프로필을 어떻게 표현할것인가?
간단히 모든 횟수를 더할것인가?
- 정규화를 할것인가?
- 모든 벡터가 같은 길이를 가질 수 있게 정규화 할것인가?
- 모든 특성이 같은 중요도를 가지는가?
- 이 방법은 많은 경우 좋지 않다는 것을 알 수 있다.
- 각 특성마다 중요도에 대한 다른 가중치를 둘 것인가?
- 평점을 중요도로 매길 것인가?
- 신뢰도를 사용할 것인가?
- 평점을 어떻게 요소화 할것인가?
- 단항의 값? - 벡터를 모두 더해 가중치가 없이 사용
- 이항의 값? - 양수의 값이면 더하고 음수의 값이면 빼서 사용
- 제한된 단항의 값? - 일정 수준이 넘어서는 단항의 값만 사용 (3.5평점 이상의 이이템만 사용 등)
- 양수의 가중치의 값? - 높은 점수가 높은 값임을 의미
- 음수의 가중치값도 사용한 값? - 음수 평점을 낮은 값으로 사용
- 프로파일을 어떻게 갱신할 것인가?
- 갱신하지 않고 매번 새로 만들어 사용 - 비효율적이다.
- 새로 들어온 가중치를 어떠한 비율로 적용 (선형결합)
- 예전 가중치를 조금씩 감소시키고 (Time Decay) 새로운 가중치를 적용
- (예. 0.95 * 오래된가중치 + 0.05 * 새로운가중치)
예측값 계산
마지막 단계는 구해진 벡터들을 이용해 예측값을 구하는 것이다.
이 예측값이 곧 추천할 아이템을 선정할 값이 된다.
사용자의 선호도 벡터와 아이템들의 벡터가 있을 때,
사용자가 각 아이템을 선호할 예측값은 두 벡터의 코사인 유사도를 구한 값으로 결정된다.
코사인 유사도는 각 벡터의 내적곱을 구하고, 그것을 각 벡터의 길이를 곱한값으로 나눈 값이다.
벡터 v와 벡터 w의 코사인 유사도를 수식으로 표현하면 아래와 같다:
$$\frac{v * w}{|v| * |w|}$$
코사인 유사도의 값은 -1과 1사이의 값이다.
추천할 때는 이 유사도 값을의 최상위 N개를 추천할 수 있다.
장단점
장점 |
단점 |
|
|
'아카이브 > 추천시스템(2019)' 카테고리의 다른 글
추천시스템 13 - 사용자-사용자 협업필터링 (0) | 2019.07.01 |
---|---|
추천시스템 12 - 컨텐츠기반 추천 코드예제 (0) | 2019.07.01 |
추천시스템 10 - 컨텐츠 기반 추천 (0) | 2019.06.30 |
추천시스템 9 - 비개인적 추천 코드예제 (0) | 2019.06.29 |
추천시스템 8 - 제품연관성 (0) | 2019.06.29 |