https://prefer-all.tistory.com/326
위 게시글에서 Passage Retrieval에 관한 내용을 정리했기에, 해당 포스팅은 DPR의 구체적인 방법론 위주로 서술한 포스팅이다.
💬 표시는 스터디 시간에 다룬 멘토님의 코멘트, 질의응답 내용을 달아둔 것이다.
Introduction
Related Work
- sparse representation
- dense representation
- ORQA (Open Retrieval Question Answering)
- REALM (Retrieval Augmented Language Model Pre-Training)
제안 방법론
Retriever의 학습 목표는 주어진 대량의 corpus에 존재하는 passage들을 벡터 공간에 효율적으로 매핑하는 것이다.(유사한 애들끼리 가까이, 아닌 애들끼린 멀리)
이를 위해 dual-encoder와 In-batch negative 방식을 활용한 효과적인 Retriever 학습 방법을 제안한다.


Dual-encoder
Passage encoder는 passage들로부터 벡터를 추출하고, Question Encoder는 질문들로부터 벡터를 추출한다.
추출된 벡터들은 서로 대응되는 질문과 passage는 긍정 쌍으로, 나머지는 부정 쌍으로 간주하여 한번에 학습된다.

💬 왜 두 개의 BERT encoder을 사용하는가?
passage는 다소 긴 문장으로 구성된 반면, Question은 짧을 가능성이 높다. 즉, 문서 간 다른 특성이 있고, 이럴 경우 독립적인 Encoder을 사용하는 게 정석적인 방법이다.
CLS 벡터는 문서를 대표하는 vector을 뽑게 되는데, 문서의 길이가 CLS에 영향을 줄 수 있기에, 독립적인 Encoder을 사용하는 게 naive한 접근법이다. 물론, 같이 사용하는 논문도 있으나 데이터가 매우 다르다면 성능에 대한 loss가 존재할 수 있다.
Positive passages and Negative passages
질문과 관련 있는 positive passage는 다음과 같은 방식으로 찾을 수 있다.
- QA 데이터셋에 이미 passage를 포함하고 있는 경우 : 이번 실험에 새로 구축한 wikipedia 데이터셋에 대응하는 주제의 passage로 대체한다.
- QA 데이터셋이 passage가 주어지지 않은 경우 : BM25를 이용해 top-100의 passage를 추린 뒤 답이 존재하는 passage를 긍정 쌍으로 사용한다.
만약 위의 방법으로도 찾을 수 없는 경우에는 데이터셋에서 제거한다.
Negative passage는 3가지 방법으로 찾을 수 있다.
- Random : Corpus 내의 랜덤한 passage
- BM25 : 답을 포함하지 않았지만 질문 토큰과 가장 단어가 많이 겹치는 passage들
- Gold : Training set의 다른 질문과 이미 대응된 passage들
이 중 가장 성능이 좋은 방식은 Gold + BM25 방식이었다.
💬 Random과 Gold의 방식이 겹칠 수 있는 것 아닌가?
Random은 Positive passage가 아닌 passage 중에 랜덤으로 negative passage을 선정한다. Gold는 Training set에서 다른 쿼리(정답)과 매칭된 passage를 negative passage라고 선정한다. 따라서 Random과 Gold의 방식은 충분히 겹칠 수 있다.
하지만 둘의 가장 큰 차이점은 in-batch negative에서 나타난다. (in-batch negative로 인해 Gold가 성능, 효율면에서 향상이 있다). Gold 방식은 사실상 in-batch를 위해 제시된 방법이다.
Gold는 배치사이즈(B) 크기의 매칭된 질문-답변 쌍을 가지고 다른 질문-답변 쌍들을 이용해 negative 쌍을 효율적으로 얻어낸다. 만약에 random 방식으로 negative 쌍을 구성하고자 한다면, 하나의 질문-답변 쌍마다 random으로 negative한 질문-답변 쌍들이 추가로 필요하다. In-batch negative와 같은 효율을 내려면 하나의 질문-답변 쌍에 B개의 random negative sample들을 만들어야겠죠. 즉, 하나의 미니배치에 B개의 질문과 B*B개의 답변이 필요하게 된다. 따라서, in-batch negative 방식에 비해 연산적으로나 저장용량 측면에서나 비효율적이다. (In-batch negative는 B개의 질문과 B개의 답변만으로 B*B번 학습의 효과를 낸다)
따라서, In-batch negative training의 결과 표를 보면 In-batch negative를 사용하면 Gold의 성능이 3~4점 상승하고, 이는 Gold는 in-batch negative를 위한 방법이다라는 근거가 된다.
In-batch negative ⭐

