본문 바로가기

Tech Story

추천 시스템에 대해서 여전히 남은 이야기들 (PR시리즈.14)

추천 시스템에 대한 웬만한 내용은 다 다룬 듯합니다. 그래도 남은 짜투리 생각들을 정리합니다.

추천의 형태/대상별 분류에서 그룹추천을 설명했습니다. 그룹추천은 그룹을 대상으로 공통된 아이템을 추천해주는 의미도 있지만, 더 상세한 개인추천/개인화의 중간단계 역할도 합니다. 여러 측면에서 고려될 수 있지만, 우선 떠오르는 생각은 추천 대상이 너무 많고 광범위해서 1차로 segmentation하고, 각 세그먼테이션 내에서 개인화를 진행할 수 있습니다. 성연령이나 문화권에 따라서 소비자들의 행동패턴은 분명히 다를 것입니다. 그렇기에 인위적으로 성별이나 연령대, 국가별로 나눠서 각 그룹 내의 행동패턴을 상세 분석하는 것은 의미가 있습니다. 미국의 소비자와 한국의 소비자를 하나의 데이터에 넣고 추천 알고리즘을 돌린다고 가정하면, 첫째는 데이터의 사이즈가 커서 불필요한 리소스 낭비만 초래할 수 있고, 또 다른 문화권에 의한 다른 행동패턴이 서로에게 노이즈로 작용할 수도 있습니다. 전체 데이터를 아우르는 일반적인 패턴을 찾아내는 것도 필요하지만, 그룹별로 상세/미세 패턴을 찾아내는 것도 중요합니다.

성연령이나 지역 등과 같이 인위적으로 구분할 수도 있지만, 클러스터링을 통해서 1차로 필터링하고 각 클러스터별러 2차 추천을 하는 방식도 가능합니다. 유저 클러스터링이라면 각 아이템들의 레이팅/피드백을 벡터로 보고 잘 알려진 클러스터링 알고리즘을 실행하면 됩니다. 같은 방식으로 아이템 클러스터링도 가능합니다. 그런데 이렇게 유저, 아이템을 따로 놓고 클러스터링하는 것보다는 유저&아이템을 동시에 클러스터링할 수 있으면 더 좋을 것입니다. 그래서 연구되던 것이 co-clustering 또는 bi-clustering입니다. 학위를 마치고 한동안 이 문제에 많은 고민을 했었는데, 아주 나이스한 방법을 찾지 못한 상태에서 취업을 했습니다. 몇몇 논문들도 나와있었지만 당시에도 그렇게 깔끔하다고 생각하지 못했습니다.

그렇게 시간이 몇 년 흐른 뒤에 회사에 신입사원이 들어와서 LDA라는 것을 소개해줬습니다. 이미 학계 및 산업계에서 늘리 사용되고 있는 방법이었습니다. LDA를 처음 들었을 때는 학교에서 배웠던 Linear Discriminative Analysis인가 싶었는데, 발음하기도 조금 어려운 Latent Dirichlet Allocation이었습니다. 전자는 데이터 분포에서 선형함수를 이용해서 특성이 다른 두 그룹으로 분리하는 클래시피케이션 방법이고, 후자는 토픽모델링이라고 불리는 클러스터링 방법입니다. 실 서비스에 적용되는 대부분의 수학 알고리즘들이 그렇듯이 LDA도 잘 클러스터링하는 데이터가 있고, 그렇지 못한 것들도 있습니다. 같은 데이터를 사용하더라도 어떤 클러스터들이 비슷한 성질의 것들로 잘 그루핑되지만, 다른 것들은 노이즈가 심한 그룹을 형성하는 것을 확인했습니다. 그래도 LDA가 좋았은 점은 제가 오래 전부터 고민하던 co-clustering 문제를 해결해줬다는 점이고, fuzzy 클러스터링처럼 특정 엔터티가 여러 개의 클러스터에 동시에 속할 수도 있다는 점입니다. (LDA에 대한 자세한 설명은 언제나 그렇듯이 위키피디어를 참고하세요. LDA는 제가 자세히 설명드릴 도리가 없습니다.)

LDA는 학계 및 산업계에서 많이 연구되었고 사용되기 때문에 다양한 오픈소스들이 존재합니다. 대표적인 것이 Yahoo에서 배포한 Yahoo LDA가 있고 (Yahoo LDA GitHub), 지난 글에서 소개했던 Mahout에도 LDA가 구현되어 있습니다. (Mahout LDA 위키페이지) 뿐만 아니라, Java를 사용하는 사용자라면 stand-alone으로 JGibbLDA라는 오픈소스도 존재하고, UMASS에서 배포하는 Mallet (MAchine Learning for LanguagE Tookit)에도 LDA가 구현되어 배포되고 있으니 LDA를 직접 사용해보는 것에는 별 어려움이 없을 것입니다. 빅데이터를 분석한다면 그냥 야후LDA나 마훗LDA를 사용하시면 됩니다. LDA에 최적화를 위한 다양한 구현방식이나 옵션에 대한 설명은 제 능력밖이라 생략합니다.

