딥러닝 논문리뷰

Dense Passage Retrieval for Open-Domain Question Answering

빈이름 2023. 3. 30. 16:51

배경

Open-Domain Question Answering

QA 문제는 질문에 대한 답을 내는 과제입니다. 일반적으로 질문이 주어지면, 정답이 포함된 passage를 보고 거기서 정답을 찾아내는 방식을 사용합니다. Open-Domain Question Answering은 좀 더 어려운 과제로, 정답이 포함된 passage를 제시해주지 않습니다. 모델이 직접 정답과 관련된 passage를 찾아서 정답을 내야 합니다. Open-Domain  예시로 KorQuAD를 살펴보겠습니다. KorQuAD는 10만여개의 wikipedia 문서와 약 5만개의 질문-답변 쌍으로 이루어진 데이터셋입니다. 이 과제를 해결하는 방법은, 1) wikipedia 문서들 중에서 질문과 관련 있는 문서를 찾은 뒤(retrieval), 2) 해당 문서에서 질문에 해당하는 답을 찾는 것(reader)입니다.

Open-Domain Question Answering(ODQA) 해결 과정

1. 관련 문서에서 정답 찾기(Reader)

우선 2) 문서에서 질문에 해당하는 답을 찾는 방식을 먼저 알아보겠습니다. 이를 딥러닝을 통해서 해결하는 방식은 generation 방식과 extraction 방식이 있습니다. 두 방식 모두 "질문"과 "관련 문서"를 입력으로 받습니다.

Extraction 방식은 "관련 문서"에서 정답의 위치를 추론해내는 방식입니다. 정확히는 문서 내의 정답의 "시작 위치"와 "끝 위치"를 각각 예측해 냅니다. Generation 방식은 생성 모델을 사용해 답을 직접 생성해냅니다.

Generation 방식과 Extraction 방식

두 방식은 각각 장단점이 있습니다. 일반적으로 Extraction 방식의 성능이 더 좋지만, 문서에 정답이 존재하지 않는 경우에도 답을 낼 수 있는 Generation 방식도 나름의 장점을 가집니다.

  Extraction 방식 Generation 방식
장점 문서에서 정답 위치를 찾기 때문에 답을 내기 쉽다. 문서를 보고 모델이 직접 답을 생성해야 하기 때문에 답을 내기 어렵다.
단점 문서에 정답이 존재하지 않는 경우 답을 낼 수 없다. 문서에 정답이 존재하지 않는 경우에도 답을 낼 수 있다.

Reader 모델의 평가는 EM(Exact Match)와 F1 score를 사용합니다. EM은 말 그대로 모델이 낸 정답과 실제 정답이 '정확히 일치'하는 경우에는 1점, 그 외의 모든 경우는 0점을 줍니다. F1 score는 EM보다 좀 더 유한 버전의 평가지표입니다. F1 score는 2가지 점수(precision, recall)를 같이 고려합니다. 여기서 precision은 모델의 예측한 답에 정답 글자가 얼마나 포함되어 있는가를 측정하고, recall은 정답에 모델의 예측 글자가 얼마나 포함되어 있는가를 측정합니다.

F1 점수 계산 방법. 위의 경우 EM은 0점이 된다.

2. 관련 문서 찾기(Retrieval)

이번에 볼 DPR논문은 이 부분과 관련 있습니다. 관련 문서를 찾는 모델은 retrieval라고 합니다. Retrieval도 2가지 방식으로 나뉩니다. 하나는 단어 기반 방식이고 하나는 Dense representation 기반 방식(딥러닝)입니다. 두 방식도 각각 장단점을 가집니다.

  단어 기반(TF-IDF, BM25) Dense representation 기반(딥러닝)
장점 연산이 빠르고 학습이 필요 없음. 연산이 오래 걸리고 학습이 필요함.
단점 겹치는 단어를 기반으로 검색하기 때문에 동의어에 취약함. 학습이 가능하기 때문에 동의어도 생각할 수 있고, 특정 도메인에 특화되도록 학습 가능.

