AI 공부 기록 블로그

[논문 리뷰] Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks 본문

논문 리뷰

[논문 리뷰] Sentence-BERT: Sentence Embeddings using Siamese BERT-Networks

dhgudxor 2022. 2. 14. 16:29

논문은 2019년에 등장하였으며, sentence embedding을 위해 기존의 BERT 모델에 Siamese network를 사용하여 빠른 연산과 좋은 성능을 이루어낸 논문입니다. 

 

논문의 리뷰는 저의 주관적인 해석과 오역이 있을 수 있습니다. 이에 대해서 댓글 남겨주시면 감사하겠습니다. :)


1. Introduction 

transformer의 인코더 구조를 차용해서 양방향으로 문맥을 학습하는 BERT 모델의 경우 문장 분류, 의미론적 텍스트 유사성 문제에서 좋은 성능을 보입니다. 그러나 pair regression과 같은 문제에서는 입력 문장에 대해 매번 연산을 수행하기 때문에 너무 많은 계산량을 요구합니다. 예를 들어 10,000개 문장의 유사성을 찾기 위해 $n(n-1)/2$ = 49,995,000의 연산량이 필요하며, 이는 V100 GPU에서 대략 65시간이 요구됩니다.  또한 BERT 모델에서는 문장들의 임베딩 값을 얻기 위해 BERT의 아웃풋 레이어에 평균값을 사용하거나, 문장들의 첫 번째 토큰들인 CLS 토큰을 사용하여 임베딩에 사용합니다. 하지만 이는 2014년에 등장한 GloVe를 사용한 문장 임베딩 기법보다 낮은 성능을 보여줍니다. 이러한 문제들을 해결하기 위해 Siamese network 구조를 채택한 SBERT를 제안하였으며, 이는 효율성과 성능 측면에서 좋은 결과를 보여주었습니다. 

 

2. Backgroud Knowledge

Sentence-BERT 모델을 설명하기에 앞서 사전에 알아야 할 Siamese Network에 대해서 말씀드리겠습니다. 

Siamese Network Architecture

Siamese Network는 레이어의 형태도 같고, weight 또한 같은 sub-network를 2개 이상 가진 네트워크를 의미합니다. 위 그림에서 입력으로 두 개의 데이터(Input1, Input2)가 들어오면 서로 같은 weight를 공유하는 레이어를 통과해 각각의 입력에 대한 임베딩 벡터(Embedding1, Embedding2)를 생성하게 됩니다. 이후 L1, L2와 같은 계산 방법을 통해 두 임베딩 벡터들의 거리를 비교하여 같은 클래스에 속하는 입력에 대해 가까워지도록 학습을 하게 됩니다. 이때 subnetwork의 weight 업데이트 또한 동일하게 업데이트됩니다. 기존의 BERT 모델의 경우 sentence pair regression task에서 새로운 입력이 들어왔을 때, 매번 새롭게 학습을 해야 했지만, Siamese Network를 사용함으로써 새로 학습할 필요 없이 빠르게 두 입력을 비교할 수 있습니다.   

3. Model

SBERT의 네트워크 구조는 학습 데이터 셋에 따라 Classification, Regression, Triplet Object Function을 사용할 수 있습니다. 먼저 좌측 그림의 Classification objective function 같은 경우 문장 A와 문장 B가 Siamese network 구조를 갖는 BERT를 통과하고 pooling을 통해 각 문장에 대한 임베딩 벡터 $u$와 $v$를 생성하게 됩니다. 이때 pooling의 방법으로는 BERT output layer의 CLS 토큰, MEAN 방법, MAX 방법을 사용할 수 있는데 성능이 가장 우수했던 MEAN 방법을 사용해서 pooling을 진행합니다. 이후 $u$와 $v$ 그리고 두 임베딩 벡터의 element wise difference한  $|u - v|$를 trainable weight $W_t /in R^{3n * k}$와 곱하고 softmax를 통해 확률값으로 변환해 줍니다. 최종적으로 두 문장의 실제 타겟(SNLI 데이터 셋에서는 Entailment, Neutral, Contradiction)과 비교하여 cross-entropy loss로 weight를 업데이트시켜주게 됩니다. 

다음으로 우측 그림의 Regression objective function의 경우 마찬가지로 Siamese network 구조를 갖는 BERT를 통과하고 pooling을 통해 임베딩 벡터 $u$와 $v$를 생성합니다. 이후 두 임베딩 벡터간의 cosine-similarity를 계산하여 스케일링이 된 실제 두 문장의 유사도(0~5)와 MSE loss를 통해 weight를 업데이트시켜줍니다.

마지막으로 Triplet objective function도 사용이 가능합니다. 중심이 되는 문장 anchor sentence $a$와 일치하는 문장을 positive sentence $p$, 일치하지 않는 문장을 negative sentence $n$이 있을 때 triplet objective function은 $a$와 $p$의 벡터 공간상에 거리가 더 가까워지고, $a$와 $n$은 거리가 멀어지게 학습하는 손실함수입니다. 아래의 수식에서 $s_x$는 각 입력 문장들의 임베딩을 의미하고  $/epslion$의 경우 $s_p$가 $s_n$보다 $s_a$에 가깝게 해주는 margin의 역할을 합니다. 

