Share           Pin It
지난 글에서 워드임베딩에 대한 생각을 정리하고 딥러닝과 결합해서 개인화 추천에 어떻게 적용할 것인가에 대한 간단한 스케치를 올렸습니다. (참고. 워드임베딩: http://bahnsville.tistory.com/1139, 개인화 추천: http://bahnsville.tistory.com/1141) 오늘은 그런 기술을 딥 개인화 시스템에 적용할 때 예상되는 문제점들에 대해서 생각나는대로 정리하려 합니다.

지난 글에 제시한 딥 개인화 아키텍쳐를 간단히 설명하면 다음과 같습니다.
  1. 텍스트, 이미지, 또는 웹로그 등의 유저 및 아이템 정보/이력에 포함된 개별 항목들을 워드임베딩 기술로 벡터화한다.
  2.  유저/아이템의 정보를 RNN이나 CNN 등으로 정형화된 벡터로 압축한다.
  3. 정형화된 유저벡터와 아이템벡터의 관계를 유저-아이템 interaction log로 학습한다.
  4. 학습된 Latent Vector로 유저-유저, 아이템-아이템, 유저-아이템의 연관도/유사도를 측정한다.
유저-아이템 행렬을 팩토라이즈하는 것이 가능하지만 그것보다 풍부한 유저/아이템 정보를 이용해서 바로 유저/아이템 벡터를 만들 수 있다면 1과 2는 하나의 과정으로 봐도 무관합니다.

위의 과정에서 3과 4는 통상의 ANN 학습방법이나 유사도 연산으로 쉽게 해결되는 부분입니다. 특히 3의 학습에 대한 아이디어는 지난 글에 간략히 언급했습니다. 하지만 1과 2의 Knowledge Representation은 오랫동안 고민했지만 쉽게 답이 나오지 않았습니다. 예전부터 워드임베딩 기술을 사용하면 될 것 같다는 막연한 생각을 가지고 있었지만 따로 공부하지 않아서 더이상 진도가 안 나갔는데, 최근 관련 분야를 공부하면서 가능성을 확인했습니다. 하지만 실제 문제에 적용하는 데는 여전히 해결해야할 장애물들이 많이 있습니다. 공부하면서 여러 힌트는 얻었지만 유저/아이템 벡터로 컨볼루셔한하는 실용적인 방법을 찾지 못했습니다. 워드임베딩 부분과 컨볼루션 부분을 나눠서 예상되는 문제를 정리합니다. 짧은 식견으로 떠오른 어려운 점들이지만 저보다 띄어난 분들은 별로 문제될 것이 없다고 보실 수도 있고 또 많은 연구자들이 관련된 해결책을 이미 내놓은 경우도 많습니다.

워드임베딩
기계학습이라는 것이 최초의 학습데이터로 모델을 만들어두면 영구적으로 사용할 수 있는 것이 아닙니다. 실제 운영하면서 새로 추가되는 데이터로 주기적으로 모델을 업데이트해줘야 합니다. 새로운 데이터가 추가될 때 모델의 구조가 바뀌지 않으면 단순히 (hyper-)파라메터들만 업데이트해주면 되겠지만, 워드임베딩의 경우 모델의 구조가 함께 바뀌기 때문에 전체 모델을 새롭게 빌딩하고 관련된 시스템 전체를 바꿔줘야 합니다. 새로운 텍스트에는 기존 학습 데이터에는 없던 신조어가 있습니다. 보통 OOV (out-of-vocabulary)라는 특수한 태그로 처리하지만, 데이터 양이 많아지면서 모든 신조어를 OOV로 처리할 수도 없고 중요한 신조어는 새롭게 사전에 추가해야 합니다. 기존 사전에 10,000개의 단어가 있었는데, 여기에 한개의 단어를 더 추가하는 것은 별 문제가 안 될 것 같지만, one-hot encoding에서 데이터 차원을 1만큼 증가시켜야 하고 그에 따라서 전체 가중치 W를 재계산해야 합니다.

일반적인 텍스트 문서 분석의 경우 몇달, 몇년치의 데이터를 모으더라도 추가되는 신조어의 수가 기존 사전 사이즈에 비해서 별로 크지 않아서 오랜 기간동안 OOV로 처리해도 시스템의 예측력에 큰 해를 주지 않습니다. 하지만 대형 쇼핑몰에서 상품을 추천해주는 경우라면 매년 추가되는 신상품의 수도 많을 뿐더러, 핫한 추천 대상이 돼야할 신상품을 사전에 추가하지 않을 수가 없습니다. 일반적인 텍스트 컨텐츠로 확대해서 유저의 검색쿼리나 방문했던 사이트를 기반으로 추천하겠다고 가정한다면, 매일 기존에 없던 수많은 새로운 패턴의 검색어가 등장하고 뉴스 기사만 하더라도 매일 수천건 이상이 새로 생깁니다. (새로운 문서 = 새로운 URL) 해외의 뉴스도 포함하고 블로그 등의 소셜미디어를 고려한다면 매일 추가되는 신종 아이템이 넘쳐납니다. 즉 사전 사이즈가 감당할 수 없을만큼 커지고, 그에 따라서 매번 모델을 새로 구축해야 합니다.

컴퓨팅 파워가 받쳐주더라도 학습 데이터를 무작정 누적해서 사용할 수도 없습니다. 오래된 것은 버리고 새로운 데이터로만 학습할 필요가 생깁니다. 신조어가 생기듯이 필요없어지는 단어가 생깁니다. 즉, 사전에서 빼주는 작업이 발생합니다. 사전의 구조가 바뀌면 당연히 모델을 새로 학습해야 합니다. 그리고 미리 정의된 사전이 아니라 매번 학습 데이터 (텍스트)에서 사전을 동적으로 구축하는 경우라면 모델 재구축은 필수입니다. 모델을 학습하는 것은 모델을 기반으로 예측하는 것에 비해서 리소스가 많이 들어가는 작업입니다. 그래서 재구축 주기를 너무 짧게 가져갈 수도 없습니다. 또 주기가 길어지면 OOV가 증가합니다. 상품이나 컨텐츠 추천에서는 OOV에 해당하는 신상이나 최신글이 가장 중요할텐데, 업데이트 주기를 기다리는 동안에는 유저의 프로필 (관심사)에 반영하지 못하는 어처구니없는 상황이 발생합니다.

그리고 이건 실제 작업해봐야 알겠지만, 사전 사이즈를 어느 수준까지 크게 가져가도 컴퓨팅이나 전체 시스템 성능에 영향을 주지 않을 것인가도 고민이 됩니다. 옥스포드 영어 사진에 약 17만건의 영단어가 등록돼있다고 합니다. 인터넷에서의 유저가 한 행동 이력으로 유저 프로파일을 만든다면 다양한 조합의 검색어, 접속했던 문서 (URL), 웹에서의 다양한 활동 등을 모두 사전에 추가한다면 세상의 모든 언어가 가진 단어의 수보다는 가늠할 수 없을만큼 훨씬 많아질텐데, 과연 그런 규모의 사전을 워드임베딩하는데 저비용으로 가능할까에 대한 의문도 듭니다. 여지껏 전체 웹 단위에서 상상을 펼쳤기 때문에 무모한 논쟁이기도 합니다. 각자 서비스 내에서의 추천/개인화를 위해서 데이터의 종류와 양을 잘 제한하면 이건 그저 기우일 뿐입니다. (학교에 있을 때는 웹 전체의 문서를 클러스터링해보고 싶다는 막연한 생각을 했었는데, 여전히 그런 버릇에서 못 벗어난 듯...)

사전에 색인된 단어 순서가 바뀌지 않고 상대적으로 적은 양의 신조어가 추가만 된다면 (또는 일부 불필요한 단어가 색인 순서는 그대로 둔 채 제외한다면) 가능한 기존의 워드임베딩 결과를 유지하면서 새로운 사전을 학습시킬 수 없을까에 대한 고민도 있습니다. 예를 들어, 원래 사전이 {A, B, C, D, E, F, G, H, I, J}로 총 10개의 단어로 구성됐는데, 신조어 K가 추가돼서 {A, B, ..., J, K}로 11개로 변경됐다고 가정합니다. 원래 사전에서 A는 [1 0 0 0 0 0 0 0 0 0]' (0이 9개)로 one-hot 인코딩으로 표현할 수 있고, 이를 워드임베딩했을 때 결과가 [0.7 0.5 0.9]가 된다면, 새로운 사전에서 A는 [1 0 0 0 0 0 0 0 0 0 0]' (0이 10개)로 표현하고 그 워드임베딩 결과가 기존의 [0.7 0.5 0.9]와 크게 다르지 않게 학습시킨다면 어느 정도의 신조어가 사전에 추가되더라고 굳이 기존의 모든 단어들을 재계산할 필요가 없어지고, 기존 단어들로만 구성된 유저/아이템 벡터는 별도 업데이트가 필요치 않을 수도 있겠다는 생각도 듭니다. 하지만, 어차피 신조어의 벡터를 구하기 위해서 전체 단어의 재학습 및 결과는 함께 진행되기 때문에 조금 불필요한 고민이었던 것 같습니다. 하지만 외부 환경이 조금 변경됐을 때 굳이 전체 시스템에 영향을 주지 않는 robust한 방법에 대한 고민은 여전히 필요합니다.

컨볼루션
지난 글에서 소개했던 Collobert의 논문을 보면서 처음에는 컨볼루션으로 유저 및 아이템 벡터를 쉽게 만들 수 있겠다는 생각을 했습니다. (참고 논문: http://www.jmlr.org/papers/volume12/collobert11a/collobert11a.pdf하지만 텍스트 문장에 적용했던 기술을 유저 및 아이템 프로파일에 그대로 적용하는 데는 문제가 있음을 바로 깨달았습니다. 텍스트 문장 (문서가 아님)은 보통 1~20단어로 구성돼있고, 많아봤자 100단어를 넘지 않습니다. 일단 단어의 개수가 많지 않고 개수의 분포도 (상대적으로) 일정하다고 볼 수 있습니다. 추천할 아이템 (컨텐츠)의 프로파일은 다소 길겠지만 길이에 제한이 있습니다. 하지만 유저 프로파일의 경우 쉽게 가늠이 되지 않습니다. (사용자가 입력한 검색쿼리, 접속한 URL 등을 모두 한 단어로 가정함) 두가지 포인트를 지적했는데, 프로파일의 길이가 길다는 것과 길이의 편차가 크다는 것입니다. 길이가 길더라도 편차가 적다면 복잡하더라도 하나의 scheme으로 압축할 수 있을텐데, 길이가 천차만별이면 고민이 깊어집니다. 큰 이미지라면 강제로 사이즈를 줄이고 원하는 비율로 crop해서 사용하면 되는데, 텍스트 문서는 이런 방식이 불가합니다.

앞의 논문에서는 인접한 단어 벡터 (워드임베딩)들을 컨볼루션하고, 컨볼루션된 것들 중에서 각 열의 최대값 (max-pooling)을 취합니다. 단어의 수가 별로 많지 않기 때문에 max-pooling을 하더라도 다양한 결과값이 만들어집니다. 하지만 단어가 많아지면 각 행의 max값들이 모두 비슷해질 가능성이 높아집니다. 예를 들어, [0 1] 사이의 랜덤 넘버 10개 중에서 max값은 1.0이 될 수도 있지만 0.7이나 0.8, 심지어 0.1도 될 가능성도 꽤 있습니다. 하지만, 10,000개의 랜덤 넘버 중에서 max값을 취하면 대부분 0.9 ~ 1.0이 될 것입니다. 문장 단위에서 convolution+max-pooling이 잘 동작하더라도 문서 (유저의 행동 이력) 단위에서는 불가능하다는 것입니다. 즉, 결과 유저 벡터들이 모두 유사해지고, 추천의 variance가 없어진다는 의미입니다. 문서의 길이가 길더라도 길이가 일정하면 동일한 조건으로 큰 컴볼루션 window 사이즈를 취하거나 여러 겹의 컴볼루션 레이어를 두는 식으로 해결책이 존재하겠지만, 길이가 일정하지 않으면... 어떤 논문을 보면 varying-size convolution filter를 사용하는 경우가 있어서 컨볼루션을 잘 설계하면 돌파구가 있을 듯도 합니다. (참고. https://arxiv.org/pdf/1604.06338.pdf) 부트스트랩하듯이 그냥 임의의 벡터를 선택해서 컨보루션 & 풀링하는 것도 생각해봤지만 이건 그냥 애초에 입력 데이터를 랜덤하게 선택해서 진행하는 것이 더 나을 것이고, 알고리즘의 일관성을 확보할 수가 없습니다. (역으로 짧은 입력 데이터를 임의로 확장하는 것도 별로...) Pooling층에서 같은 위치의 벡터 엘리먼트 sequence를 time series로 가정하고 wavelet (Fourier Transformation)으로 pooling하는 것도 가능하지 않을까?라는 생각도 듭니다.

유저의 행동 이력을 시간순으로 나열해서 RNN을 이용하는 방법도 생각해봤습니다. RNN이 CNN보다는 길이의 가변성에 더 유연합니다. 하지만 RNN도 문장이 아닌 문서 단위에서도 제대로 동작할지 의문이 듭니다. RNN은 개념적으로 이전까지의 결과 (이전의 모든 단어의 sum)과 현재 단어를 일종의 weighted sum하는 것입니다. (개념적으로 설명하면 그렇다는 것임) 이런 추론에 따르면 최신 행동 이력에 가중치를 부여하는 방식이라는 장점이 있지만, 역으로 과거 이력을 무시해버릴 가능성도 있어 보입니다. 예를 들어, 어떤 유저가 '제주도, 제주도 맛집, 제주도 펜션, ...., 제주도 항공권' 등의 키워드로 95회 검색하고 가장 마지막에 '포켓몬 고' 관련해서 5회 검색했다면 이 유저의 관심사가 제주도 여행보다 포켓몬 고로 표현될 가능성이 있습니다. 실제 RNN이 이런 식으로 작동하지 않겠지만, 통상의 RNN의 구조로 유추하면 그렇다는 것입니다. 최근 RNN에서 많이 사용하는 LSTM을 사용하면 또 다른 가능성이 있지 않을까라는 또 기대를 걸어봅니다. (LSTM을 설명한 번역글: http://whydsp.org/280) LSTM를 포함한 텍스트 또는 시퀀스 데이터를 위한 딥러닝 기술을 좀더 공부해봐야겠습니다. 아직 읽어보지는 않았지만 word2vec을 만든 Mikolov가 공저자로 참여한 논문 (http://cs.stanford.edu/~quocle/paragraph_vector.pdf)은 문장/문서의 paragraph vector를 만드는 걸 제안했고, Weinberger et al.은 feature를 hashing하는 방법도 소개했습니다 (https://arxiv.org/pdf/0902.2206.pdf). 여러 논문들을 훑어봤지만 아직 만족스럽지가 않습니다. 만족할 솔루션을 찾았다면 이런 글을 적지도 않았겠지만...

길이가 다소 일정한/제한적인 아이템 벡터보다는 가변적이고 긴 유저 벡터를 만드는 것이 고민이라고 적었습니다. 그런데 문제가 되는 유저는 전체 중에서 극히 일부 (10%미만?)에 해당하는 헤비 유저들 가능성이 큽니다. 이들 일부 유저 데이터만 제한하면 전체 시스템 측면에서는 이점이 있을 수 있습니다. 가장 쉬운 방법으로는 최근의 T기간 또는 N개의 최근 데이터만 사용할 수 있습니다. 추천에서는 최신 데이터에 대한 민감도가 중요하기에 쉽지만 괜찮은 방법입니다. 하지만 헤비유저의 과거 이력에 나타난 오래된 관심사를 반영하지 못할 수도 있다는 우려도 있지만, 오래된 관심사라면 최근 행동에도 반영됐을 가능성도 높고 또 고정 관심사와 연관된 새로운 행동을 통해서 빠르게 업데이트된다면 freshness를 고려하면 헤비유저의 반감이 적을 수도 있겠다는 생각이 듭니다. 그리고 만약 고정된/오래된 관심사라면 이 글에서 제시한 방법에 더해서 별도의 필터링을 위한 유저 관심사 (또는 성별, 연령과 같은 고정된 정보)를 구축해서 하이브리드/퓨젼으로 추천 및 필터링하는 것도 가능합니다.

랜덤 샘플링을 통해서 제한된 정보만 사용하는 것도 고려할 수 있습니다. 모든 물고기를 잡을 수 없다면 큰 물고기라도 잡아야 한다. (어차피 다양한 오프라인 테스트와 온라인 A/B 테스트를 통해서 generalization error가 적은 방식을 택하면 됩니다.) 앞서 소개한 Phan et al.의 논문에서 varying-size 컨볼루션 필터 방식 등을 더 고민해보면 좋은 해결책이 나오리라고 봅니다. 그리고, session이나 period (day-by-day)를 나눠서 별도의 컨볼루션을 만들고 그것들을 다시 컨볼루션해서 최종 벡터를 만들어내는 방식 (또는 세션 단위로 recurrent하는 방식)도 가능성이 있습니다. 또는 임베딩 벡터로 유사도 계산, 클러스터링, 및 topic modeling 등을 통해서 데이터를 축소하는 것도 좋은 접근법입니다. 작은 문제에서 은닉층을 2개 이상 가져가는 것도 버거웠던 시절이 있었지만 지금은 입력 데이터의 차원도 훨씬 커졌고 은닉층의 개수도 훨씬 많아져도 딥러닝을 성공하게 만든 breakthrough가 있었듯이, 이 문제/해결책도 좀 복잡해졌지만 조만간 깔끔하게 해결되리라 봅니다.

그리고, 저는 광고랭킹을 염두에 두고 가능한 유저의 모든 정보와 이력을 모아서 활용하겠다는 관점에서 생각하고 있지만, 특수한 서비스를 위한 추천이라면 데이터의 종류와 양이 충분히 다룰 수 있을만할 거라 봅니다. 광고에서는 유저가 어떤 서비스에서 어떤 활동을 했고 또 어떤 컨텐츠를 조회했는지 등의 모든 정보를 바탕으로 유저 프로파일을 만들어 활용하겠지만, 일반 쇼핑몰에서 상품을 추천하는 경우라면 기존의 CF 등에서 활용하는 수준의 유저별로 조회한 상품 목록만으로도 충분합니다. 자신이 속한 비즈니스 도메인 및 가용 데이터에 따라서 손쉬운 해결책이 존재하고, 이상의 고민이 불필요할 수도 있으니 새로운 접근법을 지나치게 거부할 필요가 없습니다. 서비스/비즈니스 도멘인을 한정하듯이 유저 정보의 종류를 한정하는 것도 방법이 될 수 있습니다. 유저가 검색한 쿼리만으로 유저벡터를 만들겠다거나, 개별서비스에서 정의한 카테고리 (공통의 카테고리일 필요는 없음)의 리스트만 활용하겠다거나, 긴글을 조회한 경우나 댓글 등의 조회 이상을 한 액션이뤄진 URL만을 대상으로 삼는다거나 등의 여러 제약 조건을 데이터를 한정할 수도 있습니다. 제가 이 글에 적었다고 해서 모든 방법이 유효하다는 것은 아닙니다. 단지 생각나는 것을 나열한 것입니다.

지금 바로 내 눈 앞에 보이지 않을 뿐이지 나와 비슷한 문제로 고민했던 수많은 연구/개발자들이 존재하고 있으니 일부는 이미 깔끔한 해결책을 찾아서 알려주고 있습니다. 미래는 이미 우리 곁에 와있지만 인식하지 못할 뿐이다라는 문구와 같이 많은 경우에 우리가 가진 문제의 해결책도 이미 누군가가 풀어놨는데 제대로 인지하지 못하고 있을 뿐입니다. 아직 검증하지도 않은 이런 아이디어를 글로 적는 것도 누군가에게 해결의 실마리를 줄 수 있지 않을까?라는 기대 때문이고, 이를 바탕으로 더 좋은 아이디어로 문제를 해결하고 그 과정과 결과를 논문이나 코드 등으로 공개한다면 조금은 더 좋은 세상이 되리라 기대합니다. 제 생각은 완벽한 해결책도 아니고 논의의 시작점도 아닙니다. 그저 이런 논의의 과정으로 더 많은 문제들의 해결책이 나왔으면 하는 바람일 뿐입니다. 그래서 때론 어리석은 생각도 적고 또 공개/공유하는 것입니다.

===
B: https://brunch.co.kr/@jejugrapher
F: https://www.facebook.com/unexperienced


댓글을 달아 주세요

Share           Pin It
Word Embedding, Factorization, and Personalization
여러 가지 개념이 혼재돼있습니다. 단어의 원래 뜻과 다르게 해석한 여지가 있습니다. 이 글에서 설명한 것이 절대적으로 맞다고 생각하면 위험합니다. 저는 제게 필요한 것으로 아전인수격으로 정의, 사용했을 개연성이 높음을 미리 경고합니다. 한글화된 용어를 별로 좋아하지 않지만 필요에 따라서 (국내에서 통상적으로 사용하는 경우) 일부 용어는 한글화했습니다.

2017년은 나름 공부하는 해로 정하고 그동안 미뤄놨던 논문들을 읽기 시작했습니다. 벌써 4주차가 됐는데도 여전히 논문을 읽고 있으니 지금의 흐름은 나름 오래 갈 것 같습니다. 한동안은 업무에 필요하거나 주목받은 논문 한두편을 짧게 읽은 적은 있지만, 연구실에 있을 때처럼 그냥 손에 잡히는 논문이나 엮인 논문들을 계속 읽어가는 것은 참 오랜만입니다. 아무래도 딥러닝이나 AI와 관련된 논문들을 많이 읽고 또 오픈소스나 라이브러리를 내려받아서 실행해보는 것을 한동안 계속할 예정입니다.

최근에 관심있게 보고 있는 논문은 워드 임베딩 Word Embedding 관련 논문입니다. 더 구체적으로 2013년에 처음 소개된 후로 많은 연구자들과 개발자들의 주목을 받은 Word2Vec과 후속의 관련 논문들입니다. Word2Vec은 딥러닝 커뮤니티에서 자주 언급되는데, 학습 구조상으로 인공신경망 ANN을 닮았지만 엄밀히 딥러닝의 범주에 넣기에는 구조가 매우 간단합니다. 사전 (또는 vocabulary) 사이즈의 one-hot 인코딩을 인풋으로 받기 때문에 통상의 딥러닝의 인풋에 견줄만하지만 은닉층 hidden layer이 하나뿐인 매우 간단한 shallow 네트워크입니다. 그리고 인닉층의 activation function도 통상의 sigmoid나 ReLU 등의 비선형 함수가 아닌 그냥 선형함수를 사용하는 가장 심플한 MLP의 구조를 따르는, 그리고 딥러닝에서 pre-training에 많이 사용하는 auto-encoder를 많이 닮았습니다.

Word2Vec은 CBOW continuous bag of words나 skip-gram으로 학습을 하는데, 이것에 대한 자세한 설명은 생략합니다 (다음의 링크 참조). 그리고 word2vec의 메커니즘을 자세히 알고 싶은 분들은 word2vec을 처음 제안했던 Mikolov의 2013년 논문을 찾아보기 보다는 이후에 나왔던 Xin Rong의 'word2vec Parameter Learning Explained http://www-personal.umich.edu/~ronxin/pdf/w2vexp.pdf'를 찾아서 읽어볼 것을 권합니다. word2vec의 구조와 parameter update 방법/수식 등을 친절히 설명해놨습니다. (배경 지식없이 Mikolov의 논문을 보면 좀 욕 나옴.)

word2vec이 word embedding을 효과적으로 구현해서 많은 이들의 주목을 받은 후에, GloVe라는 알고리즘도 등장했습니다. (참고. GloVe: Global Vectors for Word Representation http://www-nlp.stanford.edu/pubs/glove.pdf) 자료를 찾아보면 GloVe가 단어를 벡터로 표현하는데 word2vec보다 낫다는 평도 있습니다. 일반적인 입장에서 볼 때 word2vec과 glove는 큰 차이는 없는 것같고, 필요하다면 둘 다 테스트해보고 자신의 문제에 더 맞는 것을 선택하면 됩니다. 이 둘이 어떤 차이가 있을까?를 조사하면서 'don't count, predict! http://www.aclweb.org/anthology/P14-1023'라는 논문을 읽었는데, 이 논문에서 word embedding 또는 word representation의 두가지 방식을 잘 설명해줍니다. (논문의 결론은 GloVe의 counting보다는 word2vec의 predictive가 더 낫다고...)

전통적으로 word embedding은 counting에 기반합니다. 보통 VSM vector space model로 알려진 N x M의 word-document matrix나 word co-occurrence를 표현한 N x N matrix를 만드는 것은 counting방식입니다. NM행렬은 문서로 단어를 표현하고, NN 행렬은 다른 단어로 단어를 벡터로 표현한 것입니다. 그런데, 이런 단어벡터는 보통 수십만 이상의 고차원으로 정의되기 때문에 데이터를 저장한다거나 벡터 연산을 하는데 실효성/실용성이 떨어집니다. 그래서 dimension reduction 기법을 사용해서 고차원 벡터의 의미를 최대한 유지하면서 저장공간도 줄이고 연산도 쉽게하는 저차원 벡터로 만듭니다. 그렇게 저차원의 단어 벡터가 통상 말하는 word embedding입니다.

저차원으로 줄이는 방식은 단어를 특정 카테고리로 매핑해서 카테고리 벡터로 표현하는 syntactic 방식이 생각하기에 가장 쉬운 방식일 듯합니다. 하지만 인위적으로 카테고리를 정하는 것이 만만치가 않고, 또 단어를 카테고리로 매핑하는 방식도 쉽다고는 말하기 어렵습니다. 물론 분류 classification 알고리즘을 사용하면 된다라고 설명하면 되지만... 서비스를 기획/개발하면서 카테고리 작업을 해보신 분들은 카테고리를 잘 정의하면 여러모로 좋다는 것은 잘 알지만, 그걸 깔끔하게 잘 만들기가 매우 어렵다는 것을 압니다. 처음에는 카테고리를 잘 정의했다고 생각하지만, 나중에 이상한 새로운 데이터가 출현했을 때 기존 카테고리와 맞지 않는 문제도 있고, 카테고리를 어느만큼 세밀하게 정의할 것인가 등의 많은 이슈들이 터져나옵니다.

Supervised 분류가 어렵다면, unsupervised를 고려할 수 있습니다. 그래서 클러스터 방식을 사용해서 군집화합니다. 그렇게 만들어진 클러스터1부터 클러스터c까지 매핑하면 c차원의 벡터를 만들 수 있습니다. 하지만, 클러스터 방식은 만들어진 벡터의 robustness에 의문이 생깁니다. 학습데이터가 바뀔 때마다 각각의 데이터가 다른 클러스터로 군집되면 같은 데이터가 다른 벡터로 표현될 수가 있다는 의미입니다. 그래서 기존의 클러스터 구조를 유지하면서 새로운 데이터를 수용할 수 있는 방식이 필요합니다. 그리고 클러스터는 분류와 개념상 더 비슷한/연결고리가 있는 것이라서 먼저 설명했지만, 가장 일반적인 방식은 PCA principle component analysis입니다. PCA는 행렬에서 고유값/고유벡터를 찾아서  분해하는 SVD singular value decomposition 메커니즘을 기본적으로 따릅니다. 이 SVD를 텍스트 마이닝에 바로 적용한 것이 보통 LSA/LSI Latent Semantic Analysis/Indexing입니다. PCA에서 principle과 SVD애서 singular,  LSA의 latent, 그리고 행렬의 eigen(고유)이 결국 같은 걸 의미합니다. 이를 통해서 고차원의 행렬을 저차원의 행렬들로 분해합니다.

SVD와 같이 행렬을 저차원으로 행렬의 곱으로 분해하는 것을 보통 matrix factoriztion이라고 합니다. 즉 행렬을 인수분해하는 것입니다. SVD는 3개의 행렬로 분해하지만, 최근에는 그냥 2개의 저차원 행렬로 분해하는 여러 방식도 많이 제안됐습니다. 대표적으로 Non-negative Matrix Factorization인데, 이는 원래 고차원 행렬과 저차원 행렬 모두 음수가 아닌 값으로 채워지도록 분해하기 때문에 붙여진 이름입니다. 어쨌든 NMF를 사용하면 고차원 행렬을 2개의 저차원 행렬의 곱으로 표현할 수 있습니다. Word-document matrix를 SVD로 인수분해하든 NMF로 인수분해하든 word 쪽의 저차원 매트릭스를 단어 벡터로 볼 수 있습니다. 이렇게 여러 가지 방법으로 저차원의 단어벡터를 만들 수 있습니다.

다시 counting vs predictve로 돌아가서, 이상에서 길게 설명한 word-document matrix 또는 word-co-occurrence matrix를 factorization하든 카테고리로 매핑하든 클러스터로 묶든 이런 co-occurrence 데이터로 단어벡터를 만드는 것이 counting 방식입니다. 반대로 word2vec은 알고 싶은 단어의 주변 context 단어들의 벡터로 표현하는 것이 predictive 방식입니다. 즉 컨텍스트로 의미를 유추/예측한다는 뜻입니다. 그런데, counting 방식에서 co-occurrence의 카운팅을 문서나 문장 단위가 아니라, word2vec처럼 로컬의 컨텍스트 단어로 window를 축소해서 계산한다면 counting방식이 predictve방식과 큰 차이가 날까?라는 의심이 듭니다. Co-occurrence를 카운팅할 때 global하게 볼 것인가 아니면 local로 볼 것인가의 차이인 듯도 한데... 실제 co-occurrence matrix를 로컬의 context만으로 표현할 수 있습니다. Window 사이즈를 어떻게 잡느냐에 따라서 로컬 정보만을 취할 수도 있고 글로벌 정보를 취할 수도 있습니다. 이건 k-NN에서 k의 값을 어떻게 잡느냐에 따라서 민감도가 달라지는 것과 크게 달라보이지 않습니다. 물론 연산방식이 달라서 결과가 다르게 나올 것 같지만, word2vec에서 사용하는 context만으로 co-occurrence를 구해서 MF든 GloVe든 구하면 결과가 얼마나 많이 다를지 살짝 의문이 듭니다.

... 제가 이런 고차원의 단어 벡터를 저차원의 단어 벡터로 표현하는 것에 관심을 가지는 것은 본격적으로 NLP나 텍스트 마이닝을 하겠다는 것보다는 예전부터 계속 해왔던 추천 그리고 광고랭킹에 이런 기술을 적용해서 효과를 낼 수 있다는 가능성 때문입니다. 단순히 사용자가 봤던 상품/컨텐츠 ID의 시퀀스를 word2vec이든 GloVe 알고리즘에 인풋으로 넣으면 상품/컨텐츠ID의 벡터가 나오고, 그 벡터의 유사도 계산을 통해서 관련상품 또는 관련 컨텐츠는 쉽게 추천해줄 수 있습니다. 기존에 사용하든 CF나 MF 방식도 결국 이걸 구현했던 것이니 별반 차이가 없습니다. 컨텐츠ID를 벡터로 표현해서 바로 적용하는 것도 있지만, 사용자의 벡터화를 통해서 개인화 추천에 바로 적용할 수도 있습니다. 첫째는 유사 사용자를 벡터 연산으로 바로 찾아낼 수도 있고, 사용자 벡터와 컨텐츠 벡터의 관계를 Neural Translation에서 사용한 것과 유사한 방식으로 찾아낼 수도 있습니다. 그리고, MF 추천 방식에서 원래 사용자 벡터와 컨텐츠 벡터의 곱으로 연관성을 측정했습니다.

현재 추천이나 광고랭킹 시스템이 고도화됐더라도 한 사용자의 모든 활동 이력을 raw data 수준으로 활용하는 곳은 별로 없다고 봅니다. 성별이나 연령, 또는 관심사 등으로 뭉뚱그려서 (앞서 설명한 카테고리 방식) 개인을 설명합니다. 그러다 보면 추정이 잘못된 경우도 빈번하고 카테고리에서 설명했듯이 개인의 히스토리가 온전히 카테고리로 매핑되지도 않습니다. 그리고 역으로 raw 데이터를 그대로 활용해서 추천에 이용하는 것이 가능하더라도 raw 데이터에는 outlier가 포함돼서 어느 정도는 데이터를 뭉게는 과정이 필요합니다. 사용자의 이력을 엄청나게 긴 벡터라고 생각한다면 이를 적절히 짧은 벡터로 만들 수 있다면 활용성은 무궁무진해집니다.

사람이든 객체든 그걸 설명하는 데이터를 앞으로 엄청나게 많아 질 것입니다. 하지만 데이터가 많아진다고 해서 그걸 모두 적절히 활용한다는 것은 아닙니다. 빅데이터라는 신드롬에 편승해서 데이터가 모이기만 하면 가치가 만들어지는 것 같은 신기루에 빠졌습니다. 하지만 모든 데이터는 적절히 관리돼고 또 처리될 수 있는 수준으로 압출돼야 비로소 가치적 행위로 이어집니다. 물론 고차원의 데이터를 그대로 활용할 수 있다면 문제가 없겠지만, 아직은 많은 곳에서는 적절한 양으로 요약해야 제대로 사용할 수 있습니다. 고차원의 데이터가 손실없이 저차원으로 표현된다면... 그런 측면에서 계속 word embedding 기술도 탐독했고 각종 factorization이나 dimension reduction 기술을 공부하고 있습니다. (하지만, 전 그걸 코드화하는 것에 참 부족해서... 그냥 늘 머리 속으로 공부만... 다행히 요즘은 오픈소스가 잘 돼있어서 직접 구현할 필요가 많이 줄어들었습니다. 하지만 가끔은 그걸 이용하는 게 더 귀찮을 때도... 최근 움직임 중 하나는 클라우드를 AIaaS로 활용하는 것도 있지만 좀 경계는해야 할 듯...)

오랫동안 여러 논문들을 읽으면서 여러 번 글을 적고 싶었지만 오늘 다양한 주제를 하나의 글로 만들었습니다. 여러 개념들이 일반적으로 통용되는 것과 다른 식으로 표현돼거나 또는 곡해한 부분이 있을 수 있습니다. 제 나름의 시각에서 해석한 것들이 많기 때문에, 이걸 원래 가지고 있던 의미를 다시 확인해보거나 자신의 문제나 시각에 맞도록 재해석하는 것이 필요합니다. 그것까지 제가 해줄 수는 없습니다. 물론 관련해서 도움을 요청한다면 또 다른 저의 시각에서 조언은 해줄 수는 있을지도...

word2vec을 다루는 많은 글들이 있습니다. 하지만 참 부족하다고 느꼈습니다. 단순히 word2vec의 결과로 벡터 연산을 할 수 있다느니 아니면 단순히 word2vec 오픈소스를 사용하는 방법만을 설명해놓은 중복된 정보가 너무 많습니다. 제가 늘 아쉬웠던 것은 실제 word2vec이 어떤 메커니즘/수식을 통해서 도출되는지였는데, 다행히 앞서 언급했던 논문 (word2vec explained)에서 많은 궁금증을 해결했습니다. 뿐만 아니라, word2vec을 통해서 단순히 단어의 벡터 연산 이상으로 어떤 곳에 어떻게 활용했는지를 정리한 글도 별로 보지 못했습니다. 인터넷이라는 공간이 긍정적인 면도 많지만, 때로는 너무 한쪽에 치우친 정보만이 넘쳐나는 공간이 돼는 듯도 해서 안타까움도 있습니다. 제가 많이 알지도 못하고 글재주도 부족하지만 조금은 다른 측면에서 글을 적으려는 이유도 이런 안타까움이 한몫했습니다.

다시 경고하지만, 제가 틀린 것을 적었을 수도 있습니다. 제가 이해한 것을 적은 것이니 잘못된 것은 걸러들으시고 또 알려주시면 감사하겠습니다.

===
B: https://brunch.co.kr/@jejugrapher
F: https://www.facebook.com/unexperienced


댓글을 달아 주세요

Share           Pin It
다음의 모바일 시작 페이지(이하, 엠탑)에 노출되는 '나를 위한 추천 뉴스'라는 서비스를 오픈한지도 이제 약 10개월이 다 되어 갑니다. 서비스를 오픈한 후에 서비스를 준비하면서 그리고 오픈하면서 느꼈던 소감을 조금 우울하게 적었고 (참고. '나를 위한 추천 뉴스' 후에), 약 두달 후에 이 글을 참조한 블로그 글을 본 후에 조금 방어적인 글을 다시 적었습니다. (참고. '나를 위한 추천 뉴스' A/S)

서비스를 운영한지 1년정도 된 시점에 다시 서비스를 리뷰해보는 것도 좋을 것같습니다라고 글을 적었지만, 어제 서비스 장애가 발생해서 뉴스 추천 또는 개인화가 효과가 있는가?에 대한 답을 얻은 것같아서 공유하려고 합니다.

뉴스 추천 또는 뉴스 개인화를 준비하면서 주변에서 가장 많이 들은 내용은 뉴스는 개인화하면 안 된다는 얘기였습니다. 적당히 취향이 다른 그룹별로 다른 뉴스를 제공해주는 것은 의미가 있어도, 개인별 맞춤 뉴스는 어려울 것이다라는 늬앙스였습니다. 특히 대한민국 사람들은 자신이 보고 싶어하는 뉴스보다는 남들이 많이 본 뉴스에 관심을 가진다라는 그런 속설을 뉴스 서비스를 기획/개발하는 사람들도 다분히 가지고 있었습니다. 오픈 초기에 PV가 제대로 나오지 않아서 그런 속설을 확인한 것같아서 실망도 했지만, 기대한 PV를 내지 못했던 것은 그런 속설이나 추천 데이터/알고리즘의 문제보다는 노출 영역이 더 큰 영향을 줬습니다.

아래의 그래프는 지난 10개월동안의 일간 PV의 변화를 보여줍니다. (대외비로 절대 수치는 생략) 오픈 초기에는 다소 실망스러웠지만 차츰 PV가 증가하는 것을 볼 수 있었습니다. 첫오픈에서 엠탑의 두번째 탭에서 하단에 위치했기 때문에 많은 고객들이 서비스의 존재 자체도 확인하기 어려웠습니다. 그래서 PV가 다소(? 많이) 낮았다고 이유를 댔습니다. 사람들이 서비스를 인지하고 점차 사용량이 늘어나던 시점에 엠탑의 3번째 탭으로 밀려나면서 다시 PV 상승이 잠시 주춤했고, 몇 달 후에 개별 기사뷰 하단에 개인화 뉴스가 제공되면서 또 PV상승이 주춤했습니다. (아래 그래프는 엠탑의 PV를 보여주기 때문에 개별 기사뷰에서 소비되는 PV는 표시되지 않음) 중간에 몇번의 파라메터 최적화 등의 작은 개선도 있었고, 그렇게 10개월을 보낸 최근에 가장 많은 일간 PV를 기록하고 있었습니다.


그런데, 그래프의 마지막에 보시듯이 어제 PV가 급격하게 줄어들었습니다. 지난 주말에 데이터 센터 변경 등의 이유로 일부 데이터가 제대로 연동되지 못했지만, 너무 급격하게 떨어져서 처음에는 엠탑의 PV 로그를 수집하는 서버에 문제가 발생한 줄 알았습니다. 그런데 제게 추천되는 뉴스 목록을 확인하니 뭔가 이상한 것을 발견했습니다. 저는 주로 해외축구와 IT뉴스를 많이 보기 때문에, 추천뉴스도 대부분 그런 것입니다. 특히 지난 밤에는 챔피언스리그가 열렸는데, 관련 기사가 한건도 추천되지 않았다는 점이 너무 이상했습니다. 로그 수집기에 문제가 있는 것이 아니라, 추천 엔진에 문제가 있다는 것을 직감했습니다. 실제 확인 결과 개인별 추천 기사가 노출되고 있지 않고, 최신 기사 위주의 디폴트 (콜드스타트) 결과가 노출되고 있는 것을 확인했습니다.

불행 중 다행인 것은 이번 장애를 통해서 추천 기사가 충분히 효과가 있다는 것을 확인했다는 점입니다. 앞서 말했던 속설도 뒤집을 수 있고, 향후에 다양한 서비스에서 데이터를 기반으로 한 추천 및 개인화를 더 적극적으로 활용할 수 있다는 가능성을 확인할 수 있었습니다. 문제를 수정한 후에 다시 PV가 예전과 비슷하게 올라가는 것을 확인했습니다.

아래의 그래프는 지난주 (3/11, 파란선)와 어제 (3/17, 노란선)의 10분단위 PV와 오늘 (3/18, 녹색 막대 그래프)의 PV를 표시한 것입니다. 어제 오후 4시경 부터 PV가 전부대비 1/3 ~ 1/2로 줄어든 것을 확인할 수 있습니다. 줄어든 PV는 문제가 해결된 12시경까지 이어졌습니다. 즉 개인화/추천뉴스와 비추천 (또는 최신) 뉴스 간의 PV가 최소 2배 차이가 난다고 단순 결론을 내릴 수 있습니다. 장애 복구 후에도 한동안 평소보다 다소 낮다가, 15:30 이후로 다시 평소 PV를 회복한 것은 다른 장애 상황이 계속/복구됐기 때문으로 유추됩니다. 그런데 장애 기간동안 의외로 많은 PV가 발생했다는 점이 조금 의아합니다. 정확히 확인/검증이 필요하겠지만, 대략 유추해보면 디폴트로 노출된 뉴스 중에서도 고객이 좋아할 뉴스가 존재했을 수도 있고, 이 영역의 기사는 고객이 읽을 가치가 있는 맞춤형이라는 인식이 생겨서 믿고 클릭했을 수도 있고, 어쩌면 헤비 유저의 경우 다른 영역 (엠탑의 1탭이나 2탭 또는 3탭의 많이본뉴스 등)에서 소비하지 않은 새로운 뉴스가 추천 영역에 노출됐기 때문에 클릭했을 수도 있습니다.


서비스에서 장애는 절대 유쾌한 경험이 될 수가 없지만, 이번 장애를 통해서 추천/개인화가 뉴스에서도 효과가 있다는 것을 확인할 수 있었습니다. 추천 데이터와 알고리즘을 더 정교화하고, 추천에 대한 고객의 인식을 높인다면 여전히 추천은 많은 가능성과 개선의 여지를 가지고 있습니다.

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


댓글을 달아 주세요

Share           Pin It
최근 페이스북 뉴스피드를 보면 몇 가지 변한 점을 발견할 수 있다. 나쁜 점도 있고 좋은 점도 있다.

먼저 나쁜 점부터 집어 보면 (물론 개인의 사용 패턴 그리고 관점/철학의 차이에 따른 불편함이다.) 페이스북이 1월에 뉴스피드 노출 알고리즘을 개선했다. (참고. 페북 뉴스피드, 페이지보단 친구 소식 잘 띄게) 블로터 기사처럼 현재 뉴스피드는 친구의 글/사진과 페이지 (팔로잉하는 사람의 글/사진 포함)를 함께 보여줬는데, Most Recent 옵션을 사용하면 모든 글을 시간 역순으로 보여줬다. 그런데 뉴스피드 알고리즘을 변경한 후에는 뉴스피드만으로는 모든 글을 확인할 수 없다. 물론 이전에도 Top Stories를 선택하면 Edge Rank로 알려진 알고리즘에 의해서 많은 라이크나 댓글이 달린 기사를 우선 보여주기는 했지만, 지금처럼 제한하지는 않았다. 즉, (예전에는) Most Recent 옵션으로 모든 글을 시간순으로 확인할 수 있었다. 

그러나 지금은 Most Recent를 통해서 모든 글을 볼 수 없다. 해외 언론에서도 "Facebook's fatal weakness: Why the social network if losing to Amazon, Apple & Google"이라는 글을 통해서 나와 비슷한 불편을 토로했다. (위의 기사는 유저 컨트롤 그 이상을 다루고 있고 충분히 읽을 가치가 있음) 글의 저자 Andrew Leonard처럼 나도 페이스북 앱에 접속할 때마다 매번 상단의 랭킹 옵션을 Most Recent로 변경하고 있다. 그런데 앞서 말했듯이 이렇게 변경하더라도 모든 글을 볼 수가 없다. (어쩌면 모바일 앱에서는 조금 다를 수도 있다.) 그래서, 적어도 PC에서는, 모든 (친구가 적은 것이 아닌 페이지/팔로잉에 올라온) 최신 글을 확인하기 위해서 왼쪽 메뉴 패널에 있는 Pages Feed를 다시 확인해야 한다. 이 Pages Feed의 한가지 문제점은 내가 보고 싶은 것 이상을 보여준다는 단점이 있다. 즉, 나는 그냥 새로 올라온 글만 읽고 싶은데, 팔로잉하는 사람이 라이크를 누르거나 댓글을 단 모든 행동/글들을 함께 보여준다는 점이다. 나는 그들의 글을 보고 싶지 그들이 라이크/댓글을 단 글을 보고 싶은 것이 아니다.

어쨌든 이렇게 뉴스피드 알고리즘을 변경한 후로 내가 원하는 형태로 뉴스/글을 소비하지도 못하고, 불편하게 추가 액션을 취해야 하고, 또 그렇게 들어간 곳에서는 불필요한/보고 싶지 않은 쓸데없는 글들까지 모두 걸러서 봐야 한다. 물론 간혹 라이크나 댓글이 달린 글이 충분히 가치가 있는 경우도 있지만, 대부분은 나와 무관한 그냥 쓰레기인 경우가 많다. 자동화된 필터링은 좋지만 내 의지/의사와 반해서 마구잡이 필터링은 문제가 있다.

불편한 단점이 있다면 다른 측면에서 장점도 있다. 아래의 캡쳐 화면과 같이 관심이 가는 글/링크를 클릭하면 아래쪽에 관련된 글이 추가되어 추천해준다. 내용이 유사한 경우도 있지만, 적어도 아래 화면의 경우에는 글이 인용한 원문을 추천해주는 것은 참 반가운 일이다. 어제 밤에는 어느 애니메이션 감독의 짧은 동영상을 클릭했을 때, 그 감독의 다른 동영상을 추천해줘서 함께 볼 수 있어서 좋은 경험이었다. 



특히 업무적 특성, 그리고 지금 진행하고 있는 뉴스 추천과 묘하게 연결되는 것이라서 관심이 간다. 자연스레 알고리즘을 유추하게 된다. 정확한 알고리즘은 알 수 없으나 대강 유추해본다면 (다른 대부분의 알고리즘들의 메카니즘과 닮았으리라 판단함) 글에 사용된 키워드나 메타데이터/컨텍스트 (작성자, 글의 타입 등)의 유사도, 글에서 인용/참조한 링크의 원문, 사용자들의 행동 분석 (Collaborative Filtering) 등으로 관련도를 찾아내고, 그 추천된 글의 관련도에 더해서 인기도 (얼마나 공유되고 라이크받았는지)나 시간 (최신순도 있지만, 적어도 원문의 경우에는 더 오래된 글) 등의 랭킹팩터를 이용한 것같다.

그리고 모든 글에 추천 컨텐츠를 보여주는 것이 아니라, 내가 클릭한 글에 자동으로/즉시에 추천되는 형태 (반응형 추천)인 점도 중요한 포인트다. 즉, 내가 클릭해서 읽는다는 것은 내가 관심이 있다는 것이고, 그런 관심을 바탕으로 추천해주기 때문이다. 화면구성이나 UI/UX 때문에 어쩔 수 없이 추천 컨텐츠를 쏟아내서 보여줘야하는 경우가 많은데, 나의 행동에 반응해서 보여준다는 점은 마음에 든다. 그런데 이런 식으로 나중에는 광고도 은근슬쩍 노출해줄 것같다는 생각도 든다.

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


댓글을 달아 주세요

Like 라이크

Gos&Op 2014.01.28 09:51 |
Share           Pin It

최근에 사내에서 추천 시스템과 관련해서 전파교육 및 회의를 하면서 다양한 팀의 사람들과 만나고 있다. 단순히 내가 알고 있는 추천 시스템에 대한 소개를 하는 자리였지만 다양한 팀의 사람들을 만나다 보니 자연스레 그들이 생각하고 있는 이슈들을 듣게 되었다. 각자 페이스북에는 like 버튼이 많이 눌려지고 다양한 댓글들이 달리는데, 운영하는 서비스에서는 생각만큼 그런 종류의 추천/공감 버튼을 사용자들이 잘 누르지 않는다고 한다. 구체적인 수치를 밝힐 수는 없으나 담아두기 기능도 몇몇 헤비유저들만 사용하고 하루에 발생하는 건수도 생각보다 많지 않고, 공감/추천 버튼도 인터넷 사용량 (UV/PV)에 비하면 초라한 수준이라고 한다. 왜 그럴까?

일반 인터넷 서비스에서는 페이스북이나 다른 SNS만큼 라이크나 댓글이 많이 달릴 수가 없다. 관념적으로 생각하면 좋은 글이나 기사를 읽으면 사람들이 추천 버튼을 누를 것같고 화가 나는 글을 보면 댓글을 달아서 분풀이라도 할 것같지만 실상은 그렇지 않다. 사적인 공간과 공적인 공간에서 오는 차이일 수 있다. like에 인색한 나도 가끔 지인들의 글/사진에는 like를 하지만 그냥 페이지에 올라온 컨텐츠에는 보고 웃기만 할 뿐 like를 잘 하지 않는다. 페이스북에서는 지인의 글/사진이기 때문에 like를 한다. (표현이 좋지 않지만) "옛다, 관심" 식으로 like 버튼을 누르지만, 그냥 공용 커뮤니티나 인터넷 서비스에서는 그런 라이크/추천의 당위성이 떨어진다. 글쓴이와 독자 사이의 연결고리가 없는 경우에는 라이크/추천을 하는 것이 쉽지만은 안다.

담아두기 기능은 조금 다른 측면이 있다. 컴텐츠를 담아둔다/북마크를 한다는 것은 정보로써의 가치를 인정하고 추후에 재사용할 때 찾아보기 쉽게 하기 위해서다. 다음 등의 포털에 올라오는 많은 기사나 재미를 위한 컨텐츠는 정보로써의 가치나 재사용성에서 다소 문제가 있다. 간혹 여행정보나 상품/이벤트정보를 얻는 경우가 아니라면, (특히 남성들에게는) 기사나 컨텐츠를 굳이 담아두고 다시 볼 이유가 별로 없다. 간혹 생활정보/팁이 올라오더라도 굳이 북마크를 해두고 나중에 확인할 일도 없다. 비슷하거나 더 좋은 컨텐츠는 매일 생산되고 있고 몇몇 키워드만 입력하면 바로 검색이 된다. 영어로 된 기사를 읽을 때는 간혹 '나중에 읽기'를 선택하지만 나중에 다시 읽는 경우도 거의 없다. 우리 나라에서 만들어지는 많은 컨텐츠들은 사실 담아두기를 할 필요성/가치를 못 느끼는 경우가 많다. 그리고 간혹 담아주기 기능 자체에 대한 인지가 없는 경우도 있다. 이런 저런 이유로 담아두기 기능은 별로 효용이 없다. 물론 헤비유저들은 잘 사용한다. 그러니 어쩔 수 없이 기능은 만들어둬야 한다. 그리고 다음 단락과 조금 연결되는 내용인데, 트위터의 리트윗이나 텁블러의 리블로깅이 자주 일어나는 것은 나만 보기 위해서 담아두는 것과 다르기 때문이다.

또 하나 중요하게 생각해야할 점은 responsiveness, 즉 반응성이다. 사용자들이 추천을 하거나 댓글을 달거나 담아두기를 했으면 그 이후에 시스템이 이것들에 반응해서 변해야 한다. 사람들이 꾸준히 추천 시스템에서 아이템을 레이팅하는 이유도 그렇게 레이팅을 하고 나면 나중에 (늦어도 하루 이틀 후에) 그것에 반응해서 새로운 것들을 추천해주기 때문이다. 사용자와 시스템 사이의 이런 인터렉션을 기대하고 사람들을 추천 등의 액션을 취한다. 그런데 추천을 해도 댓글을 달아도 스크랩을 해도 시스템은 별로 반응하지 않는다면 사용자들은 곧바로 그런 액션의 무효용성을 학습하게 되고 흥미를 잃게 된다. 가끔 특정 기사에 댓글 테러가 일어나거나 실시간 이슈어 어뷰징이 발생하는 것도 그렇게 함으로써 실제 댓글많은뉴스에 올라가거나 실시간 이슈어에 등재되기 때문이다. 학습/경험을 통해서 자신의 행동에 시스템이 반응한다는 것을 인지하고 있기 때문에 그런 행위가 계속 발생한다. 그러나 아무리 추천버튼을 누르더라도 그냥 숫자만 하나 올라가는 것에 학습된다면 추후에는 추천에 대한 메리트가 사라지게 된다.

시스템을 만들고 운영하면서 왜 우리 시스템은 페이스북처럼 많은 라이크나 공유가 일어나지 않는가?를 고민하기에 앞서, 서비스가 사용자들에게 제대로된 인터렉션 경험을 제공할 수 있도록 디자인되었는지를 검토해볼 필요가 있다. 사용자 만족의 측면의 디자인이 아닌, 서비스 제공자의 관점에서의 밀어내기식의 디자인은 제고될 필요가 있다. 간혹 아주 뛰어난 사람이 등장해서 사용자들의 숨은 니즈까지 파악해서 멋진 제품/서비스를 선보이는 경우도 있지만 (애플처럼) 보통은 그렇지 않기 때문에 사용자를 먼저 잘 관찰해서 파악해둘 필요가 있다.

==

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

댓글을 달아 주세요

Share           Pin It

두번째로 추천에 사용되는 데이터에 대해서 간단히 설명하겠습니다. 추천방식에 따라서 필요한 데이터가 달라지지만, 가장 일반적인 내용을 설명하고 추후에 특정 알고리즘이나 방식에 맞는 데이터는 별도로 설명하겠습니다. (특정 용어가 특정/다른 상황에서 적절하지 않을 수도 있습니다.)

추천의 기본 원리는 과거는 곧 미래다입니다. 그렇기에 추천을 위해서 필요한 데이터는 유저들의 행위 behavior 기록입니다. 상품 구매 이력, 이벤트 참석 이력, 기사를 공유했거나 like를 한 이력, 영화나 드라마를 보거나 평점을 남긴 이력 등의 모든 것들이 추천시스템에서 활용합니다. 그런 모든 이력들이 제품이나 컨텐츠에 대한 사용자의 선호/관심을 나타내는 지표로 사용합니다.

좀 더 구체적으로 쇼핑 추천을 예로 들겠습니다. A라는 사람이 특정 나이키 운동화를 웹에서 조회해본 것도 그 사람이 그 제품에 대한 선호를 보여주는 것이고, 더 나아가 그 제품을 구입했다면 더 확실하게 표시한 것입니다. 더우기 평점을 5점 (5점 스케일에서)으로 매겼다면 그 사람의 제품에 대한 만족도/선호도를 명시적으로 보여주는 것입니다. 댓글을 남긴다거나 추가로 더 구입한다거나 등의 모든 행위들이 사용자의 선호도 지표로 활용됩니다. 조금 복잡한 얘기가 될 수도 있지만, 쇼핑검색에서 특정 제품이 검색결과에 노출되었지만 그 사용자가 그 제품을 조회해보지 않는다면 이는 마이너스 (-) 선호도로 측정되기도 합니다. 선호도의 정도는 경우에 따라서 다양하게 해석이 됩니다.

이런 사용자의 아이템 선호도를 레이팅이라고 말합니다. 레이팅은 말 그대로 평점/별점을 매긴 것을 뜻합니다. 앞서 쇼핑에서 5점 스케일로 평점을 줬다면 이는 명시적 레이팅 explicit rating이라고 부릅니다. 그런데 특정 제품을 조회해봤다거나 구매했다 등의 행위에서는 조회여부 (0/1), 구매여부 (0/1)로 나뉘어질 뿐 명시적으로 점수화시킬 수 없습니다. 이런 경우는 암묵적 점수 implicit feedback이라고 부릅니다. 초기의 연구들이 명시점수에 기반해서 진행되었습니다. 그러나 명시점수와 암묵점수 사이에는 서로 장단점이 있기 때문에 요즘에는 둘을 동시에 사용하는 것이 일반적입니다. 물론, 명시점수가 존재치않는 경우가 더 많습니다.

명시점수의 경우에는 사용자의 선호도가 명시적으로 나타나기 때문에 추천하는 것이 조금더 직관적입니다. 그런데 암묵점수에 비해서 데이터 빈약도 data sparsity가 훨씬 큽니다. 즉, 유저들이 특정 제품을 구입하더라도 평점을 매기지 않는 경우가 허다합니다. Data sparsity는 바로 추천 알고리즘의 정확도와 연결되기 때문에 중요한 이슈입니다. 그래서 더 dense한 암묵점수를 명시점수의 보조역할로 사용하는 경우가 많습니다. (때로는 암묵점수만을 사용하는 경우가 더 많음) 물론 그렇다고 해서 암묵점수가 data sparsity가 없다는 얘기는 아닙니다. 명시점수가 암묵점수보다 더 심하다는 얘기입니다.

Data sparsity 이외에도 명시점수의 단점이 많이 있습니다. 대표적으로 점수의 편향이 있다는 점입니다. 사용자들이 소비한 모든 컨텐츠/상품에 대해서 평점을 남기는 것도 아니고, 남겨진 평점에 대한 신뢰도 문제가 있습니다. 저는 책을 많이 읽는데, 좋은 책을 읽었을 때는 시스템에 접속해서 4 또는 5점을 줍니다. 그런데, 마음에 들지 않는 책을 읽었을 때는 굳이 리뷰를 쓰지 않습니다. 모든 사람들이 저와 같이 점수를 준다면 4/5점대는 많은 데이터가 있는데, 1/2점대는 적은 데이터만 쌓여서 사용자의 선호를 명확히 구분하지 못해서 제대로된 추천이 불가능합니다. 뿐만 아니라, 사용자마다 점수 스케일이 다르다는 점입니다. 누구는 '그저그럼'이 3점이 될 수 있고, 다른 이는 4점이 될 수도 있습니다. 그리고 같은 유저더라도 상황에 따라서 다른 점수 스케일을 사용하는 점도 문제가 될 수 있습니다. 기분이 좋을 때는 4/5점을 남발하다가 기분이 나쁠 때는 1/2점을 줄 수도 있습니다. 이런 사용자 바이어스를 줄이고, 일관성에 맞도록 조정하는 방법도 연구의 한 축입니다.

명시점수에 노이즈가 많기 때문에, 최근에는 그냥 암묵점수를 사용하는 경우도 많아졌습니다. 명시점수에 비해서 더 많은 데이터를 확보할 수 있다는 것이 가장 큰 장점입니다. 명시점수에 비해서 선호도를 제대로 표현할 수 없다는 단점이 있지만, 이는 암묵점수를 어떻게 해석하느냐에 따라서 어느 정도 극복도 가능합니다. 특정 제품을 조회했으면 1, 아니면 0으로 구분하는 것이 아니라, 특정제품이 노출되었지만 조회하지 않았다면 -1, 노출되지 않았다면 0점, 조회했으면 1점, 그리고 구입까지 했다면 2점을 주는 식으로 레이팅을 달리할 수 있습니다.

추천 시스템에서 데이터와 관련해서 해결해야할 가장 큰 문제점은 데이터의 크기 data dimensionality 문제입니다. 넷플릭스의 유저 레이팅도 몇십억건이 넘는다고 합니다. 그런데 앞서 말했듯이 다양한 메타데이터를 사용해서 새로운 축이 생기면 더 큰 문제를 야기할 것입니다. SVD 기반의 Matrix Factorization에서는 로컬 데이터를 업데이트하는 방식으로 데이터의 스케일문제를 해결하기도 합니다. 최근에 많은 주목을 받고 있는 Big Data 기반으로 문제를 해결하기도 합니다. 그런데, 하둡 Mahout에 들어있는 CF를 사용해서 테스트를 진행해봤는데, 데이터 사이즈가 별로 크지도 않았는데 사용된 유사도에 따라서 메모리 문제가 발생하기도 했습니다.

이상의 유저레이팅은 보통 협업필터링 Collaborative Filtering에서 기본적인 데이터입니다. 여기에 더해서 Content-based Filtering (CBF)를 위해서 다양한 메타데이터도 사용이 가능합니다. 영화를 예로들면 특정 영화의 장르, 스태프나 출연진, 내용/줄거리 (에 사용된 키워드 등)이 메타데이터로 사용되고, 이들을 기준으로 관련 영화 (아이템)을 묶어서 추천해줄 수도 있습니다. 그리고 사용자에 대한 데이터도 사용됩니다. 사용자의 특성 (성별, 나이, 지역, 직업 등)에 따라서 제품에 대한 선호가 다른 경우가 많기 때문에 사용자 데모그래픽에 따른 그룹화 및 그룹별 추천도 가능합니다.

트위터나 페이스북의 성공으로 소셜관계 데이터는 최근에 가장 흔하게 사용되는 데이터 중에 하나입니다. 친구 또는 내가 선호하는 (팔로잉) 사람의 글이나 의견을 보여주는 형태입니다. 소셜 데이터가 추천에서 별 효과가 없다는 연구결과도 많지만, 적어도 추천의 신뢰도를 높여주는데는 효과가 있다고 합니다. 즉, '네 친구 XX가 추천한 글이야' 식으로 추천의 이유를 설명해주면, 추천된 글/제품이 별로더라도 결과를 이해하고 넘긴다는 것입니다. '너와 비슷한 누군가의 추천이야'보다는 '네가 알고 있는 누구의 추천이야'가 더 설득력이 있다는 얘기입니다.

간단하게 설명될 것같았는데, 의외로 글이 길어졌습니다. 여전히 추천에 필요한 데이터를 충분히 설명하지 못했습니다. 후속 글들에서 필요한 설명은 추가하겠습니다.

추천시스템 전체 목록

  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

댓글을 달아 주세요

관심 생명 주기

Gos&Op 2013.07.22 08:59 |
Share           Pin It

두가지 이야기부터 시작해보자. 첫번째는 최근에 진행 중인 쇼핑 추천 서비스와 관련이 있다. 아마존을 사용해본 사용자라면 다 알겠지만 아마존 홈페이지에 접속하면 최근에 구매했거나 조회해본 상품들이 첫화면에 나열되고 그것과 관련이 있는 상품들을 추천해준다. 일종의 개인화 추천이다. 구매나 조회는 나의 관심사를 암묵적으로 보여주고, 그것을 바탕으로 새로운 상품을 추천해주는 것은 직선적이다. 그런데 그런 상품을 언제까지 추천을 해줘야할까? 만약 1년 전에 마지막으로 아마존에 접속해서 책 한권을 살펴봤다가 1년만에 재접속했는데 여전히 그 책과 관련 도서를 보여준다면 제대로된 추천이라고 볼 수가 있을까?

두번째는 예전부터 알고는 있었지만 직접 경험해보니 좀 거시한 거다. 어떤 여성 의류 쇼핑몰이 있다. 그런데 최근에 내가 접속하는 많은 블로그나 사이트들에서 해당 쇼핑몰의 광고가 계속 노출되고 있다. 처음에는 해당 쇼핑몰이 광고를 많이 하나보다정도로만 생각했었는데, 알고 보니 이게 다 구글의 장난이었다. 해당 쇼핑몰에 한 번 접속한 후로 계속 같은 광고가 노출되고 있다. 광고에 있는 쇼핑몰 모델이 예뻐서 클릭해봤던 건지 아니면 위의 쇼핑 추천 서비스를 테스트하면서 접속해봤는지 정확한 시작은 모르겠지만, 한번 접속 이후로 계속 같은 광고가 따라다닌다. 처음에는 1주일정도 노출되다가 말겠지 생각했는데, 벌써 몇 주째 같은 광고만 보고 있다. 알고리즘에 의해서 다양한 정보 (?)의 선택권이 박탈되었다.

위의 두가지 사례는 모두 개인의 관심 또는 흥미 Interest와 관련이 있다. 분면 내가 아마존에서 책을 조회했기 때문에 해당 책에 관심을 보였고, 해당 쇼핑몰에 접속해봤기 때문에 또 그 쇼핑몰에 관심을 보인 경우다. 그렇기 때문에 이것을 바탕으로 다른 상품이나 해당 몰을 계속 보여주는 것은 일리가 있다. 그런데 언제까지 계속 보여줄 것인가?에 대한 고민이 필요하다. 아마존이 되었든 구글이 되었든 또는 다른 업체가 되었든 개인의 관심사를 찾아내는 것은 중요하다. 그러나 그 관심사가 소멸되는 시점을 예측하는 것은 더 중요하다.

개인마다 관심사가 제각각이고 또 계속 변한다. 관심의 생성이 중요하듯이 관심의 소멸도 중요하다. 인터넷 서비스들이 개인화를 시작하면서 관심의 생성/발생에는 초점을 두는데 관심의 소멸에는 좀 소홀한 것같다. 어떤 물건에 관심을 가지기 시작하면 그 물건을 검색해보고 상세정보를 확인해본다. 관심이 생성된 시점이라고 봐도 좋다. 그런데 계속 살까 말까를 고민하면서 다양한 제품들을 조회해보다가 결국 지름신을 이기지 못하는 때가 온다. 그 물건이 내 손에 들어온 이상 더이상 그것에 대한 관심이 없어진다. 즉, 관심이 소멸한 시점이다. 그런데 구매가 이뤄진 이후에도 계속 내가 최근에 본 상품과 그것의 관련 상품을 추천해준다면 좋은 일을 해주고 욕먹는 꼴이 된다.

가끔 사회 이슈가 된 것 때문에 검색을 해보거나 특정 사이트에 (우발적으로) 접속하는 경우가 있는데, 이것을 바탕으로 관련 광고를 계속 노출시켜주는 것이 현재 구글의 DA 전략이다. 그런데 중요한 점은 우발성 또는 일회성에 있다. 이것은 관심의 생성과 함께 소멸을 의미한다. 그런데 계속 관심이 살아있는 것으로 가정하고 광고를 노출한다면 해당 업체에 대한 피로감만 누적된다. 때로는 여행과 같이 의도를 가지고 검색/광고클릭을 했더라도 그 욕구를 충족시킨 이후에도 계속 비슷한 광고가 노출되는 경우도 있다. 물론 관심의 생명주기가 어떻게 될지를 예측하는 것은 어렵다. 그러나 관심을 캐치해내는 능력을 키웠듯이 관심이 소멸되는 시점을 캐치해내는 능력에 대한 연구와 시도가 필요하다.

쇼핑 추천 서비스를 준비하면서 일단은 기술적으로 추천 알고리즘을 개발했지만, 끝내 풀지 못한 문제가 이 관심의 소멸시점에 대한 것이다. 수학적으로 시간에 따라 감소하는 dacay factor를 식에 넣기는 했지만, 이것이 소멸 시점을 확정시키지 않는다. 예전에 소셜픽 프로젝트를 하면서 이슈의 생명주기를 고려했던 적이 있다. 그런데 이슈는 생성 시점만큼 소멸 시점이 명확하다. 검색량이나 관련 문서량이 급감하면 이슈가 소멸했다고 판별할 수 있다. 그런데 대중의 관심사에 대한 소멸은 경향성을 보면 짐작할 수도 있지만 개인(화를 위한 개인)의 관심사의 소멸시점을 특정하기 어렵다. 특정 물건에 관심을 가지기 싲가해서 평규적으로 며칠 후에 물건을 실제 구매하더라 등과 같은 데이터라도 제대로 확보한다면 유추해 가늠해볼 수는 있지 않을까? 새로운 관심의 생성시점이 이전 관심의 소멸시점으로 유추할 수도 있으나 여전히 불완전하다.

관심/흥미 생명주기 Interest LifeCycle 또는 관심의 변동성 Interest Volatility 을 연구해보는 것도 나름 재미있을 것같다. 그런데 이 연구에 대한 흥미는 언제쯤 없어질까?

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

댓글을 달아 주세요

Share           Pin It
 여섯번째 글입니다. 글의 시작은 재미있는 검색을 만들자였습니다. 그러다보니 바쁜 현대인들에게 잠깐의 기쁨을 줄 수도 있겠으나, 그것보다는 잠시라도 여유를 찾은 이들에게 검색이 어떤 혜택을 줄 수 있을까로 이야기가 흘러갔고, 재미있는 검색을 논하기 전에 검색이 줄 수 있는 재미는 어떤 것이 있을까?라는 물음에 이르렀습니다. 그런데 이 시점에서 핵심된 내용이 정리되지 못하고 지난 다섯편의 글을 적게 되었습니다. 그래서 이야기 논의흐름의 맥이 될 '잉여는 무엇이고 잉여자는 누구인가?'에 대해서 생각해야 합니다. 내가 대상으로 삼고 싶었던 그들이 누구이며 그들의 속성이나 성향을 알지 못하면서 그들에게 재미를 주겠다는 어설픈 논의는 핵심을 벗어날 수 밖에 없습니다.

 먼저 지난 다섯편의 논의는 다음과 같습니다.
 1. 재미있는 검색. FUN
 2. 잉여자들을 위한 검색 Search As Fun
 3. 잉여를 위한 검색은 없다. No Search for Abundance/Surplus
 4. 잉여의 나라로 Into Real World
 5. 검색의 재미 검색의 잉여 Fun of Search

 과연 잉여는 무엇일까요? 잉여를 그냥 나머지, 떨거지로 생각한다면 이전 글에서 짧게 언급했던 소비 또는 유희의 시대를 제대로 읽지 못하는 것입니다. 잉여란 단지 필요가 없어서 남는 것이 아닙니다. 잉여란 많아서 흘러넘침을 뜻합니다. 가둘 수 있는 통의 용량은 제한되어있는데, 그것보다 더 많이 들어와서 흘러넘치는 상태입니다. 돈의 잉여라면 벼락부자, 졸부가 자신의 부를 주체하지 못해서 마구잡이로 돈을 허비하는 것이 아니라, 자신의 필요를 이미 충족시키고 또 그 이상의 기본 욕망을 충족시키도 남아서 그것을 더 가치있는 곳에 사용하는 것이 잉여입니다. 시간의 잉여도 단지 할 일이 없어서 빈둥거리는 것이 잉여가 아닙니다. 그보다는 자신의 일을 충실히 하고, 그리고 고갈된 에너지를 재충전한 상태에서 (충분한 재충전의 의미는 사람에 따라 다를 수 있습니다.) 자신의 본업도 아니고 그렇다고 휴식도 아니지만 개인 또는 사회적으로 가치를 만들어내는 것이 시간의 잉여일 것입니다. 소비의 시대는 무조건 자신의 가진 것을 허비하는 시대가 아닙니다. 유희의 시대는 단지 재미를 위해서 모든 것을 포기하는 시대가 아닙니다. 소비와 유희의 말에는 더 고차원의 중용이 있습니다. 일에 따른 휴식 그리고 그 이상이 잉여입니다. 

 잉여자는 그런 잉여의 가치를 알고 그것을 즐기는 자입니다. 단지 시간이나 돈이 남아돌아서 마구잡이로 허비하는 사람에게 잉여자라는 별칭을 붙이기 어렵습니다. '잉여자'가 주는 어감이 조금 부정적인 것은 압니다. 지금 논의에서는 구시대적 관점이나 가치에서 붙여진 그 부정적 '잉여/잉여자'의 의미를 새롭게 정의하고 있다는 점을 잊지 않았으면 합니다. 잉여자는 플러스알파의 가치를 아는 사람입니다. 잉여자는 그냥 (돈이나) 시간이 많은 사람이 아닙니다. 그것을 가치있게 활용할 수 있는 사람입니다. (여기서 잠깐. 음 고백하자면.. '잉여'라는 용어는 박상민님의 '소프트웨어, 잉여과 공포'라는 글에서 가져왔습니다. 글하단의 '참고' 참고.)

 앞에서 돈과 시간을 얘기했지만, 잉여를 말할 때는 '돈'보다는 '시간'에 관계된 것같습니다. 사람의 시간을 구분해보면 '일/업 + 휴식 + alpha'정도입니다. 사람에 따라서 일의 종류가 다르고, 휴식의 방법도 다르고, 알파의 유무도 다를 것입니다. 직장인은 직장에서 주어진 업무가 일이지만, 학생은 (학교)공부가 일이 됩니다. 그리고 휴식의 방법도 단순히 잠을 자는 것에서부터 음식을 먹는 것, 마사지나 사우나를 하거나, 독서나 TV시청/게임 등의 개인차기 있습니다. 그러나 기본적으로 모든 사람은 일과 휴식의 시간은 가지고 있습니다. 오늘 논의에서 어떤 일/휴식을 가졌느냐 또는 얼마나 일/휴식을 하느냐보다는 알파의 유무나 크기의 차이가 중요합니다. 이 알파를 어떻게 사용하느냐에 따라서 뉴욕대학교 교수인 클레이 셔키 Clay Shirky의 <많아지면 달라진다 Surplus Cognitive>에서 주장하는 사회를 위해 더 가치있는 기여로 발전하느냐를 결정합니다. 

 휴식을 넘어서는 부분에서 (시간의) 잉여가 시작하고, 그 잉여휴식을 어떻게 사용할 것인가? (그리고, 제 글의 시리즈에서, 그 지점에서 검색이 어떤 기여를 하고 가치를 줄 것인가?)가 중요합니다. 불필요하게 추가된 잠이나 TV시청, 게이밍을 다른 더 가치있는 실내/야외활동으로 전환시킬 것인가가 중요합니다. (잠이나 TV시청 등에 더 중요한 가치는 두는 이들에게서 그것들을 빼았을 생각은 없습니다. 지금 논점에서는 필요이상의 그것들, 즉 잉여에 대한 얘기입니다.) 시간이 있는 (그리고 조금이라도 의지가 있는) 사람들을 어떻게 더 창의적인 활동의 무대로 끌어들일 것인가? 야외에서 레즈스포츠를 즐긴다거나 실내에서 독서 등의 취미활동을 한다거나... (잠이나 TV/게임 등이 취미일 수도 있죠.^^) 이 지점에서 검색이 도와줘야 합니다. 그래서 검색의 '추천'기능과 '노하우'기능이 필요합니다. 추천은 말그대로 영화나 도서 등을 사용자에게 알려주는 것이고, 노하우는 (단순 지식iN이라는 Q&A서비스가 아닌) DIY를 위해서 가이드를 해주는 것입니다. (추천과 노하우에 대한 내용은 지금 그리고 내년에 제가 담당할 일과 연결된 부분이라 지금 당장은 자세한 설명을 생략합니다. 몇 개월 후에 또 다른 기회를 통해서 어떻게 추천할 것인가? 또 어떻게 노하우를 발견/공유할 것인가? 등에 대한 주제를 만들어보겠습니다.)

 그러고 보면 테마검색이나 실세계검색이 이 추천과 노하우와 맥이 통합니다. 테마검색이나 실세계검색은 별 생각없이 막던졌던 용어인데, 지금보니 추천/노하우의 전형입니다. 그런데, 이 추천과 노하우 (또는 테마검색과 실세계검색)이 합쳐지면 'Act-How'가 됩니다. 앎으로써의 지식이 아닌 행함으로써의 지식.

 ** 참고. 박상민씨의 '소프트 한국'이라는 제목으로 현재 6편까지 연재되어있습니다.
 1. 소프트웨어, 공포와 잉여 
 2. 영웅이 탄생하기 힘든 나라
 3. 실무형 인재란 없다!
 4. 세상을 바꾸는 '잉여인'
 5. 지식의 역사, 소프트웨어
 6. 안드로이드? 진짜는 아마존!

댓글을 달아 주세요

Share           Pin It
 그림 한장으로 다음 블로거뉴스와 열린편집을 도식화해보았습니다. 열린편집 알고리즘에 대해서는 이미 특허도 출원이 되었고, 발표 및 논문의 형태로 공개가 될 예정이라 자세한 사항은 특허문서나 논문 (조만간 발표될 예정)을 참조하시기 바랍니다. 자세한 내용을 어느 선까지 다루어야할지 애매하기 때문에 간단한 설명만 다룹니다. (회사에서 진행하고 있는 서울대 컴공과 학생들을 위한 발표자료를 준비 중에 잠시 만든 자료/그림이라서 자세한 내용을 다루지 못합니다.)

한장으로 그려보는 다음 블로거뉴스와 열린편집



 블로거뉴스
- 블로거이라면 다음의 블로거뉴스에 기자단으로 등록한다. (등록방법은 다른 포스팅들을 참조바람)
- 자신의 글을 블로그에 등록한다.
- 블로그에 글을 등록할 때, 블로거뉴스에 발행을 선택하거나 블로거뉴스 홈페이지에서 RSS를 이용해서 글을 발행한다.
- 블로거뉴스 이용자들은 마음에 드는 블로그포스팅을 보고 추천을 누른다.

열린편집
 - 포스팅 추천행위에 따라서 추천점수를 부여받는다. (자세한 추천점수체계는 공개할 수 없습니다.)
 - 일정 기간동안 누적 추천점수가 일정값이상인 블로거들은 에디터풀에 등록된다.
 - 주기적으로 (1주, 2주, 1달?) 에디터풀에서 열린편집자들을 (거의) 임의로 선정한다.
 - 선정된 열린편집자들의 추천수에 따라서 블로거뉴스베스트글이 선정된다.
 - 베스트글 중에서 열린편집자들의 추가추천에 의해서 랭킹이 매겨진다.
 ** 베스트글은 또 다른 열린편집자들을 발굴하는 근거가 된다.

댓글을 달아 주세요

랭킹 이야기

Tech Story 2008.12.02 19:25 |
Share           Pin It
 이전 글들을 종합해 보면 제가 어디서 어떤 일들을 하고 있는지 알 수 있을 것이다. 일명 (호라이즌) 포탈을 운영하는 곳에서 일하고 있기 때문에 회사 내에 다양한 서비스들이 존재한다. 즉 내가 이 회사에 몸을 담고 있다고 하더라도 다른 팀이나 서비스들에 대해서는 경우에 따라서 전혀 모를 수도 있다는 소리다. 팀의 성격상 cross-team 업무가 많기는 하지만 회사에서 운영하고 있는 대부분의 서비스들에 대해서 전혀 아는 것이 없다고 해도 맞는 말이다. 그런데 오늘 다른 팀의 서비스에 대해서 좀 이야기를 하고 싶어졌다. 블로거뉴스나 한참 때의 아고라의 글들 중에 자신의 글의 랭킹이라던가, 베스트글에 존재여부 등에 대해서 매우 민감한 반응을 보이는 이들이 종종있다. 어쩌면 그들이 직감한 것이 맞을 수도 있지만 맞지 않을 수도 있다. 문제는 그들은 '이것이 문제다'라고 종종 주장하지만, 서비스를 운영하는 쪽에서는 일일이 답변을 해주는 것도 아니고 그렇다고 해서 가끔 종합해서 서비스에 대해서 설명을 해주는 것도 아니고... 설사 있다고 하더라도 그런 글들을 찾기도 만만치 않고...

 앞서 말했듯이 다른 팀에서 하고 있는 업무 (예, 블로거뉴스 랭킹)에 대해서 전혀 모른다고 해도 과언이 아니지만... 적어도 대부분의 일들이 상식선에서 해결되고 있다는 가정아래 다음의 글을 적는다. 팀내에서 그리고 다른 팀의 사람들과 가끔 좋은 글이란 무엇인가에 대해서 얘기를 자주 나눌 때가 있다. 유명하고 영향력이 있는 사람이 적은 글나 좋은 출처 좋은 글일 수도 있고, 현재 이슈가 되는 주제를 다룬 글이 좋은 글일 수도 있고, 가장 시기적절하게 적은 글이 좋은 글일 수도 있고, 가장 간단하게 핵심을 찌른 글이 좋은 글일 수도 있고, 추천을 많이 받은 글이 좋은 글일 수도 있고, 때로는 감동을 준다거나 예측한 내용이 맞았을 경우 좋은 글이 될 수도 있다. 우리가 저자를 보고 책을 살 때도 있고, 가격을 보고 책을 살 때도 있고, 쪽수를 보고 책을 살 때도 있다. 가장 직접적인 이유가 책의 내용을 모르는 상태에서 값을 지불해야하기 때문이 아닐까 생각한다.

 그런데 온라인 상에서 블로거뉴스나 아고라 같은 서비스의 경우 일반 대중들의 추천수라는 것은 글의 품질을 측정하는데 매우 중요한 지표가 될 수가 있다. 그래서 현재 블로거뉴스의 베스트글에는 대부분 추천수가 많은 글들을 올려놓는 경향이 있다. 그렇지만 앞서 말했듯이 추천수는 단지 문서의 품질을 평가하는 하나의 측도에 불과하다는 것이다. 대표적인 추천수의 문제점은 어뷰징이 아닐까 생각한다. 같은 사람이 여러 개의 ID를 가지는 경우도 존재할 것이고, 어떤 경우 친구나 동료들이 한꺼번에 추천을 하는 경우도 있고, 심한 경우 로봇을 만들어서 추천수를 조작할 수도 있을 것이다. (좀비PC를 이용한 추천수 조작이 실제 일어나는지는 확인할 수 없기때문에 사실을 말하는 것이 아니라, 가능성을 말하고 있는 것이다. 그러나 실제 다른 영역에서 조직적으로 조작이 일어나고 있는 것은 사실인듯하다. 이런 일을 전문으로 하는 불법 회사들이 많이 존재하고 있다는 사실이 그렇다는 것이지, 직접 눈으로 확인했다거나 그런 것은 아니니 오해하지는 말았으면 좋겠다.) 실시간 서비스에서는 같은 사용자에 의한 중복추천을 필터링해내기가 쉽지만은 않다. 그렇지만 최종 집계를 하는 단계에서 IP 주소 등으로 중복 추천하는 것을 제거하고 있는 것다. (물론, 공용 IP를 공유하는 경우 불이익을 당하겠지만, 현실적으로 어쩔 수 없는 듯하다.)

 그래도 추천수는 문서의 품질을 평가하는데 아주 좋은 측도이다. 추천수가 많다고 좋은 글로 볼 수는 없다. 시간이 지날 수록 추천수는 분명 증가하기 때문이다. 그래서 '추천수 / 게시시간'이라는 변형 측도를 사용할 수도 있고, 단위 시간당 peak 추천수를 사용할 수도 있을 것이다. 그리고 추천수의 문제점을 해결할 수 있는 좋은 방법으로 '추천수 / 조회수'의 비율을 사용하는 것이다. 즉 사람들이 많이 반응하는 글이 좋은 글일 가능성이 높다는 의미다. 실제 아고라나 블로거뉴스에 이런 비율이 포함되었으면 하는 바램이 있다. 이 비율을 사용하면 좋은 점으로 최상단에 위치된 글들이 다이내믹하게 변할 수 있기 때문에 한시간 뒤에 새로운 좋은 글을 읽을 가능성이 높아진다는 것이다. 그러나 여전히 문제는 존재한다. 악의적으로 보기 싫은 글의 조회수를 높인다면 위의 비율이 감소하고 문서의 품질이 낮은 것처럼 속일 수가 있다는 점이다. 일명 '알바'글들이 문제가 되듯이 알바들에 의해서 문서의 품질이 결정될 수도 있다는 말이다. (실제 추천은 로그인이 필요하지만, 조회는 로그인이 필요없다. 물론, IP 등의 부가 정보를 이용해서 러프하게 체크는 할 수가 있다.)

 앞의 문단에서 '추천수 / 게시시간'을 이미 말했다. 그런데, 실시간 베스트글에서 중요한 점은 최근 1 ~ 2시간 동안 받은 추천수가 매우 중요하다. 때로는 최근 1시간은 추천은 가중치 1을 주지만, 1시간 전의 추천들은 가중치 0.7, 0.5 등으로 낮추어서 계산을 할 수도 있다. (실제로 그렇게 하고 있는지 아닌지는 잘 모르겠다. 그리고 어떤 시간 주기로 이루어지고 있는지도 잘 모르겠다.) 즉, 추천수가 많아서 베스트 글에 올랐다고 하더라도 최근에 추천이 별로 없으면 베스트에서 탈락할 수도 있다는 얘기다. 이런 현상 때문에 오해하는 경우가 종종 발생하는 것같다. 그래서 여러 포스팅에서 언제 글을 올리는 것이 가장 추천을 많이 받을 것이가에 대한 글들도 있지 않은가? 밤 늦게 올린 글들은 사람들이 보지 않기 때문에 사장될 수도 있지만, 점심시간 직전이나 퇴근 전에 올린 글은 더 많은 사람들이 볼 가능성이 높다. 그래서, 분석 주기를 동적으로 가져가는 문제도 발생할 수가 있다. 낮시간중에는 최근 3시간의 추천만을 고려한다면 밤 시간에는 6시간의 추천을 고려한다거나... 주중과 주말의 추천을 달리 해석한다거나 그런 여러 변치 조건들이 추가될 수도 있을 것이다. (다시 강조하지만 해당 팀에 속해있지 않기 때문에 어떻게 이루어지는지는 알 수가 없고, 알고 있더라도 공공 장소에서 발설할 수가 없는 것이 집단에 속한 개인의 의무인 것을...)

 ..... 글의 밑천이 다 떨어져가는 것같다. (다음에 생각날 때마다 더 추가/수정하겠지만...)
추천 데이터가 없다는 가정아래... 사람들을 어떻게 유인할 것인가? 제목을 잘 정해야한다. 근데 낚시 제목은 사양해줬으면 좋겠다. 제목은 그 글의 전체를 요약할 수가 있어야 한다. 글의 첫 문장만으로 제목이 낚시였는지 알 수가 있다. 트래픽은 증가할지 모르겠으나, 사람들에 긍정적인 영향을 줄 수가 없다. 그래서 좋은 제목은 글의 전체를 요약할 수 있는 것으로, 때로는 논문의 keywords나 tag 태그에 포함된 용어들을 대부분 활용해서 글의 제목을 정하는 것이 좋다. 둘째, 사진을 잘 활용해야 한다. 실제 검색 서비스를 담당하는 회사들에서 연구한 보고서의 의하면 사진이 있는 경우 사람들의 시선을 더 잘 받도록 한다는 것은 기정 사실이다. (Eyetracking을 이용한 연구) 그런 점에서 현재 블로거뉴스의 이미지는 오른쪽에 위치해 있기 때문에 읽기에 불편하다. 왼쪽으로 옮겨줬으면 좋겠는데, 내부 제안 후에 마우스를 올린 경우 사진이 크지도록 하는 인터페이스로 바뀌었을 뿐이다. 세째, 용어를 잘 선택해야 한다. 검색이 많이 되는 용어가 있고 그렇지 않은 용어가 있다. 그래서 인기검색어를 이용해서 글을 적으면 트래픽이 많이 증가한다. (실제 본인의 [인기 검색어] 포스팅들이 낚시성으로 사람들을 많이 낚고 있다. 낚시를 위한 글이 아니라 검색 트렌드를 보여주기 위해서 그리고 전날을 요약해주기 위해서 글을 적는 것이기 때문에 이 글을 통해서 혹시 낚였구나라고 생각하셨던 분들에게는 다시 한번 죄송하다는 마을 전하고 싶다.) 미담의 신문 기사들을 보면 간혹 하이퍼링크가 걸린 단어들을 볼 수가 있다. 그 하이퍼링크는 검색으로 통하고 있지만... 그런 단어들을 유심히 살펴보면 기사에서 매우 중요한 위치를 차지하는 단어일 가능성이 높다. (물론 분석이 잘못 되어서 영 엉뚱한 단어에 하이퍼링크가 걸린 경우도 종종 있지만...) 요는, 좋은 단어를 사용하면 로봇들이 좋은 글인 걸로 착각할 수도 있다는 소리다.

 기회가 된다면 다음에는 구글 페이지랭크니 Okapi's BM25와 같은 일반적인 검색에서의 랭킹에 대한 이야기를 할 수 있을지도 모르겠다. 오늘 적지 못한 내용은 앞으로 계속 추가/수정하겠다.

 중요한 것 하나 더... 모든 추천이 동일한 효과를 발휘할까요? 좋은 추천을 해주는 사용자가 있을 것이고 대강 또는 마구잡이로 추천해주는 사용자들이 있습니다. 마구잡이라고 몰아세우는 것은 아니지만 좋고 나쁨을 판단하는 사용자들의 역치 수준이 모두 다르기 때문에 (만인은 평등하다지만) 추천자들의 성향 등에 따라서 추천 가중치가 달라질 수도 있습니다. ... 그리고 보통의 회사들의 입장에서 더 많은 글들이 올라오는 것에는 신경을 쓰지만 개인의 글이 베스트로 올라가고 내려오고 그런 것에는 신경을 쓸 여력도 없고, 그래서 별로 신경을 쓰지 않습니다. 물론, 악의적인 루머를 퍼뜨린다거나 그런 경우가 아니라면 말이죠. 본인의 글이 베스트로 올라갔느니 또는 내려왔느니 그런 것에 신경을 쓰지 않고 대범하게 인터넷 세상을 즐기세요. 정신 건강에도 그게 나을 겁니다.

댓글을 달아 주세요