단어 기반의 방식은 질문과 가장 겹치는 단어의 수를 기반으로 찾는 방식입니다. 그렇기 때문에 관련이 있더라도 겹치는 단어가 없는 경우(동의어를 사용하는 경우)에는 찾아낼 수 없습니다. 대표적인 방식으로 TF-IDF와 BM25 방식이 있습니다. (궁금하신 분들을 위해 TF-IDF 내용을 '더보기'에 작성해 놓겠습니다.)

 

더보기

좀 더 이해를 돕기 위해 TF-IDF 계산 방법을 알아보겠습니다. TF-IDF는 문서에 나타나는 단어들에 가중치를 부여해 문서 간의 유사도를 판별합니다. TF-IDF는 다음과 같은 수식을 통해 계산됩니다.

$$ idf(d,t)=log(\frac{n}{1+df(t)}) $$

$$ TF_IDF = idf(d,t)*tf(d,t) $$

- $tf(d,t)$ : 특정 문서($d$)에서 특정 단어($t$)가 등장한 횟수.

- $df(t)$ : 특정 단어($t$)가 등장한 문서의 수.

- $idf(d,t)$ : $df(t)$에 반비례하는 값으로, TF-IDF는 $tf(d,t)$와 $idf(d,t)$의 곱으로 계산됩니다. 반비례 값을 곱하는 이유는 모든 문서에 공통적으로 등장하는 단어보다는, 특정 문서에서만 나타나는 단어들이 더 그 문서의 특징을 잘 드러낼 것이라는 가정 때문에 그렇습니다. (공통적으로 많이 등장하는 단어는 '은, 는, 이, 가'와 같은 조사와 같은 단어들이지만 그렇지 않은 단어들은 그 문서의 내용과 관련된 전문 단어일 확률이 높다) 즉, TF-IDF는 특정 주제와 관련된 전문 단어들이 공통적으로 쓰인 문서들의 유사도를 높다고 봅니다.

 

Dense representation 방식은 딥러닝 모델을 사용하는 방식을 말합니다. 학습이 가능하기 때문에 단어 기반의 방식이 찾지 못하는 경우를 찾을 수 있습니다. 하지만 연산이 오래 걸리는 문제가 있고, 결정적으로 단어 기반의 방식보다 성능이 좋지 못했습니다. 그래서 오랜 시간동안 Open-Domain Question Answering 분야에서는 retrieval는 TF-IDF/BM25를 사용하고, reader 부분의 딥러닝 모델을 개발하는 방식으로 연구가 이루어졌었습니다.

 

Retrieval를 통해 찾은 가장 유사도가 높은 문서가 꼭 정답을 포함하고 있다는 보장은 없습니다. 그렇기 때문에 보통 상위 k개의 문서를 가져오는 방식을 택합니다.(top-k) 모델 평가도 수집된 top-k개의 문서 중 정답 문서가 있을 확률(top-k accuracy)로 이뤄집니다. 최종적으로 reader 모델이 top-k개의 문서들에서 정답을 추출한 뒤에, 가장 정답에 유사한 답을 선택하여 최종 답을 내게 됩니다.

 

처음으로 Dense representation 방식이 TF-IDF/BM25의 성능을 넘어선 연구는 ORQAREALM입니다. 그러나 두 가지 방식 모두 사전 pre-training을 필요로 합니다. 그리고 retrieval와 reader가 함께 훈련되는 fine-tuning을 거칩니다. 그러나 이런 일련의 과정 자체가 매우 번거롭고 많은 연산량을 요구합니다.

Dense Passage Retrieval(이하 DPR)은 이런 pre-training 과정을 없애는 것이 목표입니다. 오로지 질문과 관련 문서 쌍을 이용해 retrieval만 훈련 시키는 더 간단한 과정을 사용하면서도 ORQA나 REALM보다 더 좋은 성능을 보인다고 합니다.

