NLP

RoBERT [A Robustly Optimized BERT Pretraining Approach] - 논문리뷰

김다응 2022. 8. 1. 13:49
728x90

RoBERT

BERT 는 학습 시간이 길어 hyper param 들을 하나하나 조정하며 실험을 하는 것이 어려움
기존의 BERT 를 유지하면서 각 학습 단계의 hyper param 을 조정하여 성능을 높임

 

BERT 와의 비교

BERT 는 Under fit 되어 있음 (설계)
여러가지 tuning 을 진행

  • 더 큰 batch 와 data 를 가지고 학습
  • NSP loss 제거
  • longer seq
  • Dynamic Masking 적용

 

Static 과 Dynamic Masking 의 비교
  • Original BERT : mask 한 번 수행 후 고정
  • Dynamic Masking
    기존에 bert 는 매 학습 단계에서 똑같은 mask 를 보게 되는 것을 (static masking) 같은 문장을 10번 복사한 뒤 mask 를 씌워 해결하려고 함 (data set x 10 , 4epoch, 4 * 10 = 40 epoch)
    original BERT 에서와 다르게 매 epoch 마다 mask 를 새로 씌우는 dynamic masking 을 수행 (메모리 절약)
    Dynamic masking 을 하였을 때 성능이 기존과 유사하거나 조금 더 좋았음

 

NSP loss
  • Segment-pair + NSP
    segment 는 다수의 문장을 포함하고 512 token 이하로 이루어짐
  • Sentence-pari + NSP
    하나의 문서에서 쪼개진 인접한 문장으로 구성됨. 512 token 보다 작으나 batch 를 키워 segment 와 비슷한 크기 유지
  • FULL-SENTENCES
    경계를 넘는 경우에도 계속 탐색(문단이 끝이 나면 다음 문단도 계속 탐색) 512 token 이하의 연속된 전체 문장으로 구성됨
    NSP 파라미터 제거
  • DOC-SENTENCES
    다른 문서의 경게를 넘지 않음 (batch size 를 키워 FULL-SENTENCE 와 비슷한 크기로 유지)

 

 

doc sentences > full sentences > segment > sentence 순으로 정확도가 높음

segment > sentence 인 이유는 다수 문장이 long range dependency 를 학습할 수 있기 때문
결과를 보면 NSP 를 제거한 쪽이 성능이 더 좋음

기존의 BERT 에서는 두개의 문장을 이어 붙여 input 을 만들었음 (두 문장이 문맥상으로 연결된 문장인지 판단하는 NSP 를 pre training 과정에 사용)
NSP 를 없애고 MLM 만으로 pre-training 을 진행
(두 문장을 이어 붙일 필요가 없어졌기에 input token 의 길이를 늘일 수 있었음)
token 의 수가 512 를 넘어가지 않는 선에서 문장을 최대한 이어붙여 input 생성

 

 

Training with large batches
  • large batches (parallelize 에 유리)
    optimization speed 향상
    end-task performance 향상
  • batch를 늘리고 warming up 과 같이 작은 학습률로 훈련을 시작해서 점점 커지는 방식을 사용하면 매우 큰 배치 크기를 사용할 수 있음

parallelize 시 mini batch 를 사용하면 계산시 오류가 있을 수 있음 (batch 별로 loss 계산 후 평균을 내는 과정에서 오류가 발생할 수도 있을 것이라고 생각함(컴퓨터이기 때문에 어쩔 수 없이 발생하는 오류이거나)) 따라서 batch 사이즈가 클수록 오류가 줄어들 수도 있겠다 라고 생각하였음

배치 사이즈가 클때에 학습 초반에는 불안정할 수 있음

 

 

Text Encoding
  • BPE 를 사용 (Byte-Pair Encoding)
    기존의 BERT는 Word Piece token 을 사용함
  • GPT-2 와 동일하게 진행
    전처리를 수행하지 않고 BPE 를 사용

자주 등장한 char 를 token 으로 인식하는것은 둘다 동일

BPE 는 빈도수를 기반으로 잡고 word piece 는 likelihood (각 단어가 따로 등장한 것을 분모로 분자로는 같이 등장한 빈도수를 잡음) 를 기반으로 병합을 진행 (주변 단어와의 분리를 통해 어떠한 언어든 성능이 좋도록 함)

이 부분은 word piece 를 사용한 후 BPE 를 적용하는 것이 더 좋지 않을까 라는 생각이 듬

 

 

larger Data

데이터 크기가 클 수록, 학습 시간이 길어질 수록 성능 개선