순위 모델
고친 사람 github-actions[bot]
순위 모델은 검색에 걸린 문서마다 점수를 매깁니다. 검색 결과는 이 점수가 큰 순서로 정렬됩니다. 점수는 문서가 검색어에 얼마나 맞는지를 어림한 값입니다. 같은 검색어라도 어떤 모델을 쓰느냐에 따라 맨 위에 오는 문서가 달라집니다. 추천 목록을 줄 세우는 모델도 같은 이름으로 부릅니다.
쉽고 빠른 이해
순위 모델은 검색에 걸린 글마다 얼마나 맞는지 점수를 매깁니다. 「파이썬 설치」로 찾으면 두 낱말을 여러 번 다룬 글이 높은 점수를 받아 위로 갑니다. 지나가듯 한 번 쓴 글은 아래로 갑니다.
이게 없으면 검색은 낱말이 들었는지만 가립니다. 조건에 맞는 글 수천 개가 순서 없이 나옵니다. 사람은 그중 맨 위 몇 개만 봅니다.
검색은 아래 세 단계로 돕니다. 순위 모델이 맡는 것은 2번입니다.
- 검색어가 든 글을 먼저 추립니다
- 추린 글마다 정해 둔 공식으로 점수를 냅니다
- 점수가 높은 순으로 위 몇 개만 보여 줍니다
언제나 쓰는 것은 아닙니다. 주문 번호로 주문 한 건을 찾는 조회처럼 맞는 답이 하나뿐이면 필요 없습니다. 최신순·가격순 정렬도 저장된 값으로 줄만 세우면 됩니다.
대가도 있습니다. 공식이 단순하면 「자동차」와 「차량」처럼 뜻이 같은 낱말을 못 알아봅니다. 뜻까지 잡는 모델은 학습 데이터와 계산이 훨씬 많이 듭니다.
상세
도서관 사서에게 「파이썬 설치 방법」을 물었다고 해 봅시다. 사서는 먼저 서가에서 파이썬 책을 몇십 권 골라 옵니다. 그리고 설치를 첫 장부터 다룬 책은 맨 위에, 부록에서 한 쪽만 다룬 책은 맨 아래에 쌓아 건넵니다.
검색 엔진도 이 두 단계를 거칩니다. 사서가 책을 쌓는 순서를 정한 기준을 공식으로 적어 둔 것이 순위 모델입니다.
질의 · 문서 · 점수
순위 모델이 받는 입력은 둘입니다. 하나는 질의입니다. 질의는 사용자가 검색창에 넣은 낱말들, 곧 검색어입니다.
다른 하나는 문서입니다. 검색에서 문서는 찾는 대상 한 건을 말합니다. 블로그 글 한 편, 상품 한 개, 로그 한 줄이 각각 문서가 됩니다.
출력은 숫자 하나입니다. 이 숫자를 관련도 점수라고 합니다. 관련도는 문서가 사용자가 찾는 것에 얼마나 맞는지를 뜻합니다. 점수가 클수록 더 맞는다고 봅니다.
모든 문서에 점수를 낸 뒤 큰 순서로 정렬하면 검색 결과의 순서가 됩니다. 정렬은 순위 모델의 일이 아닙니다. 문서 하나에 점수 하나를 내는 데까지가 모델의 일입니다.
「모델」이라고 부르는 까닭
관련도는 사용자 머릿속에 있습니다. 같은 글도 사람마다 쓸모가 다릅니다. 시스템은 그 머릿속을 볼 수 없으므로 관련도를 직접 잴 방법이 없습니다.
대신 눈에 보이는 값으로 관련도를 어림합니다. 「검색어가 여러 번 나온 문서가 더 맞을 것이다」 같은 가정을 세우고 그 가정을 공식으로 옮깁니다. 가정과 공식을 묶은 것이 모델입니다.
가정이 다르면 공식이 달라지고 줄 세운 순서도 달라집니다. 검색 분야에서는 같은 것을 검색 모델이라고도 부릅니다.
순서가 없던 검색
순위 모델이 왜 생겼는지는 불리언 검색을 보면 드러납니다. 불리언 검색은 「파이썬 AND 설치」처럼 낱말과 AND·OR·NOT 을 엮은 조건으로 문서를 거릅니다. 문서마다 답은 「맞는다」와 「안 맞는다」 둘뿐입니다.
답이 둘뿐이면 맞는 문서끼리는 순서가 없습니다. 조건에 맞는 문서가 3천 개면 3천 개가 같은 무게로 나옵니다. 사람은 맨 위 열 개 남짓만 보므로 나머지는 없는 것과 같습니다.
순위 모델은 맞다와 안 맞다 사이에 눈금을 만듭니다. 점수라는 눈금이 생기면 더 맞는 문서를 위로 올릴 수 있습니다.
가장 단순한 순위 모델
코드로 보면 순위 모델은 질의와 문서를 받아 숫자를 돌려주는 함수입니다. 아래는 질의 낱말이 문서에 몇 번 나오는지 세어 그 합을 점수로 삼는 모델입니다.
q = ["python", "install"]
a = "python install guide python".split()
b = "install java".split()
def score(q, d):
return sum(d.count(w) for w in q)
score(q, a) # 3
score(q, b) # 1
문서 a 에는 python 이 두 번, install 이 한 번 나와 3점입니다. 문서 b 에는 install 만 한 번 나와 1점입니다. 그래서 a 가 b 보다 위에 섭니다.
이 모델에는 약점이 둘 있습니다. 하나는 「방법」처럼 거의 모든 문서에 나오는 낱말도 드문 낱말과 같은 1점을 받습니다. 다른 하나는 글이 길수록 낱말이 많이 나와 점수가 커집니다.
점수를 정하는 세 단서
두 약점을 고치려고 대부분의 순위 모델은 세 가지 값을 함께 봅니다. 아래 표는 각 값이 무엇을 세고 점수를 어느 쪽으로 움직이는지 보입니다.
| 단서 | 무엇을 세나 | 점수에 주는 영향 |
|---|---|---|
| 낱말 빈도 | 질의 낱말이 이 문서에 몇 번 나오나 | 많이 나올수록 올린다 |
| 역문서 빈도 | 질의 낱말이 든 문서가 전체에서 얼마나 드문가 | 드문 낱말일수록 크게 친다 |
| 문서 길이 | 문서에 낱말이 모두 몇 개인가 | 긴 문서가 횟수만으로 앞서지 않게 깎는다 |
역문서 빈도가 첫째 약점을 고칩니다. 「방법」은 거의 모든 문서에 있어 점수에 거의 안 보탭니다. 문서 길이가 둘째 약점을 고칩니다.
낱말 빈도와 역문서 빈도를 곱한 값이 TF-IDF(Term Frequency-Inverse Document Frequency, 낱말 빈도-역문서 빈도)입니다. 이 문서에 많이 나오는 낱말이 전체에서는 드물수록 값이 커집니다.
셋을 모두 한 공식에 넣은 것이 BM25(Best Matching 25)입니다. 셋을 어떻게 엮는지는 BM25 항목이 다룹니다.
가정에 따른 하위 종류
순위 모델은 관련도를 어떤 가정으로 어림하느냐에 따라 나뉩니다. 이 소절은 각 종류가 무엇을 가정하는지만 짚습니다. 공식은 각 항목이 다룹니다.
| 종류 | 관련도를 무엇으로 보나 | 대표 |
|---|---|---|
| 벡터 공간 방식 | 질의와 문서를 숫자 묶음으로 바꿨을 때 두 묶음이 얼마나 닮았나 | 벡터 공간 모델 |
| 확률 방식 | 이 문서가 사용자에게 맞을 확률이 얼마인가 | 확률 모델 · BM25 |
| 질의 생성 방식 | 이 문서를 쓴 사람이 질의 낱말을 고를 확률이 얼마인가 | 질의 우도 모델 |
| 학습 방식 | 사람이 판정한 정답이나 클릭 기록에 가장 잘 맞는 공식은 무엇인가 | Learning to Rank |
| 임베딩 방식 | 글의 뜻을 숫자 묶음으로 옮긴 임베딩끼리 얼마나 가까운가 | 시맨틱 검색 |
확률 방식과 질의 생성 방식은 둘 다 확률을 쓰지만 묻는 것이 다릅니다. 확률 방식은 문서를 보고 「이 문서가 사용자에게 맞을 확률」을 묻습니다. 질의 생성 방식은 문서를 보고 「이 문서에서 이 질의가 나올 확률」을 묻습니다. 문서가 그 질의를 써냈을 법할수록 맞는 문서로 봅니다.
앞의 셋은 사람이 공식을 정합니다. 학습 데이터 없이 바로 쓸 수 있습니다. 점수가 왜 나왔는지 따라가기도 쉽습니다. 대신 글자가 같은 낱말만 셉니다.
뒤의 둘은 데이터로 공식을 학습합니다. 임베딩 방식은 「자동차」와 「차량」처럼 글자가 다른 낱말도 뜻이 가까우면 가깝게 봅니다. 그만큼 학습 데이터와 계산이 훨씬 많이 듭니다.
검색 흐름 속 순위 모델
순위 모델은 검색 과정의 한 단계입니다. 이 소절은 질의 하나가 결과 화면이 되기까지 순위 모델이 어디서 일하는지 봅니다.
모든 문서에 점수를 매기면 너무 느립니다. 문서가 1억 건이면 질의 하나에 점수 계산이 1억 번입니다. 그래서 먼저 질의 낱말이 든 문서만 추립니다. 추린 문서를 후보라고 합니다.
후보를 추릴 때 쓰는 것이 역색인입니다. 역색인은 낱말마다 그 낱말이 든 문서 번호를 적어 둔 색인입니다. 질의 낱말의 번호들만 읽으면 후보가 나옵니다.
순위 모델은 후보마다 점수를 매깁니다. 그 점수로 위에서 k 개만 골라 내는 다음 단계를 상위 k 선택이라 합니다.
계산이 많은 모델을 쓸 때는 줄 세우기를 두 번 합니다. 먼저 BM25 같은 계산이 적은 모델로 후보 수천 건을 수백 건으로 줄입니다. 그다음 학습 방식 모델로 그 수백 건만 다시 줄 세웁니다. 이 두 번째 줄 세우기가 재순위화입니다.
아래 그림에서 건수가 줄어드는 것을 보면 왜 두 번 나누는지 드러납니다. 계산이 많은 모델은 맨 마지막의 적은 문서만 봅니다. 건수는 예로 든 값입니다.
flowchart TD
Q["질의"] --> R["역색인으로 후보 추리기 · 수천 건"]
R --> S["계산이 적은 모델로 점수 · 상위 수백 건"]
S --> T["학습 방식 모델로 재순위화 · 상위 열 건"]
T --> V["결과 화면"]
잘 매겼는지 재는 법
순위 모델끼리 비교하려면 결과 순서가 정답에 얼마나 가까운지를 숫자로 재야 합니다. 먼저 질의마다 사람이 「이 문서는 맞다」고 판정한 정답 목록을 만듭니다. 그리고 모델이 낸 순서를 정답 목록과 맞춰 봅니다.
정밀도는 보여 준 문서 가운데 정답의 비율입니다. 10건을 보여 줬는데 그중 4건이 정답이면 정밀도는 0.4입니다.
재현율은 정답 가운데 보여 준 문서의 비율입니다. 정답이 모두 8건인데 그중 4건을 보여 줬다면 재현율은 0.5입니다. 정밀도와 재현율 둘 다 순서는 안 봅니다.
순서까지 보려면 정답이 위쪽에 놓일수록 점수를 더 주는 지표를 씁니다. 정답마다 놓인 순위가 아래일수록 점수를 깎아서 모두 더합니다. 그 합을 정답을 모두 맨 위에 모아 놓았을 때의 합으로 나눠 0과 1 사이로 맞춥니다. 이 값이 NDCG(Normalized Discounted Cumulative Gain, 정규화 할인 누적 이득)입니다.
순위 모델이 필요 없는 때
순위 모델은 무엇이 더 맞는지 답이 하나로 안 정해질 때 씁니다. 글 검색, 상품 검색, 사내 문서 검색이 그렇습니다. 같은 검색어에 여러 문서가 조금씩 맞기 때문입니다.
순서가 이미 정해진 조회에는 필요 없습니다. 주문 번호로 주문 한 건을 찾는 조회는 맞는 답이 하나뿐입니다. 최신순이나 가격순 정렬은 저장된 값으로 줄만 세우면 됩니다. 데이터베이스에서 ORDER BY 한 줄이면 끝나는 일입니다.
추천에서 쓰는 순위 모델
추천 시스템도 같은 이름을 씁니다. 질의 대신 사용자를 넣습니다. 그리고 그 사용자가 좋아할 만한 상품이나 글에 점수를 매깁니다.
점수를 매겨 줄 세운다는 틀은 검색과 같습니다. 다른 것은 입력입니다. 검색어가 아니라 그 사용자의 기록이 점수를 가릅니다.
관련 항목
순위 모델이 속하는 상위 분류
순위 모델의 하위 종류
불리언 검색 · 벡터 공간 모델 · 확률 모델 · BM25 · 질의 우도 모델 · Learning to Rank · 임베딩 · 시맨틱 검색 · 벡터 검색 · 하이브리드 검색
순위 모델이 점수에 넣는 값
관련도 · 관련도 점수 · 낱말 빈도 · 역문서 빈도 · TF-IDF · 문서 길이 · 길이 정규화 · 코사인 유사도 · PageRank
순위 모델 앞뒤의 검색 처리 단계
질의 · 토큰화 · 역색인 · 상위 k 선택 · 재순위화
순위 모델을 재는 지표
정밀도 · 재현율 · 정밀도와 재현율 · NDCG · 평균 정밀도 · 관련성 판정
사용자를 넣어 순위를 매기는 추천 기술
추천 시스템 · 협업 필터링 · 클릭률 · 개인화
다른 이름: ranking model · retrieval model · ranking function · 랭킹 모델 · 검색 모델 · 랭킹 함수