Dense Passage Retrieval

Retrieval의 목적은 문서 집합에서 질문과 관련 있는 문서를 찾는 것입니다. 이를 위해서 질문과 문서들의 벡터를 적절하게 벡터 공간에 매핑(indexing)하는 것이 필요합니다. 서로 관련 있는 질문과 문서끼리는 가깝게, 그렇지 않은 문서들은 멀어지게 학습을 하는 것입니다. 이런 학습 방식을 contrastive learning이라고 합니다. DPR은 BERT를 사용해 문장들을 벡터 공간에 매핑합니다.

학습을 통해 문서들을 벡터 공간에 위와 같이 매핑해야 합니다.

보통 Open Domain QA에서 사용되는 문서집합은 수가 굉장히 많습니다. (KorQuAD만 봐도 10만 개가 넘습니다.) 이 많은 문서들의 벡터를 매번 계산하기에는 시간이 너무 오래 걸립니다. 그렇기 때문에 연산을 최대한 출이기 위해 문서들의 벡터는 미리 계산해 두는 것이 좋습니다. DPR은 dot product를 유사도 계산에 사용합니다. Dot product는 계산 방법이 단순하고, 미리 계산된 벡터를 그대로 사용할 수 있다는 장점이 있습니다.

질문과 관련 있는 문서를 찾는 방법.

Training 방법

손실 함수는 긍정 passage에 대한 negative log likelihood를 사용해 계산합니다.

$$ L(q_i,p_i^+,p_{i,1}^-,...,p_{i,n}^-)=-log\frac{e^{sim(q_i,q_i^+)}}{e^{sim(q_i,P_i^+)}+\Sigma^n_{j=1}e^{sim(q_i,p_{i,j}^-)}} $$

$q$는 질문 벡터를, $p^+$는 질문과 관련 있는 문서, $p^-$는 질문과 관련 없는 문서를 의미합니다. 수식은 cross entropy loss를 나타냅니다. 즉, 여러 가지 문서들 중 관련 있는 문서와의 유사도가 크도록, 다른 문서들은 유사도가 작아지도록 학습합니다.

Negative passage

질문과 관련 있는 문서(positive passage)는 데이터셋에 제공됩니다. 그러나 contrastive learning을 위해 필요한 negative passage는 직접 구성해야 합니다. 논문에서는 3가지 negative passage를 구성하는 방법을 실험합니다.

 

1. Random : 문서 집합 중 랜덤한 문서.

2. BM25 : BM25로 찾은 가장 유사한 문서 중 답을 포함하지 않는 문서.

3. Gold : In-batch negative를 이용한 다른 질문의 positive passage.

 

Gold의 In-batch negative는 학습에 사용되는 mini-batch에서 다른 질문의 positive passage를 negative passage로 사용하는 방법을 말합니다.(자세한건 SimCSE리뷰)

Negative 선정 방식에 따른 성능 차이.

논문의 실험 결과에 따르면 가장 성능이 좋은 방법은 Gold방식이었고, BM25 문장을 hard negative로 하나씩 추가하는 것이 성능 향상에 도움이 되었다고 합니다. 이는 BM25를 이용해 찾아낸 추가 negative 문서가 학습을 어렵게 한 것이 모델의 추론능력을 높이는데 도움이 되었다는 것을 알 수 있습니다.

좌측의 문장들은 질문들을 우측의 문장들은 문서들을 나타냅니다. In-batch negative는 같은 배치 내에서 질문과 관련 문서는 positive로, 나머지는 negative로 간주하여 학습을 합니다. DPR은 여기에 BM25를 활용해 Hard negative를 추가함으로써 성능을 더 높일 수 있었습니다.

코드 상에선 아래와 같이 구현될 수 있습니다.

questions = [ ...질문... ]
passages = [ ...문서... ]
labels = torch.arange(start=0, end=batch_size)

criterion = nn.CrossEntropyLoss()

question_encoder = BERTModel.from_pretrained("klue/bert-base")
document_encoder = BERTModel.from_pretrained("klue/bert-base")