또 생각해봐야할 주제는 레이팅이 없는 것에 대한 (missing value에 대한) 초기값/기본값을 어떻게 정하느냐 문제가 있습니다. 그냥 CF에서는 초기값이 필요없는데, MF방식을 취한다면 초기값이 필요합니다. 그냥 관념적으로 생각해보면, 여러 번 iteration이 돌아간다면 초기값이 굳이 필요없을지도 모르겠는 생각이 듭니다. (이상은 그냥 개인적 생각일뿐, 검증된 내용은 아닙니다.) 초기값은 그냥 스케일 내에서 랜덤하게 정할 수도 있고, 최소 레이팅값을 주거나 아니면 최대값을 줄 수도 있습니다. 그러나 일반적으로는 전체의 평균값이나, 유저의 평균값, 또는 아이템의 평균값을 주면 됩니다. 조금 더 복잡하게 초기값을 정한다면 전체 평균에 유저 바이어스값을 더하고, 아이템 바이어스값을 더해서 결정할 수도 있습니다. 그냥 요즘 테스트해보고 싶은 것인데... SVD로 분해하고, 상위 고유값만으로 레이팅 매트릭스를 재구성하고, 주어진 레이팅값이 있는 경우에는 원래값으로 치환해서, 다시 SVD로 분해하고, 재구성하고, 치환하고, 분해하고... 를 반복하면 초기값에 관계없이 거의 비슷한 예측 레이팅이 나오지 않을까?라고 의심하고 있습니다.

CBF로 추천아이템 커버리지를 넓히는 방법에서 제가 사용한 한 가지 꼼수를 소개합니다. Top 10개의 아이템을 추천해주더라도, (연관 아이템 기준으로 설명하면) 한 아이템당 2~30개 아이템만 추천후보로 충분합니다. 그런데 같은 속성을 가지는 많은 아이템들이 존재할 때, 임의로 N + alpha 개를 뽑아내는 것이 쉽지 않을 수도 있습니다. 같은 속성을 가지는 10개의 아이템이 있다면 연결수는 10^2, 즉 100이 되고, 100개가 되면 10,000개, 1000개이면 1M개로 기하급수적으로 늘어납니다. 데이터 사이즈가 작을 때는 무시해도 되겠지만, 1000개가 포함된 속성그룹이 수백, 수천개씩 존재한다면 메모리 사용량도 급증하고 함께 증가합니다. 그리고 서두에 말했듯이, 10개의 피추천 아이템이 필요하다면 10 ~ 20개 정도만 추천대상에 올려놓으면 됩니다. 그래서, 한 속성그룹 내의 아이템들을 개수 cardinality 에 비례해서 각 아이템을 랜덤그룹에 인위적으로 배분을 하고, 매핑은 랜덤 그룹 내에서만 이뤄지도록 배정을 합니다. 완벽한 솔루션은 아니지만, data explosion도 막으면서 다양한 아이템들을 추천해주는데 효과가 있었습니다. (나이브하게 적었지만, 이 문제를 직접 경험해본 분이라면 대강 이해가 갈듯합니다.)

그래도 커버리지가 낮다고 생각되면 Transitive Rule을 적용해서 확보하는 방안도 가능하고, 롱테일 아이템들은 더 오랜 기간의 데이터를 모아서 부가적으로 분석/추가하는 것도 가능합니다. 전날의 매핑 데이터를 다음 날 일정비율 반영하는 것도 당연히 가능하고, Reverse 관계 즉 B가 A의 연관아이템이면 A도 B의 연관아이템으로 본다 등의 규칙도 적용이 가능합니다. 무턱대로 커버리지를 확대하기 위해서 이런 저런 방법을 도입하다 보면 자기강화현상이 발생할 수도 있고, 최종적으로 추천된 아이템이 어떻게 해서 추천되었는지 설명할 수 없는 상태에 빠질 수도 있으니 늘 경계해야 합니다. 그리고 유저, 사용자, 메타정보/속성정보들의 다양한 조합/관계를 통해서 무수히 많은 방식으로 추천을 확대할 수 있습니다. 문제만 잘 정의되면 해결책은 따릅니다. 베스트에만 집착하지 말고 가능성에 우선을 두셨으면 합니다. Viability or feasibility is first than optimality.

이제 정말로 이걸로 끝일까요???

추천시스템 전체 목록

  1. 추천 시스템과의 조우 (PR시리즈.1)
  2. 추천 시스템을 위한 데이터 준비 (PR시리즈.2)
  3. 추천대상에 따른 추천 시스템의 분류 (PR시리즈.3)
  4. 알고리즘에 따른 추천 시스템의 분류 (PR시리즈.4)
  5. 추천 시스템을 위한 유사도 측정 방법 (PR시리즈.5)
  6. 추천 시스템의 성능 평가방법 및 고려사항 (PR시리즈.6)
  7. 추천 시스템에서의 랭킹과 필터링 문제 (PR시리즈.7)
  8. 추천 시스템의 쇼핑하우 적용예 (PR시리즈.8)
  9. 개인화 추천 시스템에 대하여 (PR시리즈.9)
  10. 추천 시스템의 부작용 - 필터버블 (PR시리즈.10)
  11. 추천 시스템의 레퍼런스 (PR시리즈.11)
  12. 추천 시스템에 대한 잡다한 생각들 (PR시리즈.12)
  13. 추천 시스템을 위한 하둡 마훗 사용하기 (PR시리즈.13)
  14. 추천 시스템에 대해서 여전히 남은 이야기들 (PR시리즈.14)

==

페이스북 페이지: https://www.facebook.com/unexperienced

반응형