Day_50 03. QA with Phrase Retrieval

작성일

6 분 소요

QA with Phrase Retrieval

1. Phrase Retrieval in Open-Domain Question Answering

Current limitation of Retrieval-Reader approach

  1. Error Propagation : 5-10개의 문서만 reader 에게 전달 됨
  2. Query-dependent encoding: query 에 따라 정답이 되는 answer span 에 대한 encoding 이 달라짐

Error Propagation 이 항상 따라 다닐 수 밖에 없음

이게 어떤 의미냐면?

5-10개 정도의 문서만 찾아서 Reader 에게 전달하게 됨

근데 이 문서들이 사실 올바른 문서라는 보장이 없음

즉 Retrieval 이 잘 못하면 아무리 Reading Model 이 잘 한다고 하더라도 성능이 잘 안나오는 issue 가 있음

이런 문제를 해결하는 것이 굉장히 중요한 부분임

How does Document Search work?

phrase search 는 document search 와 상당히 비슷함

document search 같은 경우는 실제로 문서를 가져오려고 할 때 이 문서에 대한 vector Dense or Sparse vector 를 만들고 indexing 을 한 다음에 새로운 question 이 들어오면 관련 있는 문서를 찾는 방법론으로 Nearest Neighbor Search 나 MIPS 를 활용하여 문서를 찾았음

이런 방법으로 문서를 찾듯이 문서검색을 하듯이 정답 즉 phrase 를 바로 검색할 수 없을까? 라는 아이디어에서 출발한 접근법임

One solution: Phrase Indexing

이런 문서가 있다고 치면 이 문서에 존재하는 모든 phrase 를 enumerate 시킴

이것들을 일종의 memory values 라고 볼 수 있음

모든 존재하는 phrase 들을 enumerate 시킨 다음에 이 각각에 대한 phrase 에 대한 embedding 을 오른쪽에 맵핑해줌

이 벡터들을 key vecotr 라고 볼 수 있고 이렇게 해놓으면 질문이 들어왔을 때 질문에 해당되는 vector 와 가장 가까운 key vector 를 찾는 방식으로 문제를 치환할 수 있음

이렇게 되면 새로운 지문이 들어온다 하더라도 key vector 들은 update 가 필요 없이 새로운 question 에 대한 vector 만 계산을 해서 key vector 에 연결해주는 방법을 취할 수 있음

Query-Agnostic Decomposition

실제로 이렇게 접근하게되면 기존의 MRC 모델 같은 경우 F 라는 scoring function 을 구하는 문제라 볼 수 있음

이 scoring function 을 가능한 모든 candidate 과 그리고 질문과 문서가 input 으로 들어오게되고 이 3개를 모델에 넣어줌으로써 답변이 scoring 해주는 구조임

이 모든 가능한 triplet 중에서 가장 점수가 높은 triplet 을 골라주는 구조임

이런 모델을 정의하고 난 다음에 학습을 한 후에는 실제로 inference time 때는 어떤 a 를 저기에 넣어줘야 가장 높은 score 가 나오는지를 구하는 방식이라고 볼 수 있음

이런 방법론의 큰 문제는 새로운 질문이 들어왔을 때 a 랑 d 는 똑같다고 하더라도 왜냐하면 a 는 fix 된 corpus 내에 있는 phrase 들이니까

새로운 질문이 들어올때마다 F 라는 function 을 다시한번 계산해줘야 하는 불편함이 있음

이런 불편함을 phrase retrieval 방법으로 접근하게되면 G 와 H 라는 encoder function 을 정의하는 것이고 여기서 G 는 question 을 encoding 해서 vector space 에 mapping 해주고 H 같은 경우는 각 answer candidate 와 문서를 vector space 에 mapping 해줘서 Inner product 가장 높은 or Nearest Neighbor distance 가 가장 가까운 a 를 찾는 방식으로 문제를 치환할 수 있음

이렇게 문제를 치환해주는게 phrase retrieval 로 치환하는것과 똑같은 방법인건데 이렇게 해주게되면 장점은 명확함

H 쪽에 문서들을 다시한번 encoding 할 필요가 없음

질문이 들어올때마다 G 만 돌리고 H 는 그대로 두면 됨

그렇기때문에 효율적이고 Inner product 또는 Nearest Neighbor Search 는 상당히 효율적으로 큰 개수의 d 와 a 에서 찾을 수 있기때문에 상당히 빠름

하지만 가장 큰 단점은 중요한 assumption 이 있다는 건데 F 라는 function 이 정의되었을 때 F 가 G 와 H 로 나눠질 수 있다는 가정자체가 틀릴 수 있기 때문임

F 가 G 와 H 로 나눠질 수 있다는 보장이 없음

여기서 말하는 F 라는 function 은 간단한 function 이 아니고 상당히 복잡한 function 임

이 복잡한 function 이 decompose 된다는 보장은 없음

따라서 실질적으로는 exact 하게 decompose 하기 보다는 G 랑 H 를 학습을 하되 최대한 F 를 미닉하는 approximate 하는 방식으로 갈 수 밖에 없음

이랬을 때 key challenge 라고 볼 수 있는 부분은 어떻게 phrase 를 G 나 H 를 모델링하여 vector space 상에 잘 mapping 할 수 있을까? 라고 볼 수 있고 그 중 하나의 solution 은 Dense 와 Sparse 둘 다 사용해보는 방법이 있음

2. Dense-sparse Representation for Phrases

Dense vectors vs Sparse vectors

  • Dense vectors: 통사적, 의미적 정보를 담는데 효과적
  • Sparse vectors: 어휘적 정보를 담는데 효과적

