논문 정보
- 링크 : https://arxiv.org/abs/1908.10084
- EMNLP 2019
Introduction
- BERT 네트워크에 siamese, triplet 구조를 적용했다.
- 이로 인해 기존의 BERT가 하지 못했던 large-scale의 similarity comparison, clustering, information retrieval 등을 할 수 있다.
- BERT로 유사한 두 문장을 찾으려면 두 개의 문장을 한 개의 BERT 모델에 넣어야 유사도가 평가된다.
- 따라서 문장이 10000개 있으면 10000 * 9999 / 2 번의 연산 후에야 랭킹을 할 수 있다.
- Clustering이나 search에서는 각 문장을 벡터 공간에 매핑하는 작업을 보통 쓰며, BERT를 이용할 때는 출력을 평균내거나 [CLS] 토큰의 출력값을 이용한다.
- 하지만 이랬을 때의 결과는 각 단어의 GloVe 벡터를 평균낸 것보다 좋지 않다.
- 이에 siamese 네트워크로 문장을 벡터화할 수 있는 SBERT를 제안한다.
- SBERT를 NLI 데이터로 fine-tuning 했다.
Model
- BERT에서 fixed-size sentence embedding을 얻기 위해 풀링을 사용한다.
- 방법은 총 3가지이며, [CLS]토큰 값 이용, 평균, max-over-time이 있다.
- SNLI 데이터로 fine-tuning할 때의 구조는 위와 같다.
- 두 문장의 출력값인 u, v 그리고 element-wise 차이값인 |u-v|를 concatenate한 후 파라미터를 추가하여 학습한다.
- 실제 inference할 때나, regression 방식의 loss function을 쓸 때는 cosine-similarity를 이용한다. Training할 때, 계산된 cosine similarity와 gold label 간의 MSE를 minimize하는 방식으로 학습했다.
참고 코드 링크
- SNLI, MNLI 데이터를 이용하여 학습(fine-tuning)했다.
Evalution - Semantic Textual Similarity
- 모델의 성능은 STS(Semantic Textual Similarity) task를 통해 평가했다.
- 그리고 두 문장의 유사도를 계산하기 위해 cosine-similarity를 이용했다.
- Unsupervised STS
- STS 데이터로는 학습하지 않는 상태의 SBERT의 성능을 평가했다.
- 실험 결과는 cosine-similarity와 label 간의 Spearman's rank를 사용했다.

- BERT의 출력을 썼을 때 결과가 안 좋았다.
- Siamese 네트워크를 쓰니 결과가 좋아졌다.
- RoBERTa 구조는 큰 차이가 없었다.
- Supervised STS
- SBERT에 사용한 학습 방법은 두가지이다. 하나는 원래 BERT를 STS 학습 데이터에 학습한 경우, 다른 하나는 NLI로 학습한 이후 STS 학습 데이터로 학습한 경우

- STS 데이터셋의 학습용 데이터를 이용해 SBERT 모델을 학습시켰다.
- 이 때는, regression 형태의 모델 구조, loss function을 사용했다.
- SBERT도 성능이 좋아졌지만, BERT의 성능이 가장 많이 좋아졌다(여기서 BERT는 문장 두개를 입력으로 사용한 것 같다).
- 그래서 성능만을 봤을 때는, 굳이 SBERT 구조를 사용할 필요가 없는 것 같다...?
- 기여한 점이라면 단지 NLI 데이터로 먼저 학습하면 STS의 결과가 좋아진다 정도?
- 그런데 이건 거의 당연한 거 아닌가?
- 4.3, 4.4 생략
- STS 데이터로는 학습하지 않는 상태의 SBERT의 성능을 평가했다.
- 실험 결과는 cosine-similarity와 label 간의 Spearman's rank를 사용했다.
- BERT의 출력을 썼을 때 결과가 안 좋았다.
- Siamese 네트워크를 쓰니 결과가 좋아졌다.
- RoBERTa 구조는 큰 차이가 없었다.
- STS 데이터셋의 학습용 데이터를 이용해 SBERT 모델을 학습시켰다.
- 이 때는, regression 형태의 모델 구조, loss function을 사용했다.
- SBERT도 성능이 좋아졌지만, BERT의 성능이 가장 많이 좋아졌다(여기서 BERT는 문장 두개를 입력으로 사용한 것 같다).
- 그래서 성능만을 봤을 때는, 굳이 SBERT 구조를 사용할 필요가 없는 것 같다...?
- 기여한 점이라면 단지 NLI 데이터로 먼저 학습하면 STS의 결과가 좋아진다 정도?
- 그런데 이건 거의 당연한 거 아닌가?
- 4.3, 4.4 생략
Evaluation - SentEval
Conclusion
- BERT로 STS를 했을 경우 성능이 좋지 않았다고 한다.
- 그래서 siamese 구조를 이용하여 fine-tuning할 수 있는 SBERT를 제안했고, significant한 성능 향상이 있었다.
- 그리고 computationally efficient하며, BERT로 하기 힘들었던 clustering, retrieval 등을 할 수 있게 됐다.
"각 문장에 대한 BERT의 출력을 각각 pooling(avg)해서 layer를 하나 추가하고 NLI로 fine-tuning하면 sentence embedding이 좋아진다." 이다.