위 그림은 배치 크기가 B인 mini-batch 내의 질문들의 집합 Q와 각 질문에 대응되는 passage들의 집합 P가 주어진다고 할 때,
질문과 passage의 similariy S가 dot-product를 통해 계산되는 과정을 보여준다.
SBERT와 같이 더 표현력이 좋은 딥러닝 모델을 사용해 similarity를 측정할 수도 있지만 open-domain QA에서 모든 similarity는 미리 계산될 수 있어야 하기 때문에 사용하지 않았다.
또한 Dot-product 외에도 L2, Cosine similarity 등을 사용할 수 있지만 실험 결과 Cosine similarity는 성능이 오히려 떨어졌고, L2와 dot-product 연산의 성능은 유사했지만 dot-product 연산이 훨씬 간단하기 때문에 dot-product를 선택했다. Dot-product를 통해 계산된 similarity score S는 question과 passage가 대응되는 하나의 긍정 쌍과(대각선 성분) B-1개의 부정 쌍으로 이뤄진 B개의 벡터로 나타나게 된다. 거기에 BM25를 사용해 질문과 가장 단어가 많이 겹치지만 답을 포함하지 않는 Hard negative를 각 질문마다 하나씩 추가하여 성능을 더 높였다. ⭐
💬 Similarity function(유사도 함수)은 Decomposable해야 한다.
Decomposable이란?
모델의 연산 과정과 분리 가능해야 한다. 분리 가능해야 하는 이유는 open-domain QA에서 실시간으로 질문과 가장 유사한 passage를 찾기 위해선 각 passage들의 representation이 미리 계산되어 있어야 하기 때문이다. 즉, 실시간 처리를 위해서 ODQA에 필요한 전체 연산 시간을 최소화하기 위한 목적이다.
추가로 end-to-end 부분에서는 굳이 dot-product를 안 쓰고 BERT를 similarity function으로 사용한 이유는 retriever가 문서의 범위를 줄여줬기 때문에 미리 계산되어 있지 않더라도 충분히 빠르게 찾을 수 있기 때문이다.
In-batch negative 방식을 썼을 때의 장점은, 하나의 mini-batch 내에서 B개의 쌍으로부터 B개의 긍정, 부정 결과를 얻어 총 B*B 번의 연산 효율을 얻을 수 있다는 것이다.
손실 함수는 다음과 같이 negative log likelihood를 통해 계산된다.

Contribution
- Dense representation을 통해 알고리즘 기반인 TF-IDF, BM25의 성능을 뛰어 넘었음.
- Dense representation은 알고리즘 기반에 비해 표현력이 더 풍부하고(expressional), 학습이 가능하기 때문에 특정 도메인들에 특화 시키기 좋음.
- 기존 Dense representation 방식(ORQA, REALM)에 비해 학습 과정이 훨씬 간단함. (불필요한 pre-training 과정을 거치지 않아도 됨.)
실험 및 결과
Dataset
Corpus
Corpus 구축을 위해 2018년 12월 20일 버전의 English Wikipedia를 사용. DrQA(라이브러리)를 사용해 텍스트들을 전처리하여 데이터를 구축했다. 각 article들은 100 단어를 단위로 여러 개의 passage들로 나눴고, 결과적으로 21,015,324개의 passage를 얻을 수 있었다. 각 passage들은 해당 passage의 제목과 [SEP] 토큰으로 연결된 채 구성된다.
QA dataset
- Natural Questions(NQ) : End-to-end QA를 위해 만들어진 데이터셋. 구글 검색 쿼리와 답을 포함한 wikipedia 문서 쌍으로 이뤄짐.
- TriviaQA : 일반상식 QA 데이터셋.
- WebQuestions(WQ) : Google Suggest API를 이용해 구축된 데이터셋.
- CuratedTREC(TREC) : Unstructure한 오픈도메인 QA 데이터셋.
- SQuAD v1.1 : 사람들이 직접 Wikipeda 문서를 보고 질문과 답을 만드는 작업을 통해 만들어진 데이터셋. + previous work들이랑 비교하려고 사용했다고 한다.
Retriever Baseline
- 학습 방식 : in-batch negative setting
- 모델의 일반화 성능을 평가하기 위해 SQuAD를 제외한 나머지 4개 데이터셋으로 Retriever를 pre-training도 해봄.(Multi setting, 데이터셋 하나만으로 학습한 경우는 single setting이라 함)
- batch size : 128 + 하나의 BM25 negative passage per question.
- epoch
- (NQ, TriviaQA, SQuAD) = 40 epoch @큰 데이터셋
- (TREC, WQ) = 100 epoch @작은 데이터셋
- learning rate = $10^{-5}$
- Optimizer = Adam
- Linear scheduling with warm-up
- dropout = 0.1
Retriever 결과
Retrieval Accuracy ⭐

