검색 서비스 만족도 판별 모델에 이어 검색 서비스 랭킹 모델을 개발한 과정을 정리해 봤습니다. 먼저 참고한 논문들을 소개하고 구현해보겠습니다.
A Deep Relevance Matching Model for Ad-hoc Retrieval (DRMM)
DRMM introduction
검색 서비스를 제공할때 고려하여야 할점은 검색어와 검색 결과의 연관성뿐만 아니라 연관성이 높은 결과를 상위에 노출시키는것 또한 중요합니다. 딥러닝은 여러 분야에서 SOTA를 달성하고 있지만 DRMM이 제안되기 전 딥러닝을 통한 검색 서비스 랭킹 시스템은 전통적인 머신러닝 방식을 훨신 뛰어넘는 성과를 달성하지 못하였습니다.
랭킹 시스템에서 일반적인 딥러닝 모델은 두 text의 매칭문제로 바라보았습니다. 이에 논문은 모델 접근법에 따라 표현중심(representation-forcused) 모델(DSSM, ARC-I)과 상호작용중심(Interaction-focused) 모델(Deep Match, ARC-II)로 구분하고 이에 따른 모델 아키텍쳐를 설명합니다.
표현중심 모델은 각 text의 의미를 잘 표현하는 구조에 집중하여 검색어와 검색결과의 의미를 매칭시키는데 집중합니다. 상호작용 중심 모델은 두 text의 상호작용을 계층적으로 배워 관련성을 매칭시키는데 집중합니다. 논문은 딥러닝이 좋은 성과를 내지못한 이유가 제안되었던 접근 방식들이, 의미론적 매칭을 위한, 표현중심 모델링이기 때문이라고 주장 하였습니다.
표현중심 모델(a)은 검색어와 검색결과를 각각 input으로써 모델에 입력하여 대칭적인 아키텍쳐를 보입니다. 반면에, 상호작용중심 모델(b)은 검색어와 검색결과의 연산을 거쳐 계층적인 일치도를 파악하기에 피라미드 모양의 아키텍쳐를 보입니다.
NLP에서 두 텍스트 사이의 일치도를 이용하는 시스템은 여러가지가 있습니다. 고객이 올린 질문에 대한 답변을 찾아주는 QnA모델, 실시간 채팅서비스를 제공하는 chatbot, 정확한 검색 서비스를 제공하는 랭킹모델등등 언뜻 생각하면 비슷한 구조를 가질것 이라는 생각이 들지만 접근법에 따라 상당히 다른 아케텍쳐가 사용됩니다. 논문은 retrival task는 기존의 의미적 매칭 접근법과 근본적으로 다르며 관련성 기준으로 매칭시켜야 한다고 주장합니다.
논문은 이 차이점을 설명하고 관련성 매칭으로 접근해야하는 이유를 설명합니다.
The major contributions of this paper include
- 의미적, 관련성 매칭의 차이점을 지적하고 그에따른 모델 구조 설명
- 관련성 매칭에 대한 3가지 핵심요인을 따른 새로운 모델 제안
- 기존 방식의 단점과 제안한 모델(DRMM)의 장점 분석
Ad-hoc retrieval as a matching problem
관련성 점수를 계산하는 큰틀은 다음 식과 같습니다.
Φ는 word2vec처럼 text를 vector로 표현하는 함수입니다. 𝐹는 계산된 벡터 표현으로부터 점수를 계산하는 함수입니다. 앞서 설명했듯이 접근법에 따라 함수또한 달라지는데, 일반적으로 표현중심모델은 문장의 벡터표현이 중요하기 때문에 상대적으로 Φ부분이 복잡하고, 상호작용 중심 모델의 경우는 두 텍스트 사이의 상호작용을 계층적으로 파악하려 하기에 𝐹부분이 복잡합니다.
semantic matching VS relevance matching
이번에는 semantic matching과 retrieval matching의 차이점에대 해서 논의 하겟습니다.
paraphrase identification, question answering, automatic conversation와 같은 NLP task에서의 매칭은 주로 semantic matching으로 접근합니다.의미론적 관계 추론은 다음 3가지 핵심요인을 고려해야 합니다.
- similarity matching signals
서로 다르게 표현된 문장들이 같은 의미를 가지는지 다른 의미를 가지는지 식별할 수 있어야 합니다. 예로 automatic conversation은 사용자와 대화에서 의미적으로 관련된 적절한 응답을 찾는 것이 목표이며, 사용자들은 같은 의미를 전달하기 위해서 서로 다른 문장을 사용할수 있습니다. - compositional meanings
의미론적 매칭을 요구하는 작업의 텍스트 데이터는 일반적으로 문법 구조를 가진 자연어 문장으로 구성되어 있습니다. 이는 문법 구조를 포착할 수 있는 모델링이 유리하다는것을 의미합니다. 예를 들어, QnA 시스템에서 대부분의 질문에는 명확한 문법 구조가있어 질문 내용의 의미를 식별하는 데 도움이됩니다. - Global matching requirement
두 텍스트를 전체적인 의미를 유추한뒤 텍스트를 매칭시켜야 합니다.
관련성 추론은 다음 3가지 핵심 요인이 있습니다.
- Exact matching signals
두 텍스트의 의미론적 관련성 신호가 중요하긴 하지만 비교하는 텍스트의 정확한 일치신호가 훨신더 강력한 신호로 다루어야 합니다. Fang and Zhai는 의미적으로 비슷한 용어를 여러번 일치시키는 것보다 정확히 같은 용어의 신호를 다루는것이 관련성 점수에 기여한다고 하였습니다. 이는 BM25와 같은 전통적인 머신러닝방법이 잘 작동하는 이유이기도 합니다. - Query term importance
일반적으로 검색어는 키워드 기반입니다 이는 검색어에서 단어가 ‘and’관계이며 상대적인 중요도가 존재한다는 것입니다. 예를들어, ‘비트코인 뉴스’라는 검색어는 ‘비트코인’과 ‘뉴스’라는 키워드로 이루어져있으며 중요도는 ‘비트코인’ < ‘뉴스’로 해석할 수 있습니다. - Diverse matching requirement
검색 결과의 문서는 매우 길어질 수 있으며 문서 길이에 대해 서로 다른 가설이있어 다양한 요구 사항이 발생합니다.
Verbosity Hypothesis: 긴 문서는 짧은 문서와 유사하지만 많은 단어를 담고 있다. 이 경우 짧은 문서에 집중된 주제가 있다고 가정하면 관련성 일치가 Global해야 합니다.
Scope Hypothsis : 긴 문서는 여러개의 관련없는 짧은 문서로 구성되어 있다. 이 경우 관련성 일치는 문서의 어느 부분에서나 발생할 수 있으며 문서 전체가 쿼리와 관련 될 필요는 없다고 합니다.
이를 볼때 기존 방식은 대부분 의미론적 매칭에 가까우며, 검색서비스에서는 관련도 추론이 더욱 적합합니다.
Deep Relevance Matching Model
이에 논문은 새로운 상호작용중심 모델 DRMM을 제안합니다. 그림은 DRMM의 전체 구조입니다.
다음은 수식 구조 입니다. 각 𝑤^q와 w^d는 pretrained word2vec으로 표현된 term vector입니다 아래에 각 수식에 대한 설명을 해보겟습니다.
Local Interaction (𝑤⊗𝑑)
⊗는 interaction operator입니다. 거창해보이지만 pretrained word2vec모델로 표현된 단어들의 cos 유사도입니다…
즉, 검색어와 검색결과의 각 단어들마다 유사도 행렬을 구합니다.
- pretrained word2vec를 사용하는 이유는 ground truth보다 Large scale unlabeled text collection에서 학습된 표현이 정확도가 높았고 전체 모델의 복잡성을 낮추기 위해서라고 합니다.
Matching Histogram Mapping ℎ(𝑥)
가변길이 tensor를 고정길이로 구간입니다. 논문에 따르면 Local Interaction에서 구한 유사도 행렬이 위에 서술한 Diverse matching requirement를 만족하지 못하기 때문에 잠재적으로 유사도 행렬이 적합하지 않을수 있다고 합니다. 그러므로 DRMM은 히스토그램을 채택하여 위치보다 신호의 강도를 그룹화 합니다.
예를들어 코사인 유사도를 0.5마다 그룹화하면 {[−1, −0.5), [−0.5, −0), [0, 0.5), [0.5, 1), [1, 1]}라는 5개의 그룹이 나옵니다. 이때 검색어에서 “car”라는 단어와 문서의 “car, rent, truck, bump, injunction, runway”라는 단어들의 유사도가 (1, 0.2, 0.7, 0.3, −0.1, 0.1)라고 계산되었다면 그룹화한 유사도 히스토그램은 [0, 1, 3, 1, 1]으로 표현됩니다.
- 여기서 Exact matching signals 요구사항을 만족시키기 위하여 정확한 일치 신호인 [1, 1]그룹을 명시적으로 표현합니다.
계산된 히스토그램을 그대로 사용할 수 있지만 한번의 계산을 거쳐 좀더 좋은 정보로 바꿉니다.
- Count-based Histogram (CH)
각 구간에 속한 유사도들의 빈도를 히스토그램으로 사용합니다. 그냥 위에 구한 히스토그램을 그대로 사용하는것입니다. - Normalized Histogram (NH)
Count-based Histogram를 정규화 해서 절대 갯수가 아닌 상대 갯수정보를 사용합니다. - LogCount-based Histogram (LCH)
Count-based Histogram에 로그함수를 적용하여 범위를 줄여 모델이 곱셈관계를 더 쉽게 배울수 있게 합니다.
정리하자면 히스토그램을 채택함으로써 정확한 매칭과 유사한 매칭신호를 명확하게 구분하고 가변길이 벡터를 패딩없이 고정길이 벡터로 표현합니다.
Feed forward Matching Network 𝑍=𝑡𝑎𝑛ℎ(x)
이 구간에서는 계층적 일치 패턴을 학습합니다. 기존에는 CNN을 사용함으로써 계층적 패턴을 학습하려 했습니다. 이러한 모델은 (Local)Receptive Field가 있는 Conv unit을 사용하고 일치 패턴에서 위치 규칙을 학습합니다. 즉 Global matching requirement를 만족하므로 의미론적 매칭 모델에서 잘 작동합니다.
하지만 논문은 검색어에서 위치 규칙성이 없을 수 있으므로 CNN은 적합하지 않다고 판단하여 MLP를 채택합니다. 이에 DRMM은 위치보다 강도에 신호의 강도에 중점을 두어 더욱 유리하다고 합니다.
Term Gating Network s = ∑ g⋅Z
검색어의 중요성을 명시적으로 모델링하는 부분입니다. 각 𝑔들은 수치화된 단어들의 소프트맥스로 계산됩니다.
여기서 wg 는 Term Gating Network Weight이며 𝑥는 수치로 표현된 검색어의 각 단어입니다. 수치적 표현은 두가지 방법이 있습니다.
- Term Vector(TV)
임베딩된 단어를 그대로 사용합니다. 여기서 가중치의 차원또한 임베딩 차원과 같게 맞춰줍니다. - Inverse Document Frequency(IDF)
NLP task에서 많이 사용하는 IDF를 채택함으로써 각 단어의 중요성 정보또한 모델에 입력합니다. 여기서 가중치는 sigle parameter가 됩니다.
Model Training
모델을 학습하기 위한 Loss는 Pairwise ranking loss를 채택합니다.
여기서 𝑑+는 검색어에 대해 관련성이 높은 문서입니다.
Model Implement
검색 만족도 판별 모델에서 사용하였던 Crowdflower 데이터를 사용하여 구현 한뒤 평가 결과를 직접 비교해보도록 하겟습니다. keras의 functional API를 이용하여 각 구간을 구현한뒤 하나의 모델로 합쳤습니다.
(자세한 code는 github을 참고해 주세요)
class DRMM(tf.keras.Model):
def __init__(self):
super(DRMM, self).__init__(name=’DRMM’)
self._supports_ragged_inputs = True
self.Word_Matching_Network = Word_Matching_Network()
self.Gating_Network = Gating_Network()
self.Score_Aggregation = Score_Aggregation() def call(self, inputs, idf):
Z = self.Word_Matching_Network(inputs)
G = self.Gating_Network(idf)
score = self.Score_Aggregation(Z, G)
return score
Evaluation
논문에서과 같이 평가는 nDCG@20와 mAP로 해보겟습니다.(1에 가까울수록 좋은 지표입니다.) 아래는 모델의 학습 히스토리 입니다.
사실 본인이 직접 구현하는것이 아닌이상 단순히 평가 지표로는 얼마나 좋은 모델이지 감이 오지 않습니다. 또한 가지고 있는 데이터가 관련도가 4인 data가 60%가까이 되므로 nDCG와 mAP값이 높게 계산됩니다. dev set에서 예시를 하나 보겠습니다. 생각보다 학습이 잘 이루어 졌습니다.
글이 길어져서 다음글에 이어서 작성해보겠습니다.😂
Github
(자세한 코드와 설명은 Github을 참고해 주세요)