2020년 9월 28일 월요일

논문 설명 - Sentence-BERT : Sentence Embeddings using Siamese BERT-Networks

 

논문 정보


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를 이용했다.

  1. Unsupervised STS
    • STS 데이터로는 학습하지 않는 상태의 SBERT의 성능을 평가했다.
    • 실험 결과는 cosine-similarity와 label 간의 Spearman's rank를 사용했다.
    • BERT의 출력을 썼을 때 결과가 안 좋았다.
    • Siamese 네트워크를 쓰니 결과가 좋아졌다.
    • RoBERTa 구조는 큰 차이가 없었다.
  2. Supervised STS
  3. SBERT에 사용한 학습 방법은 두가지이다. 하나는 원래 BERT를 STS 학습 데이터에 학습한 경우, 다른 하나는 NLI로 학습한 이후 STS 학습 데이터로 학습한 경우
    • STS 데이터셋의 학습용 데이터를 이용해 SBERT 모델을 학습시켰다.
    • 이 때는, regression 형태의 모델 구조, loss function을 사용했다.
    • SBERT도 성능이 좋아졌지만, BERT의 성능이 가장 많이 좋아졌다(여기서 BERT는 문장 두개를 입력으로 사용한 것 같다).
    • 그래서 성능만을 봤을 때는, 굳이 SBERT 구조를 사용할 필요가 없는 것 같다...?
    • 기여한 점이라면 단지 NLI 데이터로 먼저 학습하면 STS의 결과가 좋아진다 정도?
    • 그런데 이건 거의 당연한 거 아닌가?
    • 4.3, 4.4 생략

Evaluation - SentEval

  • 문장의 embedding을 feature로 하여 logistic regression을 하는 SentEval에 대해서 실험했다.
  • 대체적으로 가장 좋은 성능을 보였다.

Conclusion

  • BERT로 STS를 했을 경우 성능이 좋지 않았다고 한다.
  • 그래서 siamese 구조를 이용하여 fine-tuning할 수 있는 SBERT를 제안했고, significant한 성능 향상이 있었다.
  • 그리고 computationally efficient하며, BERT로 하기 힘들었던 clustering, retrieval 등을 할 수 있게 됐다.

"각 문장에 대한 BERT의 출력을 각각 pooling(avg)해서 layer를 하나 추가하고 NLI로 fine-tuning하면 sentence embedding이 좋아진다." 이다.


2020년 9월 24일 목요일

논문 설명 - RoBERTa : A Robustly Optimized BERT Pretraining Approach



논문 정보

Introduction
  • 이 논문은 BERT에 대한 replication study - 재현 연구 - 의 결과를 정리한 논문입니다.
  • 각 하이퍼 파라미터나 훈련 데이터의 크기 등이 성능에 어떤 영향을 미치는지를 평가했습니다.
  • 아직 BERT는 매우 undertrained 되어 있으며, 성능을 향상시킬 수 있는 법을 제안합니다.
    1. 더 오래, 배치 사이즈를 더 크게, 더 많은 데이터로 학습시킨다.
    2. Next Sentence Prediction loss를 없앤다.
    3. 더 긴 sequence로 학습한다.
    4. Masking을 매 번 바꾼다.
  • 이렇게 학습한 결과, GLUE와 SQuAD에서 더 좋은 성능을 얻었다고 합니다.