- SQuAD를 제외한 데이터셋들에서 BM25의 정확도를 넘어섬.
- SQuAD는 사람들이 passage를 보고 질문을 작성했기 때문에 질문과 passage에 겹치는 단어가 많음.
💬 데이터 셋이 가지는 특징을 이해해야 한다! 위는 Exact Match가 많이 사용되는 이유이기도 함 - SQuAD는 500여 개의 wikipedia 문서에서 추출되었으므로 우리가 모은 wikipedia 문서 데이터셋에 비해 범위가 매우 좁음. (편향적이기 쉬움) 이는 Multi dataset을 만들때 SQuAD를 포함하지 않은 이유이다.
- SQuAD는 사람들이 passage를 보고 질문을 작성했기 때문에 질문과 passage에 겹치는 단어가 많음.
- Top-20 에서 BM25와 DPR의 성능 차이가 훨씬 큼.
- General Retriever는 데이터 수가 가장 적었던 TREC에서 가장 큰 점수 차이를 보임.
- DPR과 BM25를 합친 경우에 점수가 좋아지는 경우도 있고 아닌 경우도 있음.
@single training top-20 top-100 DPR only > DPR+BM25 NQ, WQ NQ, WQ DPR only < DPR+BM25 TREC, SQuAD TREC, SQuAD
💬 BM25 점수를 구하는 원리가 중요하다
BM 25는 lexical한 요소를 많이 고려한다. 단어가 문장에서 어떻게 사용되는 지, 문장의 단어가 많이 겹치는 지를 참고해서 유사한 정도를 판단한다. 즉, BM25는 텍스트 매칭을 중요시 하기 때문에 SQuAD 데이터에서 점수가 높다.
그리고 답변이 정확히 일치하지 않아도 되는 Natural Question(NQ)에서는 semantic을 중요시하기 때문에 BM 25의 점수가 높지 않다.
참고로, ORQA 전에는 BM25를 능가하는 방법이 없었다.


(맨 위 블록) In-batch negative training의 효과를 확인하기 위해 실험한 결과는 우측 Table3와 같다. In-batch negative training을 쓰지 않은 경우엔 Random, BM25, Gold 모두 큰 효과가 없었다.
(가운데 블록) In-batch negative를 사용했을 때는 성능이 확실히 증가했다. 앞의 실험과의 차이점은 negative sample이 같은 배치에서 왔는가 아니면 전체 데이터에서 왔는가이다. 같은 배치 내에서 negative를 뽑을 경우, 메모리 효율도 좋고 학습도 더 많이 수행할 수 있게 된다.
(마지막 블록) 마지막 블록은, BM25를 이용해 찾은 hard-negative passage를 추가해줬을 때의 결과이다. 표와 같이 BM25를 이용해 하나의 hard-negative를 질문마다 추가해줬을 때 성능이 더 좋게 나온 것을 확인할 수 있다.
💬 Question 당 negative 개수를 추가했을 때 성능이 하락하는 이유는?
실험적인 naive한 결론으로 위 논문을 통해서는 원인을 알 수 없다.
💬 두 번째 블록에 왜 Random과 Gold는 없지?
mini-batch 내에 있는 다른 Question에 대한 passage들도 negative로 활용하는 In-batch negative니까


