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
데이터 크기가 클 수록, 학습 시간이 길어질 수록 성능 개선