본문 바로가기

deeplearning

Sentence-BERT: Sentence Embedding using Siamese BERT-Networks

Sentence-BERT: Sentence Embedding using Siamese BERT-Networks

(Nils Reimers & Iryna Gurevych, EMNLP 2019)  

 

 

Introduction

 

Sentence-BERT(SBERT)는 siamese와 triplet 네트워크를 활용해 BERT를 변경한 것이며, 이를 통해 semantically meaningful sentence embedding이 가능해진다. 따라서 기존 BERT로하기 어려운 NLP task인 large-scale semantic similarity comparison, clustering 등도 해낼 수 있다.

 

물론 BERT가 Sentence Classification이나 sentence pair regression task에서 새로운 SOTA를 달성하긴 했지만 문제가 있다.

 

기존 BERT의 문제점:

1) BERT를 활용해 Pair Regression Task 진행 시 두 문장을 [SEP]로 나눠 하나의 인풋으로 넣고 두 문장의 similarity를 추론한다. 이를 10000개의 문장에 대해 진행하면 추론을 49,995,000번 해야한다. 이렇게 하면 성능은 높지만 V100 GPU로 65시간이 걸린다. 

 

2) 위처럼 두 문장을 묶어 하나의 인풋으로 넣지않고, 각 단일 문장을 벡터 공간으로 매핑(BERT의 토큰 벡터들의 평균 or CLS 토큰 벡터) 해놓고 유사도나 거리를 구하는 방법을 사용하기도 한다. 하지만 이런 방법들은 빠르기는 하지만 GloVe임베딩에 평균을 취하는 것보다 낮은 성능을 보일 때도 많았다(내가 과거에 했던 연구에서도 상호참조해결 테스크에 대한 모델 성능 향상을 위해 문단들의 Semantic Similarity를 계산해 활용했는데, Doc2Vec으로 얻은 문서 임베딩으로 계산한 값을 활용한 것이 BERT의 [CLS]토큰이나 토큰들의 평균으로 계산한 값을 활용한 것보다 성능이 좋았다.).

 

이렇게 BERT가 특정 테스크에서 보이는 문제점들을 줄여보고자 SBERT를 제안한다.

SBERT의 경우 Siamese 네트워크를 활용하여 입력 문장에 대한 고정된 크기의 벡터를 반환하며, 코사인 유사도나 맨하탄/유클리디안 거리 등을 활용해 의미적으로 유사한 문장들을 찾아낼 수 있다. 또한, BERT가 10000개 문장에서 가장 유사한 문장 pair를 찾는 데 65시간이 걸린 반면, SBERT는 5초가 걸렸다.

 

 

 

Related Work

 

BERT는 [SEP]토큰으로 두 문장을 구분한 뒤 입력으로 사용해 Sentence Pair Regression Task에서 SOTA를 달성했다. 하지만 BERT의 경우 독립된 단일 문장의 임베딩을 계산하지 못한다는 문제점이 있다. 따라서 단일 문장을 모델에 넣고 평균을 취하거나 CLS토큰 값을 이용하는 경우가 많다. 하지만 이 방식이 제대로된 문장 임베딩 방식인가에 대한 연구는 아직 미흡하다.

 

 

 

Model

 

 

 

 

SBERT는 이미 사전학습(pretrain)된 BERT/RoBERTa를 활용하되 위 figure들과 같이 Siamese / Triplet Network를 추가한다. 

Pooling의 경우 3가지 방식이 존재하며 아래와 같다 (이 논문에서는 default로 Mean을 활용한다):

 

    1. CLS: Output of CLS token

    2.  MEAN: Mean of all output vectors

    3. MAX: Max-over-time of the output vectors

 

 

 

Classification Objective

우선, Figure 1의 경우 Classification Task에 대한 모델의 구조이다. 

문장 임베딩인 u, v와 이 둘의 차이인 |u-v|를 concat하고 가중치를 곱하고 softmax를 취한 뒤 분류가 가능하도록 cross-entropy loss를 계산해 학습한다.

 

 

 

 

Regression Objective

Figure 2의 경우 Regression Task를 위한 모델구조이다. 두 문장의 임베딩인 u와 v의 코사인 유사도를 계산한 뒤 MSE loss를 계산하며 학습한다.

 

 

 

 

Triplet Objective

Anchor Sentence (a)

Positive Sentence (p)

Negative Sentence (n)

이 주어졌을 때 Triplet Loss는 a와 p 사이의 거리는 가깝게하고 a와 n의 거리는 멀게 해준다.

(본 논문에서 ϵ = 1, Metric = Euclidean Distance)

 

 

 

 

 

 

Training Details

 

SNLI (Bowman et al., 2015)와 MNLI (Williams et al., 2018) 데이터셋을 조합하여 SBERT에 대한 일차적 Fine-Tuning을 진행한다.

두 데이터셋은 모두 Sentence Pair의 관계를 Contradiction / Entailment / Neutral 중 하나로 분류하는 테스크이다.

 

 

 

 

Evaluation

 

 

Unsupervised STS

STS (Semantic Textual Similarity)에 대한 SBERT의 성능을 측정했으며 관련 데이터셋으로 모델을 학습하지 않고 우선 진행했다.

데이터셋은 모두 0~5 사이의 값을 레이블로 가지며 이는 sentence pair의 의미적 상관성(유사도)을 나타낸다. 

각 모델로 부터 얻은 Sentence Embedding으로 구한 cosine similarity와 gold label간의 correlation을 Spearman's Rank Correlation으로 확인했으며 그 결과는 아래 테이블과 같다.

그 결과, BERT의 CLS나 Average of BERT Embedding의 경우 InferSent-Glove 보다도 성능이 낮다는 것을 알 수 있었다.

그리고 Siamese 네트워크 구조를 추가하고 NLI 데이터로 학습을 한 번 진행한 SBERT 와 SRoBERTa의 성능이 일반적으로 유의미하게 높았다.

 

Supervised STS

STS benchmark인 STSb에서 제공되는 데이터셋을 활용해 학습을 진행하고 다시 실험을 진행하였다.

두 가지 버전이 있는데, STSb로만 학습한 버전과 NLI를 학습하고 STSb를 학습한 버전이 있다.

Regression Obejective Function(코사인 유사도)을 사용해 SBERT를 Fine-Tuing했으며 그 결과는 아래와 같다.

 

 

NLI를 학습한 경우가 조금 더 높은 경향을 보였으며 이는 BERT cross encoder를 활용할 때 그 상승 폭이 높았다.

 

 

SentEval

추가적으로 문장 임베딩의 퀄리티를 확인해보기 위해 SentEval을 진행해보았다.

단일 문장의 Embedding이 logistic regression classifier의 feature로서 사용되어 SentEval에 포함되는 다양한 테스크들에 대해 실험이 진행됐다. 그 결과는 아래 테이블과 같다.

 

 

물론 이 Sentence BERT 연구가 전이학습 방식을 제안하는게 목적은 아니지만, 결과적으로는 NLI로 학습을 한 SBERT로 Sentence Embedding을 계산한 것이 SOTA에 준하는 성능(5 out of 7)을 보여줬다.

 

BERT의 [CLS]나 Average of Embedding을 활용하는 Sentence Embedding을 하고 이에 cosine similarity나 Manhatten / Euclidean Distance를 적용하는 것은 좋은 성능을 보여주지 못했다.