* triplet loss는 positive와 negative passage를 비교한다.
즉, DPR은 일반화 성능이 좋다.
Intel Xeon CPU E5-2698 v4 @ 2.20GHz와 512GB memory를 이용해 Inference 속도를 측정해 보았다. FAISS의 도움을 받은 결과 초당 995개의 질문 처리 속도를 보였고, 각 질문 당 100개의 passage들을 반환해 주었다. 이에 반해, BM25/Lucene(Java로 짜여진 코드)의 경우 초당 23.7개의 질문을 처리했다.
그러나, 각 passage들을 dense vector로 매핑하는 시간은 DPR이 훨씬 오래 걸렸다. 2100만 개의 문장을 indexing하는데 8개의 GPU로 총 8.8시간이 걸렸다. 그리고 만들어진 벡터들을 single server에 매핑하는데는 8.5시간이 걸렸다. 이에 반해 Lucene의 방법은 훨씬 적은 자원으로 30분만에 모두 끝났다.
End-to-End QA System
Retrieval로부터 추출된 top-k passage에 대해 reader model이 answer을 도출한다.
- Retriever : 질문을 보고 Corpus로부터 100개의 관련 passage들을 추출한다.
- Passage Selection + Reader Model :
Passage Selection moel은 Cross-attention을 이용해 질문과 가장 관련 있는 Passage를 찾는다. Cross Attention은 decomposable하여 대규모 말뭉치에서는 활용하기 어렵지만 Retrieval를 통해 Passage의 후보 양을 줄였으므로 활용할 수 있다.
Reader model은 3가지 파라미터를 찾는다.
1) start index : 해당 passage에서 정답의 위치 index
2) end index
3) selected : passage가 정답에 적합한지를 나타낸다.
- 본 논문에서는 training 시, 1개의 positive와 (m-1)개의 negative passage를 top 100 passage로부터 추출해 학습했다.(m=24로 설정)
- 목적함수는 positive passage의 올바른 answer span의 marginal log-likelihood를 최대화 하는 것이다. (모든 answer span인 이유는 한 passage의 여러 부분에서 정답이 될 수 있기 때문이다.)
- 배치 크기
- 큰 데이터셋(NQ, TriviaQA, SQuad) = 16
- 작은 데이터셋(TREC, WQ) = 4
- General Retriever를 사용할 땐(Multi 세팅), NQ로 pretrain된 reader를 target dataset에 fine-tuning 한다.
Result
- SQuAD 데이터셋을 제외한 모든 데이터셋에서 Retriever의 성능이 좋을 때 더 좋은 QA 결과를 내놓았다.
- General한 Retriever를 사용할 때(Multi), 크기가 큰 데이터셋에는 큰 차이가 없었지만, 크기가 작은 데이터셋에는 확실한 이점이 있었다.
- SQuAD를 제외한 데이터셋들에서 DPR 모델이 SOTA 성능을 달성했다.(EM(Exact Match) accuracy 기준)
- 추가 pretraining이 필요한 ORQA, REALM과 달리, DPR은 추가 pretraining 없이도 NQ와 TriviaQA에서 두 모델의 성능을 뛰어 넘었다.
- Single dataset으로는 큰 데이터셋들(WQ, TREC)에서는 ORQA, REALM보다 성능이 조금 떨어져도, 데이터셋을 추가해 Multi dataset으로 학습했을 때 성능이 더 좋아졌다.(SOTA)
- NQ 데이터셋에서 ORQA의 end-to-end 시스템을 따라 해봤을 땐, 39.8EM을 달성했다. 즉, 본 논문에서 한 방식인 Retriever와 reader를 각각 학습하는 것이 더 좋다.
- ORQA에 대비해서 DPR은 reader가 더 많은 passage를 볼 수 있다. (이로 인해 inference 시간에 차이가 생길 수 있지만 이를 정량적으로 비교하기는 어렵다고 한다.)
배운 점
💬 이 논문에서 가장 중요한 점은
1. In-batch를 사용했다는 것: 다른 Question의 Passage를 현재 Question의 negative sample로 사용
2. BM 25를 Hard negative로 사용했다는 것
- ODAQ 과제에서 Retriever 단계가 중요하다. Retriever은 Reader 모델이 검색해야 할 문서의 범위를 좁혀주는 것을 목표로 하고, 이를 위해 각 passage들을 벡터 공간에 효율적으로 매핑해야 한다.
- 추가적인 pretraining 없이 question과 passage pair만을 가지고 dense embedding model을 만들 수 있다.
- In-batch negative 방식은 연산의 효율을 높이고, 메모리를 절약하고, 학습의 샘플 수가 많아져 성능 향상을 높인다.
- Positive pair 뿐만 아니라 negative pair을 잘 구성하는 것도 중요하다.
- Sparse와 Dense 방식을 혼합하여 사용하는 것을 시도하자