brunch

You can make anything
by writing

C.S.Lewis

by 조승혁 Aug 04. 2020

RoBERTa

BERT를 제대로 학습하는 방법

자연어 처리(Natural Language Processing)는 이전부터 많이 연구되어 온 분야이다. 번역부터 시작해서 글 요약, 문장의 감정 분석 등 일상생활에서 볼 수 있는 많은 문제들이 자연어 처리에 해당된다. 이러한 자연어 처리는 구글이 2018년도에 발표한 BERT를 기점으로 급격하게 발전하기 시작했다. BERT는 기존의 자연어 처리 문제들에서 SOTA(State-of-the-Art)를 달성했고, 비교적 간단한 fine-tuning을 통해 다양한 자연어 처리 문제들에 빠르게 적용(task-agnostic)할 수 있다는 장점이 있다. 그래서 이후의 연구들(RoBERTa, XLM 등)은 대부분 BERT 또는 BERT에 사용된 transformer의 응용이다. BERT와 관련된 정보들은 구글링 해보면 쉽게 찾을 수 있다. 당장 brunch에서도 BERT를 소개한 글을 찾아볼 수 있다. 


하지만 처음 발표된 BERT와 BERT를 활용한 모델들에서 hyper parameter들에 대한 실험이 제대로 진행되지 않았다. 이는 BERT의 학습 시간이 길어, hyper parameter들을 하나하나 조정하면서 실험하는 것이 힘들기 때문이다. 그리고 공개되지 않은 데이터들을 사용한 실험들도 있었기 때문에, 후속 연구들은 각 hyper parameter들의 영향력을 아는 것이 어려웠다. 그래서 Facebook AI 팀에서는 기존의 BERT 모델을 유지하면서, 학습 단계의 hyper paramter들을 조정하여 성능을 높이는 방법인 RoBERTa(Robustly Optimized BERT Pretraining approach)를 공개하였다. 


RoBERTa

RoBERTa는 pre-training 단계의 hyper paramter들을 바꿔가면서 실험을 진행하였다. BERT를 학습하면서 지나치기 쉬운 사실들을 되짚어 주는 것이 주목적이라고 볼 수 있다. 그래서 RoBERTa에서 진행한 실험들은 hyper parameter 변경 후 성능 확인을 반복하는 간단한 실험들 밖에 없다. 그래서 이 글에서는 RoBERTa가 어떤 hyper parameter들을 진행했는지 살펴볼 것이다. 그리고 자세한 실험 결과들은 논문에 다 나와있어, 간단한 분석만 진행할 것이다.


Dynamic Masking 기존의 BERT가 pre-training에 사용한 MLM(Masked Language Model)은 무작위로 token에 mask를 씌워, 그것을 예측하는 방식이다. BERT에서는 이 mask를 학습을 시작하기 전에 씌운다. 즉, 매 학습 단계에서 똑같은 mask를 보게 된다(static masking). 물론 같은 문장을 10번 복사한 뒤 mask를 씌움으로써 해결하려고 하였다. 하지만 이는 크기가 큰 데이터에 대해서는 비효율적이다. 가뜩이나 데이터가 많은데, 10배로 늘리면 메모리가 미어터질 것이다. 그래서 RoBERTa에서는 매 epoch마다 mask를 새로 씌우는 dynamic masking을 사용하였다. 매번 masking을 새로 하니 학습 시간은 늘어나지만, 메모리를 아낄 수 있다. 그리고 실제 실험 결과, static masking보다 좋은 성능을 보여줬다. 


Input Format / NSP 기존의 BERT에서는 두 개의 문장을 이어 붙여 input을 만들었다. 그리고 두 문장이 문맥상으로 연결된 문장인지 판단하는 NSP(Next Sentence Prediction)를 pre-training 과정에서 사용하였다. RoBERTa는 이 NSP에 의문을 제기하여, NSP 없이 MLM만으로 pre-training을 하였다. 그리고 NSP를 없앰에 따라, 꼭 두 문장을 이어 붙인 형태의 input을 사용할 필요가 없어졌다. 그래서 RoBERTa는 token 수가 512를 넘어가지 않는 선에서 문장을 최대한 이어 붙여서 input을 만들었다. BERT에서는 아무 두 문장을 연결하기 때문에 엄청 짧은 input도 등장하지만, RoBERTa는 모든 input들의 token수가 512에 가깝다고 볼 수 있다. 실험 결과, NSP를 없앤 BERT가 기존의 BERT보다 더 나은 성능을 보였다.


