-
논문 리뷰) Sentence-BERT : Sentence Embeddings using Siamese BERT-NetworksAI 논문 리뷰 2024. 5. 20. 20:21
Sentence BERT는 아래 BERT의 약점을 지적하며, 이를 개선하고자 한 모델이다.
문장 기반 임베딩 방식은 sentence-transformer(BERT)를 이후로 실용성이 크게 개선된다.
- BERT를 이용해서, 10000개의 문장 내에서 가장 유사한 문장을 찾으려면, 일일이 2개씩 비교해야하므로 C(10000, 2) 번을 수행해야한다.
- 또한, BERT의 구조는 클러스터링과 같은 Unsupervised task에는 효과가 좋지 않았다. 이를 위해서는, Bi-encoder 방식이 필요하다. (Bi-encoder와 Cross-encoder의 개념을 이해해야한다.)
출처 : https://hjkim5004.tistory.com/117
Cross-Encoder :
유사성을 판단할 2개의 문장을 '하나의 인코더 + 추가 layer' 구조에 입력하여, 유사성에 대한 출력값을 받는 구조.'하나의 인코더(BERT) + Classifier' 구조에 유사성을 판단할 2개의 문장을 입력하여, 문장 간의 유사도를 리턴 받는 방식이다.
이 방식은 문장 간의 유사도를 계산해주는 것에 초점이 맞춰져있다.
다시 말해 단일 문장이 Encoder에 들어가서 의미를 유지한 적절한 벡터로 변환하는 것이 목표가 아니라, 문장 간의 유사도를 잘 판단하도록 하는 것 자체가 목표다. 따라서 각 문장을 미리 벡터로 변환해 두고 유사도를 비교하는 것이 아니라, 비교할 두 문장 중 하나라도 변경되면 모델에 다시 입력해야 한다.
이러한 특징때문에 Cross-Encoder 방식이 문장 유사도를 출력하는 품질 자체는 높을 수 있으나, 1000개의 문장에 대해 유사도를 비교 하기 위해서 C(1000, 2) 조합의 수 만큼 계산을 수행해야하는 단점이 있다.
즉, 다수 문장간 비교에서는 많은 계산량으로 인해 실용성이 떨어진다.
Bi-Encoder :
Bi-Encoder 방식에서는 A문장, B문장이 2개의 동일한 Encoder에 각각 들어가게 된다. 따라서 문장들은 각각 임베딩이 되어 벡터로서 표현된다. 위와 같은 구조를 사용하게 되면, 1000개의 문장에 대해 1000번의 Inference만 실행하면 된다.
또한 문장들(A, B문장)을 벡터로 저장해 두었다가, 바로 유사도 비교에 활용할 수 있게 된다.
Bi-Encoder 방식의 단점은 Cross Encoder 방식보다 유사도 성능이 떨어진다 는 것이었는데, 이러한 부분을 커버하려는 노력 중에 하나가 SentenceBert에서 제시한 학습 방법론이었고, 높은 성능을 보여 현재까지도 Bi-encoder 방식을 중심으로 임베딩 기술이 발전되어 왔다. RAG에서 활용되는 임베딩 방식도 바로 Bi-Encoder이다.
**참고자료 : BERT를 통해 인코딩 값을 얻는 방식 3가지**
1. BERT의 [CLS] 토큰의 출력 벡터를 문장 벡터로 간주
2. BERT의 모든 단어의 출력 벡터에 대해서 평균 풀링을 수행한 벡터를 문장 벡터로 간주
3. BERT의 모든 단어의 출력 벡터에 대해서 맥스 풀링을 수행한 벡터를 문장 벡터로 간주출처 : https://velog.io/@xuio/Cross-Encoder%EC%99%80-Bi-Encoder-feat.-SentenceBERT
[3. Model]
BERT 또는 RoBERTa를 기반으로 finetunig하였고,
학습 데이터에 따라, 모델(네트워크)의 구조를 달리하였다.
NLI와 STS 데이터 학습의 경우는 Siamese network (가중치 Share) 형태를
Wikipedia Section Distinct 학습의 경우에는 Triplet network 형태를 갖추었다.
이때 NLI는 Classification(유사, 모순, 중립 분류)을 수행하므로 Head를 Softmax로 하고, Cross Entropy Loss 적용하였다.
STS는 Regression(유사도 점수 예측)을 수행하므로 Head를 코사인 유사도로 하고, Regression Loss를 적용하였다.
Wikipedia Section Distinct는 Contrastive Learning(Positve/Negative)을 수행하므로, Triplet loss를 적용하였다. (유클리디안을 거리 척도로 적용)Inference시에는 옆의 구조만을 활용해 임베딩을 수행하게 됨
문장을 임베딩할 때 BERT + Pooling으로 진행한다는 의미4-1 Unsupervised STS
처음에는 학습데이터로도 Fine-tuning하지 않고, STS 벤치마크에 테스트 해봄
4-2. Supervised STS
학습용 STS 데이터로 학습하고, 바로 STS 벤치마크에 평가해봄.
이때, 2가지로 나눠 실험하였는데,
1. STS only
2. NLI 이후 STS
=> 2번 방식을 하면, 3~4% 성능이 더 올랐다
그러나, 모델을 BERT나 RoBERTa로 바꿨을때는 큰 차이가 있지는 않았다.
4-3. Wikipedia Section Distinct
Triplet Objective는 Wikipedia section Distinct 작업시 적용하였다.6. Abation Study
Pooling은 mean이 좋았고, concat은 (u, v, |u-v|)가 좋았다.특히, |u-v|의 역할이 컸다.
그 이유는 해당 요소가 두 임베딩 값의 거리를 반영해주므로써,
유사 문장은 두 벡터의 거리가 가깝도록,
비-유사 문장은 두 벡터의 거리가 멀어지도록 Loss 펑션을 통해 거리를
Feedback해줄수 있도록 (라고 유추) 했기 때문이다728x90'AI 논문 리뷰' 카테고리의 다른 글