Phrase and Question Embedding

Dense vector 와 sparse vector 를 모두 사용하여 phrase (and question) embedding

둘을 모두 활용하는 방법은 간단함

각각의 phrase embedding 을 구할 때 Dense 만 쓰는 것이 아니라 sparse 까지 계산한 후에 두 가지의 vector 를 합쳐줘서 하나의 vector 로 고려하고 Inner product 나 nearest neighbor sesarch 를 진행함

그러면 Dense 나 Sparse vector 를 어떻게 계산해야 할까?

Dense representation

Dense vector 를 만드는 방법

  • Pre-trained LM(e.g. BERT)를 이용
  • Start vector 와 end vector 를 재사용해서 메모리 사용량을 줄임

시작점의 vector 와 끝점의 vector 를 합쳐줘서 phrase vector 를 정의함

예를 들면 아래와 같이 “the American Library Association” 에 해당하는 phrase vector 를 구하고 싶다고 한다면 “the” 에 해당하는 vector 일부분과 “Association” 에 해당하는 vector 일부분을 가져와서 두개의 vector 를 붙이고

맨 마지막에 간단하게 하나의 숫자를 더해줌으로써 phrase 가 좋은 phrase 인지 아닌지를 표시하고 정답일 것 같지 않은 phrase 들을 걸러내기 위한 용도로 쓰임

Coherency vector

  • phrase 가 한 단위의 문장 구성 요소에 해당하는지를 나타냄
  • 구를 형성하지 않는 phrase 를 걸러내기 위해 사용함
  • Start vector 와 end vector 를 이용하여 계산

Question embedding

  • Question 을 임베딩할때는 [CLS] 토큰 (BERT) 을 활용

Sparse representation

Sparse vector 를 만드는 방법

  • 문맥화된 임베딩(contextualized embedding)을 활용하여 가장 관련성이 높은 n-gram 으로 sparse vector 구성

target 으로 하고 있는 phrase 에 들어있는 단어들과 유사성을 계산해서 그 유사성을 각 단어에 해당하는 sparse vector 상의 dimension 에 넣어줌으로써 일종의 TF-IDF 와 비슷하지만 TF-IDF 와 다르게 각 phrase 마다 weight 가 dynamic 하게 변하는 형태의 vector 로 만들어 줄 수 있음

uni-gram 뿐만 아니라 n-gram 을 활용하여 겹치는 부분까지 어느 정도 정보를 활용할 수 있음

Scalability Challenge

In Wikipedia: 60 billion 개의 phrase 가 존재 $\rightarrow$ Storage, indexing, search 의 scalability 가 고려되어야 함

  • Storage Pointer, filter, scalar quantization 활용 (240T storage $\rightarrow$ 1.4T storage)
  • Search: FAISS 를 활용해 dense vector 에 대한 search 를 먼저 수행 후 sparse vector 로 reranking

실제로 이렇게 했을 때 가장 큰 issue 중 하나는 wikipedia 에는 600억개의 phrase 가 존재하고 이런 것들을 다 저장하고 indexing 을 한다음에 검색을 하기 위해서는 정말 scalability(확장성)가 고려되어야 함

저장공간도 엄청 필요하고 이거를 여러가지 trick 으로 1.4T 까지 줄일 수는 있음

그리고 검색을 할 때도 검색할 대상이 워낙 크다보니까 수십억 단위다 보니까 FAISS 를 활용해 마찬가지로 빠르게 검색을 하려고 하는데 FIASS 같은 경우에는 dense vector 에 대한 검색만 가능하고 sparse 에 대한 검색을 할 수 없기 때문에 dense part 를 먼저 검색하고 그 다음에 sparse part 를 score 를 계산해서 reranking 하는 방식을 취함

3. Experiment Results & Analysis

Experiment Results - SQuAD-open

SQuAD-open (Open-domain QA)

  • s/Q : seconds per query on CPU
  • #D/Q : number of documents visited per query
  • DrQA (Retriever-reader) 보다 +3.6% 성능 / 68x 빠른 inference speed (less than 1s)

phrase 를 retrieval 할 때 연산량이 워낙 적다보니까 가질 수 있는 이점임

accuracy 도 높고 speed 도 빠른걸 알 수 있음

Limitation in Phrase Retrieval Approach

  1. Large storage required : 2TB SSD for phrases
  2. 최신 Retriever-reader 모델들 대비 낮은 성능
    • SQuAD-open 결과: (EM) 38.6 (BERT serini) - Retriever-reader vs. 33.4 (DenSPI) - Phrase retrieval
    • Natural Questions (NQ) 에서 낮은 성능
      $\rightarrow$ Decomposability gap 이 하나의 원인

단점으로는 CPU 가 적어도 4코어 가 필요하고 RAM 도 적어도 30GB 필요하고 저장공간도 1.5TB 이상의 공간이 필요함

하지만 GPU 는 필요없음

당시에는 비교적 성능이 잘 나왔지만 이후에 나온 모델과 비교해서는 낮은 성능임

Decomposability gap
(기존) Question, passage, answer 가 모두 함께 encoding
$\rightarrow$ (Phrase retrieval) Question 과 passage/answer 이 각각 encoding $\rightarrow$ Question 과 phrase 사이 attention 정보 x

실제로 MRC 데이터에 똑같은 환경으로 실험을 해봤을때도 Decomposability gap 이 9% 정도 나는 것을 오른쪽에서 볼 수 있음

댓글남기기