Q = question_encoder(**questions)[0] # CLS Pooling
P = document_encoder(**passages)[0] # CLS Pooling

similarity = torch.matmul(Q, P.transpose())
loss = criterion(similarity, labels)

질문과 문서들은 BERT를 통해 각각 Q와 P로 인코딩 됩니다. DPR에서는 질문과 문서에 각각 2개의 인코더를 사용합니다.(Dual-Encoder) Q와 P의 행렬곱 연산을 통해 질문과 문서들의 유사도를 한번에 계산할 수 있습니다.(similarity) 목표는 계산된 similarity가 질문과 관련된 문서의 유사도는 1로, 나머지는 0으로 계산되는 것입니다. 이를 위해선 similarity가 대각 행렬의 성분이 1이고 나머진 0인 행렬이 되야 합니다. 이는 CrossEntropy를 통해 계산할 수 있습니다.

계산된 similarity(S) 행렬의 값이 대각 성분(빨간색)이 1인 행렬이 되도록 학습됩니다.

DPR 성능 평가

데이터셋

모델 평가를 위해 5개의 데이터셋을 이용해 실험을 진행합니다.

 

1. Natural Questions(NQ) : 구글 검색 쿼리로부터 질문을 추출한 뒤, 답을 포함한 위키 문서가 함께 주어지는 QA 데이터셋입니다.

2. TriviaQA : trivia의 질문과 그에 대한 답변을 웹으로부터 크롤링한 데이터셋입니다.

3. WebQuestions(WQ) : Google Suggest API를 사용해 질문을 선정하고, 그에 대한 답을 Freebase로부터 추출한 데이터셋입니다.

4. CuratedTREC(TREC) : 정제되지 않은 문서를 이용한 ODQA 데이터셋으로 다양한 웹사이트로부터 질문과 답변을 크롤링한 데이터셋입니다.

5. SQuAD v1.1 : 사람들이 직접 위키 문서를 보고 질문과 답을 작성해 만든 데이터셋입니다. 그렇다 보니 질문에 답에 대한 힌트가 많이 드러납니다. 그렇기 때문에 이 즈음부터의 논문들은 이 데이터셋을 사용해 모델을 평가하는 것을 좋아하지 않습니다만, DPR은 과거의 연구들과 성능 비교를 위해 실험 결과를 함께 첨부했습니다.

 

TREC과 WQ, TriviaQA는 관련 문서 없이 질문과 답변 쌍만 주어지기 때문에, DrQA로 직접 수집한 Wikipedia 문서들에서 BM25를 통해 답을 포함한 문서를 찾아서 관련 문서로 사용했습니다. (만약 찾은 문서에 답이 존재하지 않는다면 그 데이터는 버립니다.)

학습

  • 배치 크기 : 128(+1 BM25 hard negative)
  • 에포크
  •     NQ, TriviaQA, SQuAD : 40 에포크
  •     TREC, WQ : 100 에포크
  • learning rate : $10^{-5}$
  • learning rate scheduler : Linear scheduling with warm-up
  • optimizer : Adam
  • dropout rate : 0.1

학습 결과

데이터셋별 실험 결과

결과는 위와 같습니다. Single은 각 데이터셋만으로 학습한 모델의 결과고, Multi는 SQuAD를 제외한 모든 데이터셋으로 학습을 한 모델의 결과입니다. 이는 하나의 모델만으로 여러가지 데이터셋에 얼마나 잘 적용될 수 있는지를 실험하기 위해서입니다. Multi방식으로 가장 큰 이득을 본 데이터셋은 TREC 데이터셋입니다. TREC 데이터셋은 수가 가장 적기 때문에 다른 데이터셋들을 함께 학습한 것의 도움을 크게 본 것 같습니다.

 

BM25+DPR은 BM25의 결과와 DPR의 결과를 함께 사용하는 방식입니다. BM25가 찾은 유사도 점수와 DPR이 찾은 유사도 점수의 linear combination을 통해서 최종 점수를 결정합니다. $BM25(q,p)+\lambda\cdot sim(q,p)$와 같이 계산하고, $\lambda=1.1$로 설정했습니다. BM25가 좋은 성능을 보인 경우엔 DPR과 BM25를 함께 사용하는 것이 점수 향상에 도움이 되지만, 그렇지 않은 경우엔 오히려 순수 DPR보다 성능이 떨어지는 효과를 보였습니다.

 

결과는 SQuAD를 제외한 모든 데이터셋에서 DPR이 BM25보다 성능이 더 좋았습니다. SQuAD만 BM25와 DPR의 성능이 엎치락뒤치락한데, 이는 SQuAD 데이터셋의 특징과 관련 있습니다. 질문과 문서에 겹치는 단어가 많기 때문에 단어 기반 방식의 BM25가 더 유리하다고 분석할 수 있습니다. 그리고 SQuAD는 500여개의 위키 문서로부터 만들어졌기 때문에, 그 질문과 답변의 내용들이 심하게편향되어 있다는 문제도 있습니다.

 

또, Top-20에서 BM25와 DPR의 성능차이가 특히 크다는 특징이 있습니다.

 

점수와 별개로 DPR과 BM25가 찾은 관련 문서의 특징도 다른 점이 있습니다. BM25는 서로 공통적으로 쓰인 단어가 많은 문서들 위주로 가져왔지만, DPR은 단어보다 문맥에 더 집중해서 관련 문서를 찾아온 것을 확인할 수 있었다고 합니다.

End-to-end 성능 평가

지금까지는 top-k accuracy로 모델의 성능을 살펴봤고, 이번엔 DPR을 적용한 QA 결과를 비교하고자 합니다.

DPR을 Retrieval로 활용한 end-to-end QA 시스템. DPR을 이용해 top-100개의 문서를 추출한 뒤, extraction 방식의 reader 모델을 사용해 최종 결과를 출력합니다.

Reader 모델은 extraction 방식을 활용했습니다. BERT 모델의 입력은 "[CLS]질문[SEP]관련문서-K"가 됩니다. 이를 인코딩한 결과들(Encoded Passage)은 3개의 linear layer를 통해 각각 정답의 시작 위치(start_idx), 끝 위치(end_idx), 확신도(selected)를 출력합니다. 결과적으로 가장 높은 확신도를 갖는 답을 최종 답으로 출력합니다.

실험 결과

End-to-end QA 실험 결과

결과는 위와 같습니다. 평가지표는 EM입니다. 데이터셋의 양이 많은 NQ와 TriviaQA에서는 기존 모델보다 더 좋은 성능을 보였으며, 데이터 수가 적은 WQ와 TREC에서는 Multi 세팅을 사용했을 때만 더 성능이 좋았습니다. REALM의 pre-training에서 대량의 데이터로 비지도 학습을 한 것이 데이터 수가 적은 WQ와 TREC에서 이점을 보인 것 같습니다.

결론

DPR은 dense representation 방식의 retrieval 모델을 통해 BM25의 성능을 뛰어넘었습니다. 이를 통해 DPR은 겹치는 단어가 없더라도 정답 문서를 찾을 수 있는 dense representation 방식의 장점을 취하면서도, 단어 기반의 BM25보다 좋은 성능을 보이는 장점만 취한 모델이 되었습니다.

또, ORQA나 REALM과 같이 추가 pre-training 없이 간단한 학습만으로도 그보다 좋은 성능을 보일 수 있다는 것 또한 증명해냈습니다. 이는 In-batch negative를 활용한 효율적인 학습이 큰 영향을 미친 것으로 볼 수 있습니다.

그리고 BM25를 활용해 hard-negative 쌍을 하나씩 추가한 것이 더 좋은 점수를 받을 수 있었는데, 이는 negative 쌍을 구축하는 방식도 중요하다고 볼 수 있습니다.