해당 글은
Dense Text Retrieval based on Pretrained Language Models: A Survey 논문에 대한 정리 글이며 중간중간 필요한 부분은 추가적으로 작성중이다.
요약
해당 introduction에서는 검색 초기 ~ BERT (PLM) 를 활용한 단계까지의 간단한 소개에 대한 내용이다.
Text retrieval의 목적은 Query와 relevant한 Document를 찾아주는 것
이 때의 관련성 평가는 lexical similarity로 평가
그리고 이를 효율적으로 구현하기 위해 inverted index 활용
머신러닝이 발전하면서 이를 이용해 관련성 평가를 하는 것이 등장
사람이 feature를 지정하고, 관련성 평가를 labeling하여 지도학습을 통해 쿼리와 문서의 관련성을 평가하는 방식
해당 방식의 한계는 feature engineering을 수동으로 해야한다는 것
이제 수동으로 feature를 만들지 않고 dense representation을 만드는 신경망 활용 (Neural IR)
해당 논문에서는 dense representation을 만드는 신경망 활용 이전까지를 pre-BERT라고 말한다.
PLM이 기존 방식들보다 압도적으로 좋은 성과를 냄
그러한 이유는
1. 대량의 데이터로 학습하여 얻어낸 text representation 능력
2. large-scale labeled retrieval datasets
(학습에 필요한 데이터들을 쉽게 구할 수 있으므로 접근이 쉽고 그래서 더 발전했다고 생각하는 듯 하다.)
해당 논문에서는 dense retireval을 네 가지 측면에서 다룬다.
해당 장에서는 앞으로 다룰 task들에 대한 소개와 notation을 알려준다.
- 일반적인 2 stage 구조에서 해당 논문은 첫 번째 retirever에 초점을 둔다.
- fine-graded relevance label이 아닌 binary relevance label에 초점을 둔다.
해당 장에서는
해당 카테고리에서는 term weight를 계산하는데 있어서 문맥적 의미를 더하는 것을 목표로 한다.
예시로는 아래 모델들이 나온다.
DeepCT
HDCT
COIL
이 중에서 DeepCT는 단어의 문맥적 중요도를 PLM을 이용해서 반영하는 모델이다.
DeepCT
PLM을 이용해서 vocabulary mismatching 문제를 해결하는 방식으로 query나 doc의 expansion을 실행한다.
vocabulary mismatch 문제는 query : 'car' 이고 Document 'automobile'인 경우 일반적인 Term matching 방식에서는 이를 매칭할 수 없다는 것이다.
이를 해결한 예시로는 아래 모델들이 나온다.
docTTTTTquery
SPLADE
이 중에서 docTTTTTquery는 PLM을 이용해서 해당 doc와 관련된 검색어들을 예측하고 doc에 붙여서 doc expansion을 하는 것이다. 예를 들어 automobile에 관한 문서라면 car를 예측해서 doc에 보강하고, 이를 통해 검색이 되게 한다.
query-text pair를 하나의 문장으로 보는 방식
sentence : [cls] query [sep] text
two-tower architecture 채택하여 query embedding과 text embedding을 따로 구하는 방식
query embedding과 text embedding의 similarity function을 통해 계산
BERT, RoBERTa 등을 사용하여 학습
이 논문 당시 최근에는 T5를 text representation 학습에 활용하기도 함.
이 블로그 포스팅 당시는 llm을 embedidng 모델로 쓰기도 함
sigle representation의 경우 문제는 query와 text 사이의 fine-grained semantic interation을 충분히 모델링하지 못한다는 점.
이러한 문제를 해결하기 위해 Poly-encoder, ME-BERT 같은 경우 여러 개의 representation을 활용
더 나아가 극단적으로 multi-representation semantic matching을 활용하는 방식이 ColBERT
해당 모델은 fine-grained를 위해 token-level representation 을 활용함
Multi-representation의 공통적인 아이디어는 여러 측면에서 semantic view를 보게 한다는 점이다.
보통 이러한 representation은 indexing 과정에서 저장되며 실제 infernece 시에는 pre-computed 되어 시간을 줄일 수 있다.
다만 이러한 방식의 문제점은 여러 representation을 가지면서 저장해야 하는 비용이 늘어난다는 것이다.
이러한 문제를 해결하기 위해 ColBERTer에서는 embedding dimension reduction등의 전략을 제안하기도 한다.
일반적으로 retrieval은 document 단위 paragraph 단위로 검색하는데 초점을 둔다. 하지만 일부 특수한 task의 경우 phrase-level 단위를 고려하는 것이 자연스러운 task가 있다.
이를 고려한 모델로는 DenSPI, DensePhrases 등이 있다.
주의 깊게 볼만한 점은 dense phrase 검색이 DPR 보다 높은 passage retireval accuracy를 달성할 수 있다는 점!
phrase-level 정보가 fine-grained semantic 특성을 포착하면서 relevance matching에도 유용하다는 점
Cross-encoder가 fine-grained semantic interaction을 더 잘 학습할 수 있으므로, 성능이 더 뛰어나다.
fine-grained interaction을 강화하기 위해 multi-representation bi-encoder 방식이 나와서 single- 방식보다 성능은 향상되었지만 여전히 cross-encoder보다는 성능이 떨어진다.
하지만, Bi-encoder는 더 유연하고 효율적이다.
유연한 이유는 phrase 단위 검색과 같은 구조를 할 수 있다는 점에서, 효율적이라는 점은 ANN을 활용해 벡터 검색을 가속화할 수 있다는 점이다.
이러한 특징이 있어서 보통 2 stage로 설계하고 처음은 Bi-encoder를 활용해 recall을 잡고, 이후엔 cross-encoder를 활용해 조금 더 정밀하게 판별한다.
그리고 추가적으로 cross-encoder는 bi-encoder의 distillation으로 사용되곤 한다.
binary relevance를 가정 (좋아요 또는 클릭)
Dense retriever를 최적화하기 위한 핵심 아이디어는 query에 대해 관련된 텍스트의 확률을 최대화 하는 것
f : 유사도 측정 함수
각각 query encoder, text encoder
d' : negative sample
해당 loss의 기본 컨셉은 positive는 가깝게, negative는 멀게
해당 loss는 query에 대해 하나의 positive text와 하나의 negative text 사이의 차이를 최적화한다.
일반적으로 Negative log-likelihood loss가 성능이 더 좋다고 한다.
유사도 함수 f에 대해 여러 방식을 사용할 수 있다.
MS MARCO dataset에 대해 동일한 BERT로 실험 결과 아래와 같은 경향이 있다고 한다.
cosine similarity는 더 짧은 문서를 선호하는 경향
inner product는 더 긴 문서를 선호하는 경향
현재 문헌 기준 제일 널리 쓰이는 건 inner product 라고 한다.
위에서 제시한 일반적인 loss 이외에도 여러 constraints를 포함시킨 여러 varient가 존재한다.
기존으로 제시한 loss 함수는 query-oriented 한 방식이다.
이런 표현을 쓰는 이유는 하나의 쿼리에 대해 positive text와 negative text를 쓰기 때문이다.
text-oriented loss에서는 하나의 positive text에 대해 negative query를 사용한다.
기존 query-oriented optimization과 결합했을 때 성능이 향상된 연구들이 있다.
여태까지는 query와 text의 유사도를 활용해서 loss를 구성했다.
이런 접근 방식으로 인해 positive texts와 의미적으로 유사한 negative texts를 구별하는 것이 어렵다고 주장한다.
의미적으로 유사하면 embedding을 했을 때 서로 가깝게 위치하게 된다. 이 loss의 주장은 positive 주변에 negative가 섞여서 혼동되지 않게 학습하는 것으로 보인다.
이러한 주장에 따라 text constraints를 제안했다.
이러한 가정 하에
loss의 nomalization term에 text-text similarity를 포함한다
크게 세 가지 이슈가 있고, 5-2, 5-3, 5-4 에서 각각의 이슈에 관한 해결책들을 다룬다.
전체 데이터셋은 너무 방대하기 때문에 positive에 대한 일부 negative를 활용해야 한다.
아래는 negative dataset을 고르는 대표적인 방법이다.
한 배치 내 b개의 (query, positive document) 쌍에 대해 각 쿼리 당 자신의 positive 하나와 b-1개의 negative를 사용하는 방식이다.
이러한 방식은 메모리 효율을 올려줘서 많은 negative를 쓸 수 있게 해준다.
이 방식을 쓰지 않는 경우를 생각해보면 각 쿼리 당 서로 다른 negative를 가지게 된다. 즉, 한 배치 내에 b^2개의 문서를 가지게 되는 것이다.
이렇게 많아진 문서로 인해 activation memory가 증가해서 GPU 메모리 문제가 생긴다.
따라서 이 방식은 메모리 효율적으로 많은 negative를 쓸 수 있게 해줬다고 볼 수 있다.
In-batch negative 방식이 한 batch 안에서의 동작이었다면, cross-batch negative는 더 많은 negative를 쓰기 위해 multi-GPU 설정에서 동작한다.
기본 아이디어는 서로 다른 GPU들 사이에서의 문서를 재사용 하는 것이다.
GPU가 a개 있다고 가정하면, 하나의 쿼리 당 a * b - 1개의 negative를 얻게 하는 방식이다.
이 아이디어는 gradient caching을 이용하면 single-GPU 설정으로 확장될 수 있다고 한다.
여태까지 negative 수를 어떻게 늘리냐를 봤다면, 이제는 negative의 품질을 올리는 방법이다.
hard negative는 높은 의미적 유사성을 가지지만 실제로는 관련 없는 텍스트를 의미한다.
관련 텍스트와 비관련 텍스트를 구분하는 능력을 높이기 위해서는 이러한 hard negative가 의미가 있다.
고정된 negative selector가 선택하는 negatives 사용
BM25가 반환한 lexically similar한 텍스트들 중에서 negative로 샘플링
coarse/fine semantic similarity 기반 retrieved negatives, 휴리스틱 기반 context negatives 등이 있다.
더 나아가서 서로 다른 종류의 negatives를 결합하기 위한 fusion 전략도 있다.
또 다른 전략으로는 학습 전에 query 들을 clustering 한 뒤, batch를 구성할 때 cluster에서 묶인 query들로 구성.
이러면 비슷한 문서들이 negative가 되어 hard negative로 유도
dense retriever 학습 과정에서 업데이트되는 negatives 사용
ANCE에서 최적화 중인 retriever가 반환하는 top retrieved texts를 negative(=global hard negatives)로 샘플링
근데 이런 방식에서는 매번 inference를 진행해야 하므로 시간이 많이 소요된다.
이를 위해 asynchronous index refresh 전략을 사용한다.
즉, m 개의 batch마다 index를 업데이트 하는 것.
주의할 점은 dynamic hard negatives로 학습하기 전에 모델이 warmed up 되어야 한다는 점이다.
dynamic negatives는 학습과 테스트 사이의 candidate space 불일치를 해결할 잠재력이 있다. 왜냐하면 실제 negative의 범위가 전체 candidate이기 때문에.
실제로 hard negative에서는 false negative 문제가 발생한다. 즉, 실제로는 정답(positive)으로 볼 수 있지만 잘못 레이블링 된 것이다.
이 문제를 해결하기 위해 RocketQA에서는 cross-encoder를 사용하여 false negative일 가능성이 있는 top ranked texts를 필터링한다.
In-batch sampling은 충분히 정보성 있는 negative를 생성하지 못한다.
해당 Data Augmentation에서는 기존 labeled data를 기반으로 추가적인 training signal을 만드는 것을 의미한다.
데이터 수량을 늘리는 접근과 수량은 그대로 두고 training signal(5-2)를 만드는 접근도 있다.
기본적인 아이디어는 text로부터 query를 생성하는 것.
즉, 문서로부터 사람들이 검색할만한 query를 생성하는 것
ex) doc2query
이 방식의 장점은 추가적인 human annotation 없이 대량의 training 데이터 생성 가능
cross-encoder를 활용해서 relevance score를 생성하고 이를 통해 bi-encoder dense retriever 학습하는 것
retriever를 이용해서 상위 검색 결과를 생성한 후, pseudo positive 또는 pseudo negative로 사용
기존 PLM pretraining task들은 retreival task에 특화되어 설계 x
조금 더 retrieval-oriented pretraining을 수행하는 것이 목표
ICT (Inverse Cloze Task) 가 대표적인 예시다.
ICT에서는 문서에서 하나의 sentence를 제거해서 이를 query로 사용한다. 이후 query는 원래 속해있던 document를 retreival 하도록 학습한다.
ICT는 DPR에서 사용되었고, retrieval의 성능을 향상시켰다고 한다.
일반적인 pretraining -> ICT (ssl) -> 검색 fine-tuning (supervised)
이 방식은 PLM이 retrieval에 더 적합한 representation을 학습하도록 설계된 pretraining task를 사용하는 것이다.
예를 들어, SimCSE가 있는데 이는 대조 학습 기반 sentence representation을 학습한다.
서로 다른 dropout을 적용해 동일한 sentence에 대해 두 개의 representation을 생성하고 이를 positive pair로 사용하여 대조 학습을 한다.
retrieval과 question answering task 같이 관련된 여러 task를 동시에 학습하는 구조
서로 다른 shared representation을 활용하여 dense retrieval 성능 향상시키는 것
ANN은 효율적인 dense retrieval 시스템을 설계하기 위한 핵심 기술이다.
다음과 같은 순서로 아래 챕터가 진행된다.
nearest neighbor search의 목표
candidate 집합 P에 대해 유사도를 최대화하는 p를 찾는 것
여기서 f는 inner product 혹은 cosine similarity로 구현될 수 있다.
물론 가장 단순한 방법은 모든 candidate에 대해 탐색하는 것이다.
이를 줄이기 위해 근사적으로 찾는 방법인 ANN이 개발되었다.
ANN 알고리즘 설계는 두 가지 trade-off가 존재한다.
검색 효율 vs 검색 정확도
(ANN 알고리즘을 평가하기 위한 ANN Benchmark도 존재한다.)
ANN의 검색 효율을 향상시키는 두 가지 주요 방법은 아래와 같다.
index 구조를 설계하는 대표적인 방법은 아래 세 가지가 있다.
그런데 같은 bucket이라면 왜 유사한 것들이 있다고 가정할 수 있는지?
-> hyperplane에 대해 어느 쪽에 있는지를 기반으로 해싱을 만든다. 따라서 비슷한 곳에 있는 벡터면 같은 hyperplane에 속할 가능성이 많으므로 유사하다.
cluster 기반 접근이 graph 기반 접근 (hnsw) 보다 메모리 효율적이다.
그래프 기반은 모든 노드에 대해 연결을 다 저장해야 하기 때문에 추가적인 메모리가 소요된다.
PQ는 text embedding을 압축하여 similarity 계산에서 시간, 메모리 모두 줄이는 방법이다.