Bi-encoder, Cross-encoder, Poly-encoder (이론)
by Cori⊙ 해당 포스팅은 다른 분들이 작성한 내용을 최소한으로 요약 정리한 포스팅입니다.
⊙ 보다 자세한 내용 (수식 등)을 알고 싶으신 분들은 맨 아래 페이지의 참고 자료에 있는 사이트들을 참고해주세요.
0. Bi-encoder & Cross-encoder
- pairwise comparison task 문제를 해결하기 위한 인코더
- 다음에 올 문장을 예측하는 등의 작업에 사용됨
- 두 인코더 모두 Cross-Entropy Loss를 최소화도록 학습함
1) Bi-encoder
Context Encoder와 Candidate Encoder가 각각 context 문장과 해당 context 문장 다음에 올 후보 문장을 인코딩함
인코딩 결과로 Context Embedding(ctxt Emb), Candidate Embedding(Cand Emb)을 얻을 수 있음
두 벡터(Ctxt Emb, Cand Emb)의 내적 연산(dot-product)을 통해 다음에 올 후보 문장으로 적절한가에 대한 점수를 계산함
두 문장을 독립적으로 인코딩하는 구조 -> 미리 후보 문장들을 인코딩해서 문장별 Candidate Embedding 값을 계산해 둘 수 있음
2) Bi-encoder 장·단점
장점
- 추론 시 후보 문장이 아무리 많아도 (수백, 수천 만개) 후보 문장들을 미리 인코딩해 둘 수 있어 실제 추론 속도가 상당히 빠름
단점
- Context 문장과 Candidate 문장의 관계를 전혀 고려하지 않기 때문에, 정확도가 상당히 떨어짐
3) Cross-encoder
일반적인 BERT 방법론과 유사하며, Context 문장과 Candidate 문장을 이어 붙여서 인코딩함
인코딩 과정에서 context 문장과 candidate 문장의 self-attention 연산을 적용할 수 있으며, 인코더의 모든 계층에서 해당 연산 진행 인코더의 출력 값을 하나의 Cand Emb으로 취합하고, 이후 regression 연산을 적용하여 다음 문장으로 적절한 지에 대해 점수를 계산
4) Cross-encoder 장·단점
장점
- Bi-encoder와 달리 인코딩 과정에서 self-attention 연산을 수행할 수 있음
- Context 문장과 Candidate 문장 간의 관계를 훨씬 잘 파악함
단점
- Context와 Candidate 쌍이 주어져야 계산을 수행함
- 메모리 상에 아무리 많은 Candidate 문장이 존재해도 Context 문장이 주어지지 않으면 무용지물
* Query를 통해 Context 문장이 들어오면 그때부터 Context와 각 Candidate를 쌍으로 인코딩하여 다음에 올 문장으로 적절한 지 계산 (하나의 Query 처리를 위해 수백, 수천만 번의 inference를 진행.. 엄청나게 느린 속도로 인해 실무에서는 거의 사용되지 않음)
1. Poly-encoder
- Bi-encoder 단점과, Cross-encoder의 단점을 보완하기 위해 등장한 인코더 (실무에서는 주로 poly-encoder 사용)
- Bi-encoder의 구조와 전체적으로 비슷하지만, Context Encoder 부분에서 약간의 차이가 있음
Poly-encoder는 Context Encoder의 출력 값과 Code vector와의 어텐션 연산을 수행하고, 이를 통해 여러 개의 벡터를 생성함 (Code vector는 일종의 latent 변수에 해당하며, 생성 시 랜덤하게 초기화 된 후 학습을 진행함에 따라 값이 업데이트 됨) 여기서 적용한 Attention 연산은 Self-attention으로, 모델 Output[0] 값을 Key, Value로 보고, Code를 Query로 보면 됨
이를 통해 얻어진 벡터들(Emb1 ~ Embm)에 대해 최종적으로 Cand emb와의 어텐션을 수행하고, Ctxt Emb 값을 구함. 이후 Ctxt Emb와 Cand Emb의 내적을 통해 최종 Score를 계산
장점
- Bi-encoder와는 달리 attention 연산을 통해 Context 문장과 Candidate 문장 간의 관계를 보다 깊게 파악할 수 있음
- Context 문장과 Candidate 문장이 독립적으로 인코더를 거침
- Candidate Embedding을 미리 계산할 수 있어 추론 속도가 빠름
♣ 참고 자료
https://roomylee.github.io/poly-encoder/
https://velog.io/@aqaqsubin/Poly-Encoder
'AI > Natural Language Processing' 카테고리의 다른 글
RAG (Retrieval-Augmented Generation) (0) | 2024.06.05 |
---|---|
[LLM] Aya23 (0) | 2024.05.28 |
LangChain을 이용해 MySQL과 소통해보자 ! (0) | 2024.05.23 |
Detectron2 사용하기 (feat. Docker) (0) | 2024.04.11 |
Bi-encoder, Cross-encoder, Poly-encoder (구현 실습) (0) | 2022.10.12 |
블로그의 정보
코딩하는 오리
Cori