Triplet Objective Function

 

4. Evaluation - Semantic Textual Similarity 

Pair regression task에 수행되는 학습데이터의 예로 Natural Language Inference (NLI)와 Semantic Textual Similarity (STS)가 있습니다. 전자의 NLI 데이터 셋 같은 경우 두 입력 문장에 대해서 (참, 거짓, 중립)의 관계를 classification하는데 사용되고, 후자의 STS 데이터 셋 같은 경우 두 입력 문장의 유사도를 0~5로 나타내어 regression에서 사용됩니다. 본 논문의 저자들은 STS 데이터 셋을 통해 SBERT의 성능을 평가하였습니다. 

 

NLI 데이터 셋 예시 (좌측) & STS 데이터셋 예시 (우측)

4.1 Unsupervised STS

Unsupervised STS 같은 경우에는 Sentence BERT 모델이 Wikipedia 데이터와 NLI 데이터 셋만 활용하여 사전학습한 모델로 7가지 STS 데이터 셋에 대해 평가를 진행하였습니다. 두 입력 문장의 cosine-similarity 값과 실제 유사도를 스피어만 상관계수를 통해 평가하였으며, 저자가 제안한 Sentence BERT가 좋은 성능을 보였습니다. 여기서 주목해야 할 점은 BERT 출력의 평균과 CLS토큰을 사용한 경우 모든 데이터 셋의 평균 54.81과 29.19으로 2014년에 등장한 Glove 모델보다 낮은 성능을 보입니다. 또한 "SICK-R" 데이터 셋의 경우 Universal Sentence Encoder 모델이 더 좋은 것을 알 수 있는데, 이는 해당 모델이 news, question-answer pages, discussion forums 등 다양한 분야의 데이터를 통해 사전학습을 하였기 때문에 좋은 결과가 나타났다고 합니다. 

 

4.2 Supervised STS

이번에는 STS benchmark 데이터 셋에 대하여 서로 다른 사전학습 방법을 사용해서 모델의 성능을 비교해보았습니다.  앞의 Unsupervised STS 실험에서는 SBERT 모델을 Wikipedia와 NLI 데이터셋을 통해 사전학습을 진행했지만, 이번에는 추가로 STS benchmark 데이터 셋을 사용하여 사전학습, NLI + STS benchmark 데이터 셋을 이용한 사전학습 결과를 비교해 보았습니다. 아래의 표를 통해 STS benchmark 데이터 셋을 사전학습 데이터로 사용하였을 때 성능이 개선되는 것을 알 수 있습니다.

 

(기존 BERT를 통해 사전학습을 진행하고 평가한 결과 SBERT 보다 우수한데, 이 부분에 대한 언급은 없음. 그러나 연산 속도 측면에서 SBERT가 훨씬 유리하리라 판단함)

(4.3, 4.4 생략)

 

5. Evaluation - SentEval

이번에는 sentence embedding을 변수로 사용하여 서로 다른 7개의 task(MR, CR, SUBJ 등)에 대하여 Logistic regression classifier를 실행한 결과를 SentEval(SentEval은 다양한 task에서 모델의 sentence embedding 품질을 평가하는 도구)을 통해 평가한 결과입니다. 아래 표에서 보듯이 SBERT가 대부분의 task에서 우수한 성능이 나타나는 것을 알 수 있습니다.

 

6. Ablation Study

SBERT 모델에 대하여 ablation study를 통해 적합한 pooling 방법과 classification task에서의 concat 방법을 연구하였습니다. 먼저 pooling의 방법으로 NLI와 STSb 데이터에서 Mean을 사용했을 때 가장 성능이 좋은 것을 알 수 있습니다. 또한 Concatenation에 대해서도 element-wise difference, element-wise product 등을 조합하여 비교해보았는데, 문장에 대한 임베딩 벡터 $u$, $v$ 그리고 $|u-v|$의 성능이 가장 좋은 것을 알 수 있습니다.

 

7. Computational Efficiency

마지막 실험에서는 계산의 효율성에 대한 실험을 진행하였습니다. 표의 지표는 높을수록 효율적인 계산을 의미합니다. 또한 smart batching은 길이가 비슷한 문장을 그룹으로 묶고 mini-batch 단계에서 가장 긴 문장으로 패딩을 하여 패딩 토큰으로 인한 계산의 오버헤드를 줄입니다. 비교적 간단한 네트워크 구조를 가진 Glove와 Infersent가 CPU 연산에서 좋은 성능을 보이지만, 트랜스포머의 병렬처리 때문에 GPU 환경에서 SBERT가 더 좋은 연산 성능을 보이고 있습니다. 

 

 

8. Conclusion

본 논문의 저자들은 BERT를 사용한 sentence embedding 방법이 시간도 효율성과 성능 측면에서 부적절함을 지적하고 Simaese network 구조를 사용한 SBERT를 제안하였습니다. SBERT의 경우 다양한 데이터 셋에서 좋은 sentence embedding 방법임을 실험을 통해 보였으며, 효율성 측면에서도 기존의 BERT보다 우수함을 보였습니다.

 

 

 

참고 사이트 : https://tyami.github.io/deep%20learning/Siamese-neural-networks/

참고사이트 : https://data-newbie.tistory.com/465

Comments