ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Coursera] Text Retrieval and Search Engines (MODULE 5)
    개인 프로젝트 A 2024. 7. 22. 13:29

    MODULE 5

    1) Probabilistic Retrieval Model - Basic Idea

    Module 5는 확률적(통계적) 언어 모델에 대해 다룬다. 벡터 공간 모델에 익숙한 내게 무척 어려운 개념이었다. 차근차근 하나씩 뜯어보자. 지금까지는 쿼리 q와 문서 d의 관련도를 계산했다. 이를 확률 모델로 나타내면 $p(R=1|q,d)$가 된다. 이 문제를 사용자가 유용하다고 판단한(R=1) 문서(d)가 주어졌을 때, 쿼리를 뽑아내는 문제로 바꿀 수 있다. 이를 확률 모델로 나타내면 $p(q|d,R=1)$이 된다. 말로 표현하면 "문서 d를 좋아하는 사용자는 쿼리 q를 제기할 것이다."라고 할 수 있다. 이렇게 바뀐 문제를 Query Likelihood라고 부른다. 그렇다면 이 확률 모델 $p(q|d)$를 어떻게 계산할 수 있을까? 이 문제를 해결하기 위해 언어 모델(Language Model)이 사용된다.

     

    2) Statistical Language Model

    확률적 언어 모델의 개념은 단순하게 보면 단순하다. 연속된 단어에 대한 확률 분포가 언어 모델이다. 예를 들어, "안녕하세요. 반가워요."가 나올 확률은 0.0001일 수 있고, "반가워. KT. 멋져."가 나올 확률은 훨씬 낮은 0.0000001일 수 있다. A라는 문서에서 "Hello"가 나올 확률이 0.1이고, "World"가 나올 확률이 0.01이라면 독립시행의 가정하에 A라는 문서에서 "Hello, World"가 나올 확률은 0.1 * 0.01이다. B라는 문서에서 "Hello"가 나올 확률이 0.2이고, "World"가 나올 확률이 0.02이라면 독립시행의 가정하에 B라는 문서에서 "Hello, World"가 나올 확률은 0.2 * 0.02이다. "Hello, World"가 A문서에서 나올 확률보다 B문서에서 나올 확률이 더 높으므로 검색 모델에서 순위를 매길 수 있게 된다.

     

    그렇다면, "Hello"나 "World"가 나올 확률을 어떻게 정할 수 있을까? 가장 쉬운 방법은 A문서에서 "Hello"라는 단어가 나온 횟수를 A문서 전체 단어 수로 나눈 것을 "Hello"라는 단어가 나올 확률로 정의하는 것이다. 그러나 이 방법은 A문서에서 나오지 않은 단어가 쿼리에 포함되지 않을 경우 그 쿼리가 A문서에서 나올 확률이 0이 된다는 문제점이 있다.

     

    3) Query Likelihood Retrieval Function

    2)에서 기술했듯이 독립시행의 가정하에 $p(q|d)$는 $\sum p(w|d)$로 변환된다. 여기서 과적합이나 과소적합을 막기 위해서 log를 씌울 수 있다. 쿼리에서 해당 단어가 몇 번 나왔느냐에 따라 가중치를 달리 주어야 하므로 최종식은 $\sum c(w,q) \log p(w|d)$가 된다. 

     

    4, 5) Statistical Language Model - Part 1, 2

    이제, 쿼리에 문서에 포함되지 않은 단어가 등장할 경우 확률이 0이 되는 문제를 해결해 보자. 이 경우 특정 문서가 아닌 문서 집합에서 해당 단어가 등장할 확률을 고려한다. 즉, 특정 문서에 포함된 단어라면 해당 문서에서 확률을 계산하고, 특정 문서에 포함된 단어가 아니라면 문서 집합에서 해당 단어가 등장할 확률을 고려한다. 수식으로 나타내면 다음과 같다.

     

    한편 수식 후반부 값(집합 문서 관련 값)은 아래와 같이 표현할 수 있다.

     

    해당 수식을 후반부 값에 대입하고 계산하면, 최종 수식은 아래와 같이 구성된다.

     

    여기서 정말 흥미로운 점을 발견할 수 있다. 벡터 공간 모델에서 적합한 모델을 만들기 위해서 TF-IDF, TF Transformation, Length Normalization을 적용했었다. 확률적 언어 모델에서도 비슷한 역할을 하는 값을 찾을 수 있다. 첫 번째 값의 분자는 TF에 해당하고 분모는 IDF에 해당한다. 로그값을 적용하는 것은 TF Transformation에 해당한다. 둘째 값은 Length Normalization에 해당한다. 셋째 값은 모든 모델에 동일하게 적용되므로 무시할 수 있다. 다양한 모델에 대해 처음 언급할 때, 교수님께서 최신 모델의 경우 성능이 비슷하다고 말씀하셨다. 여기서 그 비밀이 밝혀지는 듯하다.

     

    6, 7) Smoothing Methods - Part 1, 2

    자 이제 식을 완성해보자. 마지막으로 ${\alpha}_d$를 정의해야 한다. 해당 값을 람다로 정의할 경우 Linear interpolation (i.e., Jelinek-Mercer) smoothing이라고 부른다. 수식은 아래와 같다.

     

    Jelinek-Mercer Smoothing

     

    해당 값을 $\mu$ / $(\mu + d)$로 정의할 경우 Dirichlet Prior smoothing이라고 부르며 수식은 아래와 같다.

     

    Dirichlet Prior smoothing

     

    언어 모델은 벡터 모델보다 덜 경험적이면서도(less heuristic) 동일한 구성을 가지고 있다는 장점이 있다. 또한 구성된 수식이 마음에 들지 않는다면 여러 변형을 가하는 것도 여전히 가능하다. 예를 들어 TF Transformation을 강하게 주고 싶다면 log를 두 번 취할 수도 있다. 내 프로젝트에서는 언어 모델보다는 적용이 간단한 BM25를 사용할 것이지만, 언어 모델의 구조가 거대 언어 모델(LLM)의 틀을 구성한다는 점에서 강의를 흥미롭게 들었다. 

     

     

    댓글

Designed by Tistory.