Experimental Setup

  1. Implementation
    • 대부분의 하이퍼 파라미터는 original BERT와 같게 했지만, peak learning rate과 warmup step 수를 변경하면서 실험했습니다.
    • 그리고 학습 결과가 Adam의 epsilon term에 굉장히 민감하며, 어떤 경우엔 더 좋은 성능을 얻거나 안정성이 향상됐습니다.
    • 그리고 배치 사이즈를 크게 할 때 beta2를 0.98로 하면 안정성이 늘어났습니다.
    • 또한 short sequence를 섞어서 학습하지 않았습니다.
    • Original BERT는 처음 90%의 학습을 짧은 sequence로 한 후에 긴 sequence로 학습했는데, 이와는 다르게 처음부터 끝까지 계속 full-length sequence로 학습했습니다.
  2. Data
    • BERT 형식의 모델들은 텍스트 데이터의 양이 많을 때 더 좋은 성능을 보였습니다.
    • 그래서 가능한 많은 데이터를 모으는 데 주력했습니다.
    • 사용한 데이터는 BookCorpus + Wikipedia - Original BERT에 사용된 데이터셋 2개, CC-News, OpenWebText, Stories로 총 160GB정도 입니다.
  3. Evaluation
    • GLUE, SQuAD, RACE task를 기준으로 평가했습니다.

Training Procedure Analysis

  1. Static vs. Dynamic Masking
    • 기존의 BERT는 preprocessing 단계에서 masking을 수행하여, 학습 단계에서 계속 같은 masking 데이터를 보게 됩니다.
    • 그래서 데이터를 10배로 복제해 매번 다른 masking을 갖도록 보완했습니다. 이 학습은 40 epoch만큼 수행됐습니다(Static masking 방법).
    • 또다른 방법으로 매번 데이터를 학습할 때마다 masking을 다르게 했습니다(Dynamic masking 방법).
    • 실험 결과 Dynamic이 조금... 더 좋다고 불 수 있습니다.
  2. Model Input Format and Next Sentence Prediction
    • 기존 BERT에서는 50%의 확률로 같은 문서에 속하지 않은 2 개의 입력이 들어왔고, 그것을 판별하는 Next Sentence Prediction loss가 있었습니다.
    • 하지만 이 loss의 효과에 대해 의문이 제기되었고,여러 방식으로 실험했습니다.
    • Segment-pair : 기존 BERT와 동일
    • Sentence-pair : segment가 아닌 sentence 단위. Sentence가 segment보다 짧으므로 배치 사이즈를 늘립니다.
    • Full-sentences : 항상 여러 개의 연속된 full sentence들을 입력으로 사용하여 document가 넘어가는 경우도 있습니다. 이 경우 중간에 separator token을 넣는다. 입력 데이터에서 알 수 있듯이 NSP가 없습니다.
    • Doc-sentences : Full-sentences와 거의 동일하지만 document를 넘어가는 경우가 없으며 이 때 입력이 짧아지는 만큼 배치 사이즈를 늘립니다. 역시 NSP가 없습니다.
    • Sentence-pair는 긴 상관관계를 찾지 못해 결과가 나빠진 것으로 보입니다. Full-sentence 결과를 보면 NSP가 없이 연속된 문장으로 학습하는 게 좋아 보입니다. 아마 BERT에서는 두개의 segment를 입력한 상태에서 NSP를 없앤 것 같습니다. 최종적으로 Doc-sentence의 결과가 가장 좋습니다. 하지만 배치 사이즈가 유동적이기에 앞으로 실험은 Full-sentence 방식으로 진행합니다.
  3. Training with large batches
    • 배치 사이즈가 크면 더 좋다(고 하는데, 8k가 2k보다 좋지는 않은 것 같습니다).
  4. Text encoding
    • GPT 방식인 byte 단위 subword vocabulary를 사용하여 BERT를 학습했습니다.
    • 그 결과 vocabulary 사이즈가 30k(BERT)에서 50k로 커졌으며, "unknown" 토큰 없이 인코딩이 가능해졌습니다.
    • 그만큼 파라미터는 15M개 늘어납니다(BERT-base).

RoBERTa
  • 같은 양의 데이터(3G 차이 나긴 하는데...)로 실험했을 때, 배치 사이즈가 커야 성능이 더 좋았습니다.
  • 그 외에, 더 많은 데이터로, 더 오래 학습했을 때 결과가 계속 좋아졌습니다.


끄읕...