idf : 얼마나 이 단어가 흔치 않게 등장하는가?
* tf-idf : 그냥 tf 곱하기 idf
Doc2Query : document expansion
COIL : query 와 문서 공통 단어 유사도 이용
BM25
Dense passage retrieval (DPR)
query 와 candidate 을 독립적으로 encoding 해서 score 구해서 K개 근처 candidate 찾기 (same with bi-encoder)
- MIPS 를 사용하기 좋음
- gold candidate 을 놓칠 수 있음 (거리로 유사도만 찾아서)
BERT encoder 로 문장 임베딩 얻는게 기본
BERT 말고 다른 sentence encoder를 쓸 순 없을까?
- Sentence-transformers 허깅페이스에 많음(ex. T5-encoder)
Decoder-based language model 을 쓸 순 없을까? Generation 성능이 너무 좋으니까..
- Llm2Vec (2024) : decoder llm 의 hidden state 를 가져와서 임베딩으로 써야지
- Enabling bidirectional attention
- Causal attention 을 bidirectional 로 바꾸기
- Masked Next Token Prediction
- MLM 처럼 masking 을 하고 단어를 예측
- 하지만 차이점은, 다음 단어를 예측하고자 하기 때문에 (decoder 의 맛을 살리기 위해서) 전 output에 classifier 를 달아서 다음 단어를 예측함!
- Unsupervised Contrastive Learning
- masking 을 한 같은 문장들이 서로 비슷하게끔, 원래 다른 문장이었다면 다르게끔 embedding 을 학습
- Details
- Pooling : 단어가 아닌 "문장"의 임베딩을 얻기 위한 방법
- EOS 의 hidden state, 모든 단어 hidden state 의 평균, 특정 단어에 가중치(attention에서 가져오거나 tf-idf) 를 둔 가중 평균 등을 사용함
- 성능은 encoder 보다 좋은데, 좀 느린 것 같음
MIPS (Maximum Inner Product Search)
- 이걸 통해서 좀 더 document search 를 빠르게 할 수 있음
- FAISS(facebook) : layer 를 타고 들어가면서 가까운 애들을 빠르게 찾음
- ScaNN(google)
Reranking
- 나오게 된 배경 : DPR 가 정확하지 않을 때도 있음, 그래서 더 정확하게 multi-stage 로 reranking 하려 함
- 종류
- Cross-encoder : query 와 document 묶어서 encoding 후 score 구함
- 좀 더 candidate 세밀히 볼 수 있음
- 하지만 높은 비용 듬
- ex)
- monoT5 : 그냥 query & document 묶는 cross-encoder
- DuoT5 : document 두개와 query 묶는 cross-encoder
- Cross-encoder 는 너무 느리다..
- ColBERT
- DPR 처럼 query 랑 document 따로 해서 MaxSim을 구하는 방식 (bi-encoder 느낌)
- MaxSim
- Query의 모든 토큰들에 대해서, 모든 document 의 토큰의 embedding 과 dot product 해서 가장 높은 값을 가져오고, 이를 다 더해서 score 로 구함
- cross-encoder 는 전부다 online 으로 매번 document 와 묶어 임베딩을 구해야 하지만, ColBERT 는 document encoder 부분은 offline 으로 미리 빠르게 구함
- 성능은 비슷하지만 빠름
- 대신 document 가 메모리를 많이 차지함
- CMC (Comparing Multiple Candidates) - 종현님 논문
- ColBERT 는 모든 document token 다가지고 있어 메모리를 많이 차지하지만 , cls 부분 token embedding 만 가지고 구할순 없을까?
- Document indexing 속도를 최대한 빠르게
- document 를 여러 개를 가져오지만(listwise reranking), 한 document 와 query embedding 은 cls 단 부분만 가져옴
- query embedding CLS token 과 document embedding CLS token 들을 합쳐서 cross-encoder 처럼 self-attention 한 번 더 진행
- 그냥 DPR 처럼 하지 않고 self-attention 한번 더 해서 성능 높임
- Listwise reranking
- 그냥 LLM 쓰기 : sliding window 로 봄
- ListT5 - 소영님 논문
- query 와 document 묶어서 encoding (cross-encoder) 하고, 각각 여러개 encoding 을 decoder 에 넣는 Fusion in decoder(FiD) 이용
- decoder 는 sorted index of passage 을 뱉고, 이거를 학습함
- LLM 기반 listwise 보다 빠르고, positional bias 에 강하며 zero-shot retrieval 에 성능이 좋음
- context length 는 tournament sort 를 활용해서 해결
- 학습을 잘하자는 방법이기 때문에, constraints 를 어길 수 있다는 단점 존재
- Hallucination 가능
- Ordering bias 문제
Benchmarks
- MS-MARCO 로 training (BEIR 에 포함돼있음)
- BEIR 의 다른 dataset 으로 zero-shot evaluation
- MTEB 라는거도 씀
Evaluation metrics
- precision & recall
- @K 는 topK
- Mean Average Precision : document 마다 precision 평균 내기
- User feedbacks
- DCG
- usefulness
- document 마다 relevance 를 정의
- nDCG
- normalized DCG
- MRR (Mean Reciprocal Rank)