Batch Size RoBERTa는 batch size의 영향력을 확인하기 위한 실험을 진행하였다. 전체 step 수가 유지되도록 batch size와 epoch 수를 조정하면서 실험을 진행하였다. 예를 들어 batch size 256에 epoch가 1M였으면, batch size 2K에 epoch가 125K가 되도록 실험하였다(둘의 곱이 비슷하게 유지). 실험 결과, 같은 step 수여도 batch size가 클수록 성능이 좋았다. 물론 완전한 비례관계는 아니었지만, 그래도 크면 클수록 성능이 좋아지는 경향을 보였다. 그리고 batch size가 크면 parallelize에 유리하기 때문에, 여러모로 이점이 많다고 설명하였다.


Tokenizer BERT는 데이터 전처리(Devlin et al., 2019) 이후에 30K 크기의 character-level BPE tokenizer를 사용한다. 하지만 RoBERTa는 전처리 없이, 50K 크기의 byte-level BPE tokenizer를 사용한다. 이는 GPT-2에서 사용한 tokenizer와 동일하다. Tokenizer를 선택하긴 했지만, 이와 관련된 실험들은 진행하지 않았다. 이전 연구 결과들에서 이 두 tokenizer 사이에 큰 성능 차이가 보이지 않았다고 말하며, 아마 후자가 더 좋을 것 같다고 하면서 선택했다고 논문에서 밝혔다.


Data Baevski et al. (2019)에 의하면, 데이터 크기가 클수록 성능이 좋아진다. 그래서 RoBERTa는 최대한 데이터를 많이 모으는 것에 집중하였다. 결과적으로 BookCorpus, English Wikipedia, CC-News, OpenWebText, Stories 총 5개의 데이터셋을 합쳐, 총 160GB의 데이터를 완성하였다. 그리고 16GB의 데이터로 pre-train 한 BERT-large보다 나은 성능을 보여줬다. 추가로 학습 시간을 길게 하면 길게 할수록, 성능이 올라가는 것을 확인할 수 있었다.


Results

RoBERTa를 정리하면 다음과 같다.

160GB의 데이터

Dynamic masking

MLM만으로 pre-train

Full-sentence 형식의 input

BERT의 약 32배의 batch size

byte-level BPE tokenizer


각각의 항목에 대해서는 BERT와 비교하여 더 나은 성능을 보여준다는 것을 실험을 통해 보여줬다. 그렇다면 이들을 모두 합쳐도 좋은 성능을 보여줄까? RoBERTa는 위의 방식들을 모두 사용한 모델을 pre-train 한 후, 자연어 처리에서 자주 사용하는 세 개의 데이터(GLuE, SQuAD, RACE)를 가지고 실험을 진행하였다.


GLUE 9개의 sub task를 가지고 있는 GLUE는, 일반적으로 multi-task finetuning을 진행한다. 즉, 9개의 sub task들에 대한 loss들을 linear combination 하여, 이를 optimize 하는 방향으로 학습한다. 하지만 RoBERTa는 각각의 task에 대해서 single-task fine tuning을 진행하였다. 그럼에도 불구하고 4개의 sub task에서 SOTA를 달성하였다. 논문에서는 이를 두고, multi-task finetuning를 했으면 더 좋은 결과를 냈을 것이라고 말했다.


SQuAD Data augmentation이 없는 데이터에 대해서는 RoBERTa가 SOTA를 달성하였다. Augmentation을 한 상태에서의 실험은 하지 않았지만, 아마 비슷한 결과를 보일 것이라고 정신 승리(?)하는 모습을 보여줬다.


RACE 다른 모델들과 똑같이 finetune 하였다. 그리고 RACE의 중학교, 고등학교 데이터 모두에서 RoBERTa가 SOTA를 달성하였다.



This raises questions about the relative importance of model architecture and pretraining objective, compared to more mundane details like dataset size and training time

위 글귀는 RoBERTa 논문에서 인용한 문구다. 아마 RoBERTa가 궁극적으로 말하고자 한 바가 아닐까 싶다. RoBERTa는 여러 실험들을 통해 무작정 모델을 수정하는 것이 아닌, 간과하기 쉬운 데이터 크기, 학습 시간들을 먼저 살펴보는 것도 좋은 방법이라는 것을 보여줬다. 즉, 간과하기 쉬운 부분들을 되짚어주며 모델을 제대로 학습하는 방법을 제시한 것이 RoBERTa라고 생각한다.

작가의 이전글 MobileBERT
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari