(4강) Passage Retrieval - Sparse Embedding

💡
단어 기반 문서 검색에 대해 알아본다.

Introduction to Passage Retrieval

Passage Retrieval이란, 질문에 맞는 문서를 찾는 것을 의미한다. MRC Task에서 이 개념을 도입한 이유는, 이 개념을 통해 질문에 대해서 대규모 문서를 기반으로 답을 낼 수 있기 때문이다. 즉, Open-domain QA Task는 Passage Retrieval과 MRC를 이어서 2-Stage 형태로 구성하는 것이다.

Passage Retrieval의 Overview를 살펴보면 다음과 같다.

Passage Embedding and Sparse Embedding

Computer가 이해할 수 있는 형태 Passage에 대한 정보를 변환하는 과정을 알아보자. Passage를 Vectorization하는 것으로 위 목적을 달성할 수 있다. 추가적으로 Vector Space에 Embedding하는 것을 통해서 Passage간의 유사도 등을 구할 수 있다.

Sparse Embedding은 고차원을 기반으로 희소한 값을 갖는 형태로 Embedding을 하는 방법이다. Bag-of-Word의 개념으로, Document에 등장한 단어를 One-Hot Encoding의 형태로 결합하는 방법을 사용할 수 있다. 이 때, 각 차원에 해당하는 Vocab을 Uni-gram으로 설정할 수도 있지만, 문맥의 고려 등을 위해서 Bi-gram을 사용하기도 한다. 단, 그만큼 차원이 매우 커진다.

Sparse Embedding은 등장 단어에 따라 차원이 증가하는 특징을 가지고 있다. 이는 Term Overlap을 측정할 때에는 유리하나, 동의어와 같은 단어를 비교하는 것은 불가능하다는 한계점을 갖는다.

TF-IDF

TF-IDF는 단어의 등장 빈도와 각 단어의 중요도를 고려하는 방식이다.

TF (Term Frequency)는 해당 문서 내에서 단어가 등장하는 빈도를 의미한다. 즉, 한 문서에서 어떤 단어(혹은 Term)가 등장하는 확률 값을 의미한다.

IDF (Inverse Document Frequency)는 단어가 제공하는 정보의 양을 의미한다. 전체 문서에서 해당 단어(혹은 Term)가 등장하는 문서의 갯수를 구하고, 해당 값의 역수를 취한다. 즉, 전체 문서에서 해당 단어(혹은 Term)가 적게 등장할 수록 가중치를 주는 것이다.

이 두 개념을 조합한 것이 TF-IDF이다.

BM25는 TF-IDF의 개념을 바탕으로 문서의 길이까지 고려하는 알고리즘이다.


Reference

BM25 Code

Sklearn Feature Extraction


Project

오늘의 목표 및 진척상황

  • Retrieval Logic 이해하기
  • 아이디어 및 학습 우선순위 정리
  • QA와 Embedding 관련 이론 공부
  • End Position 관련 Issue 원인 파악 및 해결방안 강구

직면했던 문제와 학습한 내용

  1. Retrieval Logic 이해하기

    오늘 강의 이전까지 Retrieval Phage에 대해서는 관심을 갖지 않고 있었다. 오늘 강의를 듣고 나서도, Baseline에 해당 부분을 볼 생각을 하지 않고 있었다. 아주 기본적인 것 조차 파악을 하지 않고 있는 상태였다. 심지어 Document를 저장해놓은 JSON File이 어디있는지도 몰랐다.

    오늘 Peer Session간 아주 추상적이고 멍청한 질문을 했는데도, 친절한 설명을 들을 수 있었다. 재희님이 강의 실습 Code에 대해 설명해주셨고, 팀원들이 추가적인 정보를 제공해주는 덕에 감을 잡을 수 있었다.

    현재 Baseline 기준으로 Submit을 제출하면, EM이 0~10% 정도 수준으로 기록된다. 익효님 말씀을 들어보니, Validation Set에 대한 Score보다 매우 낮기 때문에 Retrieval Phage에 대한 개선이 시급하다고 한다. 실제로 Validation Score를 확인해보니, EM이 약 40%정도로, 큰 차이를 보이는 것을 확인했다.

  1. 아이디어 및 학습 우선순위 정리

    오늘 Peer Session만 하더라도 정말 많은 아이디어가 쏟아져 나왔다. 적용해볼만한 아이디어가 정말 많았고, 어떻게 구현할지를 고민하다가 머리가 멈췄다. 우선순위를 먼저 결정해야겠다는 생각이 들었고, 다음과 같이 진행하기로 결정했다.

    1. Baseline의 전처리 과정확인
    1. Baseline의 성능 확인 및 문제점 개선 (음절단위 Tokenizing, Post-process를 통한 조사제거)
    1. Baseline Retrieval Code 이해 및 개선 (BM25, Doc2Vec)
  1. QA 관련 이론 공부

    장식용이 돼버린 '자연어 처리 바이블'을 펼쳐봤다. QA에 대한 이론과 Embedding에 대한 기본 개념이 있었고, 차근차근 읽어봤다. 각 방법론의 등장 배경과 특징에 대해 알 수 있었고, 최신 이론에 대한 Keyword를 얻을 수 있었다.

  1. End Position 관련 Issue 원인 파악 및 해결방안 강구

    train.py의 입출력을 확인하던 중, End Position이 정확하지 않게 Labeling되는 Issue를 확인했다. 어느 부분에서 해당 Issue가 확인하고 싶어서, 해당 함수를 뜯어보기 시작했다. 가장 괴로웠던 건 Tokenizer의 Output을 확인하는 부분이었다. Overflow가 발생했을 경우 Return하는 Value가 익숙하지 않았다. 예를 들면, offset_mappingoverflow_to_sample_mapping의 Value가 무엇을 의미하는지 전혀 알 수 없었다. Tokenized Data의 sequence_ids도 마찬가지였다. 심지어 Dataset의 answer의 Value에 인덱싱 접근을 하는 Code가 있는데, 하나씩 뜯어보다보면 이 마저도 이상한 부분이 있었다.

    아무튼, 최초의 목적이었던 End Position Label이 왜 정확하지 않은지에 대한 이유는 찾을 수 있었다. 해당 End Position에 해당하는 Token을 찾을 때, offset_mapping을 기준으로 사용하고, 정확한 지점을 찾을 수 없다는 것이다.

    KLUE 강의에서 음절 단위 Tokenizing을 통해 이와 같은 Issue를 해결할 수 있다고 했던게 생각나서 해당 실습 Code를 공부했다. 결론은, 음절단위 Tokenizer를 새로 정의해서 학습하는 방식이었다. 원래 계획은 해당 Code까지 구현하는 것이었으나, 집중력 고갈로 일찍 잤다.

추가로 진행 할 사항

  • 음절 단위 Tokenizer로 학습하기
  • Retrieval Code 개선하기

'네이버 부스트캠프 AI Tech' 카테고리의 다른 글

[P3] Day 65 (21.04.30)  (0) 2021.06.26
[P3] Day 64 (21.04.29)  (0) 2021.06.26
[P3] Day 62 (21.04.27)  (0) 2021.06.26
[P3] Day 61 (21.04.26)  (0) 2021.06.26
[P2] Relation Extraction Competition Wrap-up Report  (0) 2021.04.26

+ Recent posts